3d矢量 - 如何测试另一个矢量是否反平行

时间:2017-07-19 04:20:57

标签: javascript class vector

如何测试另一个载体是否反平行?

我正在编写一个Codewars kata的解决方案,挑战是为具有3个成员(i,j和k)的3d矢量创建Javascript类。我喜欢挑战,但似乎无法找到一个公式来确定一个向量'没有端点的方向(或者我可以完成)。反平行是一个相反方向的向量,我不断陷入isParallelTo(Vector)方法。 我编写了大部分解决方案(仍然存在isPerpendicularTo(Vector)方法的问题,但是当我到达那里时我会想到它。

上下文的完整代码(并显示我不要求任何人做我的作业; - )):

    // Helper function - Javascript is peculiar with it's floating point no.s
    function rnd(n){
       return Math.round(n * 1000000)/1000000;
    }

    class Vector {
       constructor(i,j,k) {
         this.i = i;
         this.j = j;
         this.k = k;
         this.magnitude = Math.sqrt( this.i*this.i + this.j*this.j + this.k*this.k );
       }

       // Magnitude (distance)
       getMagnitude() { return this.magnitude; }

       // Unit vectors - i
       static getI() { return new Vector(1, 0, 0); }
       // Unit vectors - j
       static getJ() { return new Vector(0, 1, 0); }
       // Unit vectors - i
       static getK() { return new Vector(0, 0, 1); }

       // Add this vector to another
       add(V) { return new Vector(V.i + this.i, V.j + this.j, V.k + this.k); }

       // Scalar multiply
       multiplyByScalar(m) { return new Vector(m * this.i, m * this.j, m * this.k); }

       // Dot product
       dot(V) { return V.i*this.i + V.j*this.j + V.k*this.k; }

       // Cross product
       cross(V) { return new Vector(this.j*V.k - this.k*V.j, this.k*V.i - this.i*V.k, this.i*V.j - this.j*V.i); }

       // Zero vector? (another helper function, vector specific)
       isZeroVector(V) { return V.i === 0 && V.j === 0 && V.k === 0; }

       // Parallel? unit vectors must be equal
       isParallelTo(V) {
          return !this.isZeroVector(V) && !this.isZeroVector(this) && ( Math.abs(rnd(V.i/this.i)) === Math.abs(rnd(V.j/this.j)) ) && (Math.abs(rnd(V.i/this.i)) === Math.abs(rnd(V.k/this.k)));
       }

       // Perpendicular? 
       isPerpendicularTo(V) {
          return !this.isZeroVector(V) && !this.isZeroVector(this) && this.dot(V) === 0;
       }

       // Normalize
       normalize() { return new Vector(this.i/this.magnitude, this.j/this.magnitude, this.k/this.magnitude); }

       // Normalized already?
       isNormalized() { return rnd(this.magnitude) === rnd(1); }
    }

1 个答案:

答案 0 :(得分:2)

好吧,我不会写代码示例,但我可以给你数学。

您似乎将矢量存储为(i,j,k)3元组。这使得(i,j,k)成为你的终点(我假设(0,0,0)是每个向量的起点)。

点积的一个公式是:

a · b = |a| × |b| × cos(θ)

为了获得反平行,你想要θ=τ/ 2,所以cos(τ/ 2)= -1

所以你需要检查的是:

(a · b) / (|a| × |b|) = -1

dot(a, b)/(a.magnitude*b.magnitude) == -1