多分このようにすることができます:あなたが円の中心と半径を持っていれば、その式(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つあります!
ここで、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の間に角度を追加してください。
その作者の「A1」は角度なので、あなたの斜面はTan(A1) – MBo
ですが、pippoさんに感謝しますが、角度はCP1に相対的です。あなたの解決策は、私はそれがJSコード –
にどのように変換するかを理解することができない限り、機能するかもしれません。角度について申し訳ありません、私は間違っていました。交差点は円に沿って移動するのか、どこかに設定するだけですか? – pippo