3

[参考][1]としてこれを使用する:円の接点を見つけますか?

cx = 0;
cy = 0;

px = -3;
py = -8;

dx = cx - px;
dy = cy - py;

a = asin(5 / ((dx*dx + dy*dy)^0.5));
b = atan2(dy, dx);

t_1 = deg2rad(180) + b - a;
t_2 = deg2rad(180) + b + a;

点 (7,6) の角度は 7.9572/73.4434 で、(-3, -8) の角度は 213.6264/285.2615 です。したがって、第 1 象限では角度は意味を成しませんが、第 3 象限では意味があります。私が間違っていることは何ですか?

4

4 に答える 4

2

あなたの式aは間違っています。使用する必要があります

a = acos(5 / ((dx*dx + dy*dy)^0.5))

それ以外の

a = asin(5 / ((dx*dx + dy*dy)^0.5))

すなわちacos(...)の代わりに使用しasin(...)ます。理由は下の画像の通りです。角度の式aは ですa=acos(r/H)。ここrで、 は円の半径、 はH直角三角形の斜辺の長さです。asin(...)したがって、これは、渡された値が 2 つの可能な象限のどちらにあるかを知る方法がないという事実とは何の関係もありません。の引数asinは常に正であり、常に 0 ~ 90 度の範囲の答えが必要です。

外部点からの 2 つの接線を持つ円のイメージ

したがって、必要な 2 つの角度の答えはb+ab-aです。acos2 つのケースで代わりに使用するasinと、最初の象限の例では 97.7592 & -16.5566 (または同等の 343.4434) が生成され、3 番目の象限の例では -164.7385 & -56.3736 (または同等の 195.2615 および 303.6264) が生成されます。(注: と の式に 180 度を追加する代わりに、t_1t-2の符号を入れ替えるだけdxでよいdy)

于 2013-06-09T23:14:34.830 に答える
2

最初に-あなたが何をしようとしているのかを理解するのに10分ほど費やしましたが(最終的には、回答の1つのコメントから得ました)、問題の解決には2分かかりました。そのため、今後の参考のために、最初に問題をできるだけ明確に説明してください。

今、私はあなたのサインが台無しになっていると思います。次のことを試してください。

%// difference vector
%// NOTE: these go the other way around for the atan2 to come out right
dx = px - cx;
dy = py - cy;

%// tip angle of the right triangle
a = asin( 5 / sqrt(dx*dx + dy*dy) );
%// angle between the (local) X-axis and the line of interest
b = atan2(dy, dx);
%// the third angle in the right triangle
%// NOTE: minus a here instead of plus b
g = pi/2 - a;

%// Angles of interest
%// NOTE1: signs are flipped; this automatically takes care of overshoots
%// NOTE2: don't forget to mod 360
t_1 = mod( rad2deg(b - g), 360)
t_2 = mod( rad2deg(b + g), 360)

または、代わりに をa使用して、中間角度の計算をスキップできます。acosasin

%// difference vector    
dx = px - cx;
dy = py - cy;

%// Directly compute the third angle of the right triangle 
%// (that is, the angle "at the origin")
g = acos( 5 / sqrt(dx*dx + dy*dy) );
%// angle between the (local) X-axis and the line of interest
b = atan2(dy, dx);

%// Angles of interest
t_1 = mod( rad2deg(b - g), 360)
t_2 = mod( rad2deg(b + g), 360)

三角関数の恒等式 を再発見するもう 1 つの方法acos(x) = pi/2 - asin(x):)

于 2013-06-10T07:20:17.147 に答える
0

この MathWorld エントリが必要です: http://mathworld.wolfram.com/CircleTangentLine.html .

于 2013-06-09T19:35:06.510 に答える
0

よし、asin、atan (任意の a-trig 関数) には、渡された値が 2 つの可能な象限のどちらにあるかを知る方法がないという事実を考慮していないようです。それを補うために、a-trig 関数は、ポイントが第 1 象限または第 4 象限 (北東 / 南東) にあると想定します。したがって、atan 関数を呼び出し、元のポイントが 2 番目または 3 番目の象限にある場合、返される値に 180 度 / pi ラジアンを追加する必要があります。

asin が [-pi/2, pi/2] から値を返すことを示すドキュメントを参照してください: http://www.mathworks.com/help/matlab/ref/asin.html

それが役立つことを願っています:)

編集 私はもともと状況を誤解していました

ここにあなたが計算したと思うものがあります: t_1 と t_2 は、接点から円を開始し、元の開始点に移動したい場合に移動する角度を表します。

この視点で見ると、あなたの角度は正しいです。

点 (7,6) について

あなたが約でサークルを始めた場合。(0,5) 7 度で移動すると、ポイントにヒットします。あなたが約でサークルを始めた場合。(5,0) 70 度で移動すると、ポイントに到達します。

さて、角度よりも便利で混乱が少ないのは、直線の傾きを知ることです。角度からこれを取得するには、角度を度単位で次のようにします。

angle = (angle + 90 + 360) % 180 - 90 // this gives us the angle as it would be in quad 1 or 4
slope = tan( deg2rad( angle ) )
于 2013-06-09T18:45:44.313 に答える