2016-04-30 4 views
1

半径と距離を与えられた円上の点のX/Y位置を計算する方法は分かりました。それは私が計算する必要はありません。私は中心にない点に基づいて円弧上の点を計算する必要があります

X/Y位置を1つの円上で計算する必要がありますが、その円の中心ではない点と角度に基づいて計算する必要があります。

既知の値は、次のとおり

  • X/Yは、円の中心の座標。
  • 円の半径。
  • 2番目の点のX/Y座標、および既知の角度の中心点。
  • 第2ポイントからの角度。

私がやっていることは、メーター表示のために曲線を描いて線を計算することです。ラインはメーターの針と平行にする必要がありますが、ピボットポイントはスケールの円弧の半径ポイントと同じでない場合があります。

これはJavascriptである必要があり、HTML5キャンバスオブジェクトの描画に使用されます。図面を参照し

Calc Arcs http://www.sloansweb.com/dl_files/temp/CalcArcs.png

、CP1は常にCP2の円の内側の半径内になります。ここでは

は私が探しているものを説明するためのイメージです。

EDIT:図面を更新して簡略化し、CP2の周りに1つの円を表示しました。 CP2に対する交点までの角度は不明であることに注意してください。また、CP1に対する交差点までの距離は不明である。

ありがとうございます!

答えて

1

多分このようにすることができます:あなたが円の中心と半径を持っていれば、その式(Cr(x))を書くことができます。あなたがCP2とA1_angleだけを持っているならば、角係数= A1_angleを持つCP2から始まる線の方程式を書くことができます。幾何学的には、 "Crossing Point 1"と "Crossing Point 2"線方程式またはCr(x)で座標を求める。
もっと曖昧にして:
1)Cr(x) := (x-CP2.x)^2+(y-CP2.y)^2=radius1^2 x、y、変数、CP2.x、CP2.yはCP2のx座標とy座標です。
2)次に、CP1で始まり、傾き= A1の次の行の機能を調べる必要があります。b = CP1.y-tan(A1)*CP1.x
3)これらの2つの関数を傍受していくつの点を見つけるか彼らは共通して(2つ以上!):
{ Cr(x) AND y=tan(A1)*x+b }。ここであなたはy変数を代入する必要があります(この方法はx変数を代入するよりも簡単ですと思います...)あなたが選んだ方程式は0に等しくなります。
((x-CP2.x)^2+(tan(A1)*x+b-CP2.y)^2 - radius1^2=0
権利をお持ちの場合は、最後の2ポイント(ラインが2度円を傍受するため)、何も権利を選択して必要なことをするだけでは何も言えません。
2番目の円でradius2と同じことが起こります。半径2の円のCr(x)関数を取得するだけです(線は同じままです!)と座標を見つける:)
私はそれがキャンバスを描くために必要なものよりも数学的に、そして多分複雑な方法だと知っていますが、これは私の頭に最初に入ったものです。
希望私ははっきりしていた:)

EDIT:
は、それが正しく動作願って、あなたのjavascriptのコードでこれを試してみてください:

function GetPoints(Center_x, Center_y, Radius, CP1_x, CP1_y, angle){ 
    var a=Center_x; 
    var b=Center_y; 
    var c=CP1_x; 
    var d=CP1_y; 
    var TAN=Math.tan((2*Math.PI*angle)/360); 

    var res_x= []; 
    var res_y= []; 

    if(angle!=90 && angle!=180 && angle!=270 && angle!=360){ 
    res_x[0]= ((2*TAN*TAN*c+2*b*TAN-2*d*TAN+2*a) + 
      Math.sqrt( 
       -2*c*TAN*TAN-2*b*TAN+2*d*TAN-2*a - (4*TAN*TAN + 4)*(c*c*TAN*TAN-2*c*d*TAN+2*c*b*TAN-2*d*b+d*d+b*b-Radius*Radius+a*a) 
       ) 
      )/(2*TAN*TAN+2); 

    res_x[1]= ((2*TAN*TAN*c+2*b*TAN-2*d*TAN+2*a) - 
      Math.sqrt( 
       -2*c*TAN*TAN-2*b*TAN+2*d*TAN-2*a - 4*(TAN*TAN + 1)*(c*c*TAN*TAN-2*c*d*TAN+2*c*b*TAN-2*d*b+d*d+b*b-Radius*Radius+a*a) 
       ) 
      )/(2*TAN*TAN+2); 

    res_y[0]= TAN*res_x[0]+d-TAN*c; 
    res_y[1]= TAN*res_x[1]+d-TAN*c; 

} 
else{ 
    res_y[0]= b + 
    Math.sqrt(
     -c*c+2*c*a-a*a+Radius*Radius 
     ); 

    res_y[1]= b - 
    Math.sqrt(
     -c*c+2*c*a-a*a+Radius*Radius 
     ); 
    } 
    res_x[0]=res_x[1]=c; 


    console.log("x0= "+res_x[0]+ "\nx1= "+res_x[1]+"\n"); 
    console.log("y0= "+res_y[0]+ "\ny1= "+res_y[1]+"\n"); 


} 


