2017-08-25 9 views
0

における二次曲線上の任意の点の接線の傾きを計算しますそうのようなHTML5キャンバス上に二次曲線(ないキュービックベジエ曲線)、curvetoといったの最初の2つのパラメータは、制御点のxとyをは、私はTRIGチャンピオンに行ったことがないと、検索の約4時間後、私はここに依頼することを決めたのJavascript

のmoveToは、最初のポイントのxおよびyを指定
this.shape.moveTo(50,80).curveTo(100,120,40,190); 

指定します、curveToの3番目と4番目のパラメータは、終点のxとyを指定します。

私のようなもの、私はその曲線上の任意の点Tの傾きを取得することができます機能を作る必要があります。

function getTangentSlope(P0,P1,P2,t) { 
    blah blah blah 
    return slope; 
} 

はこれまでのところ、私が見つけた唯一の解決策は、いずれかの立方体のためでした2つのコントロールポイント(Find the tangent of a point on a cubic bezier curve (on an iPhone))を持つ曲線、または表記法(https://www.math.usm.edu/lee/mathphysarchive/?p=542)を理解できなかったか、またはリンクが壊れていて、ソリューション全体(Quadratic Bezier Curve: Calculate Tangent)をレビューできなかったことを意味します。

スロープが度で指定されているのが最良です。

弟が助けてくれますか?

答えて

1

これはで正規化されたタンジェントを返しますコードを掘り後、私は面白いのファイルを見つけました2次および3次曲線の単位位置。

以下のオブジェクトの詳細な使用方法については、this answerを参照してください。

const geom = (()=>{ 

    function Vec(x,y){ 
     this.x = x; 
     this.y = y; 
    }; 
    function Bezier(p1,p2,cp1,cp2){ 
     this.p1 = p1; 
     this.p2 = p2; 
     this.cp1 = cp1; 
     this.cp2 = cp2; 
    }  
    Bezier.prototype = { 
     //====================================================================================== 
     // single dimension polynomials for 2nd (a,b,c) and 3rd (a,b,c,d) order bezier 
     //====================================================================================== 
     // for quadratic f(t) = a(1-t)^2+2b(1-t)t+ct^2 
     //      = a+2(-a+b)t+(a-2b+c)t^2 
     // The derivative f'(t) = 2(1-t)(b-a)+2(c-b)t 
     //====================================================================================== 
     // for cubic   f(t) = a(1-t)^3 + 3bt(1-t)^2 + 3c(1-t)t^2 + dt^3 
     //       = a+(-2a+3b)t+(2a-6b+3c)t^2+(-a+3b-3c+d)t^3 
     // The derivative  f'(t) = -3a(1-t)^2+b(3(1-t)^2-6(1-t)t)+c(6(1-t)t-3t^2) +3dt^2 
     // The 2nd derivative f"(t) = 6(1-t)(c-2b+a)+6t(d-2c+b) 
     //======================================================================================   
     p1 : undefined, 
     p2 : undefined, 
     cp1 : undefined, 
     cp2 : undefined, 
     tangentAsVec (position, vec) { 
      var a, b, c, u; 
      if (vec === undefined) { vec = new Vec(); } 

      if (this.cp2 === undefined) { 
       a = (1-position) * 2; 
       b = position * 2; 
       vec.x = a * (this.cp1.x - this.p1.x) + b * (this.p2.x - this.cp1.x); 
       vec.y = a * (this.cp1.y - this.p1.y) + b * (this.p2.y - this.cp1.y); 
      }else{ 
       a = (1-position) 
       b = 6 * a * position;  // (6*(1-t)*t) 
       a *= 3 * a;     // 3 * (1 - t)^2 
       c = 3 * position * position; // 3 * t^2 
       vec.x = -this.p1.x * a + this.cp1.x * (a - b) + this.cp2.x * (b - c) + this.p2.x * c; 
       vec.y = -this.p1.y * a + this.cp1.y * (a - b) + this.cp2.y * (b - c) + this.p2.y * c; 
      } 
      u = Math.sqrt(vec.x * vec.x + vec.y * vec.y); 
      vec.x /= u; 
      vec.y /= u; 
      return vec;     
     },  
    } 
    return { Vec, Bezier,} 
})() 

// ? represents any value 
    var p1 = new geom.Vec(?,?); // start point 
    var p2 = new geom.Vec(?,?); // end point 
    var cp1 = new geom.Vec(?,?); //control point 

    var bez2 = new geom.Bezier(p1,p2,cp1); // create 2nd order bezier 
    var t = ?; 
    var tangent = bez2.tangentAsVec(t); 

使用ベジェ2次の使用上の3次用

// ? represents any value 
    var p1 = new geom.Vec(?,?); // start point 
    var p2 = new geom.Vec(?,?); // end point 
    var cp1 = new geom.Vec(?,?); // 1st control point 
    var cp2 = new geom.Vec(?,?); // 2nd control point 

    var bez3 = new geom.Bezier(p1,p2,cp1,cp2); // create 3rd order bezier 
    var t = ?; 
    var tangent = bez2.tangentAsVec(t); 
ベジエ
0

うーん、私は、この機能がどのように見えるか分かりませんが、私はあなたが有用な例を見つけることができる場所を知っている:)

いくつかの時間前、私はチャートを描画するためのライブラリを使用していました。この図書館では、線グラフで線を描くための多くの関数が見つかりました。ライブラリはD3と呼ばれます。ここで

https://github.com/d3/d3-shape/tree/master/src/curve 

あなたが得ることができるものの効果を確認できます:

https://github.com/d3/d3-shape#curves 

幸運:)

関連する問題