2017-07-19 13 views
0

別のベクトルが逆平行であるかどうかをテストするには?3dベクトル - 別のベクトルが逆平行であるかどうかをテストする方法

私は3つのメンバー(i、j、およびk)を持つ3次元ベクトルのJavascriptクラスを作成するという課題をCodewars kataに書いています。私は挑戦するのが好きですが、エンドポイントなしでベクトルの方向を決定する式を見つけることができないようです(または、私はやっています)。反平行は反対方向のベクトルで、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

私はコード例を書くつもりはありませんが、私はあなたに数学を与えることができます。

ベクトルを(i、j、k)3タプルとして保存しているようです。これにより、(i、j、k)がエンドポイントになります(私は(0、0、0)がすべてのベクトルの開始点であると仮定しています)。内積のための公式の

一つがある:あなたがθ=τ/ 2などのcos(τ/ 2)= -1

だから、すべてたく抗平行

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

取得するにはあなたがチェックする必要があることである:私はθ上式で、指摘しなければならない

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

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

は2つのベクトル間の角度です。あなたが逆平行を望むなら、あなたはθ=τ/ 2を必要とするのです。 – Chuck

+1

浮動小数点数を使用している場合、正確に-1にならないことがあります。代わりにMath.abs(dot(a、b)/(a.magnitude * b.magnitude) - 1)<εを試してみてください。ここで、εは本当に小さな値です。 – Chuck

関連する問題