デバッグするときに、これらのconsole.logsが有用である必要があり、私は彼らを去った。
角度は度で、私はgradsへの暗黙的な切り替えを実装しており、(gradsに関して)デフォルトの方法で計算されています。私はあなたのA1の角度がどれくらい変化しているか分かりませんでしたので、私はこの方法をお勧めしましたが、この変更を行うことはそれほど複雑ではないと思います。 res_x []には交差点のx値が格納され、res_y []にはy値が格納されます。私はそれが最終的に私が想定している数学に起因する近似を作ることができることを見ました。もう1つ、あなたが見ることができる関数は例外を処理しません。

2編集:
私は第2の解決策を考え出しました。すべての三角形を知るためには、少なくとも3つのデータが必要です。三角形のABCのデータは既に3つあります! image of the situation

ここで、AとBはどこにあるのか、それらの距離、アルファ角度を知っているので、B(90°+アルファ)のすべての角度とACを知っています。確かに、我々は2つの側面と1つの角度を知っている...おそらく我々は他の何も必要はありません。
理論からは、どのような三角形でも、反対側の角度の罪に対する一方の側は、すべての辺とすべての角度で一定であることがわかります。この場合、AC(半径です)とB_angle(90度に値アルファを加えた値)がわかりますので、AC/sin(alpha+pi/2)BC/sin(A_angle)にもう一度等しいAB/sin(C_angle)に等しくなります。私たちはC_angleとアルファを知っていれば今、私たちは三角形内のすべての3つの角度の合計のでA_angleを計算することができ

AC/sin(alpha+90°)=AB/sin(C_angle) 

ので

sin(C_angle)=AB*sin(alpha+90°)/AC 

C_angle= arcsin (AB*sin(alpha+90°)/AC) 

: は、いくつかの方程式を作ります180°にする。したがって、A_angle = 180°-alpha-C_angleです。 ここでは、すべてのアングルと2つのサイドを知っています。最後の1つについては、上記と同じ式を適用できます。

BC/sin(A_angle)=AC/sin(alpha+90°)=AB/sin(C_angle) 

希望するものを選択してBCを取得します。 は、今、私たちは持っている:

AC=radius; 
AB= known with coordinates; 
BC= retrieved from previous relations 
B_angle= alpha + 90° 
A_angle and C_angle= retrieved from previous relations as for BC. 

我々は今、すべてを知って、特定のBCに。 C点の座標をBから知ることから、
Bから始まり、傾きがtan(alpha)になり、BからCまでの距離を知ると、線(x)次のようにしてCのX/Y座標を取得できます。
C.x= BC*cos(alpha)
C.y= line(x+BC*cos(alpha)) そこに行きます。
私はあなたに提案した他のものよりもはるかに単純なプロセスであり、おそらくJSでコーディングしている方がずっと簡単かもしれません。 これは、B点がAの同じ軸に立つまで動作します。B点を移動する場合、B_angle coudlが大きく変化します.Aを追加する代わりにAとBの間に角度を追加してください。

+0

その作者の「A1」は角度なので、あなたの斜面はTan(A1) – MBo

+0

ですが、pippoさんに感謝しますが、角度はCP1に相対的です。あなたの解決策は、私はそれがJSコード –

+0

にどのように変換するかを理解することができない限り、機能するかもしれません。角度について申し訳ありません、私は間違っていました。交差点は円に沿って移動するのか、どこかに設定するだけですか? – pippo

関連する問題