2本の線の交点の鈍角ではなく鋭角が欲しいというあなたの質問を正しく理解していただければ幸いです。私は正しいですか?
交差点の鋭角と鈍角は、互いに180度の補数です。すなわち
acute + obtuse = PI.
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/atan.html
は、atanが+/- pi/2で漸近的であることを示しています。
したがって、勾配の+/-
表記法または正の表記法のどちらを使用する場合でも、atanの2つの結果の最大差は円周率または180度です。0 to pi
次の擬似コードを検討してください。
acuteAngle(m1, m2){
a = atan(m1) - atan(m2);
// if obtuse get the complementary acute angle:
if (a>PI/2)
a = PI - a;
return a;
}
この関数acuteAngle
は、数学的に何をする必要があるかを示しています。
ただし、PI / 2の近傍の角度の値には使用できません。これは、角度とその近傍の結果との2進比較では、鈍角と鋭角のどちらが表されているかが疑わしいためです。
したがって、2本の線の点の座標を比較する必要があります。[(x2,y2)(x3,y3)]
から形成される3番目の線が、仮想の斜辺よりも短いか、等しいか、長いかを調べます。
ピタゴラスの定理により、角度が正確にPI / 2または90度の場合、斜辺が形成されます。彼の架空の斜辺線をL3Hypoと呼びましょう。
あなたの心の中で幾何学的な視覚化によって、
- 3行目がL3Hypoより長い場合、角度は鈍角になります。
- 短い場合、角度は鋭角です。
- そうでなければ、完璧な90。
したがって、
L1.lengthSquared = sq(x2-x1) + sq(y2-y1)
L2.lengthSquared = sq(x3-x1) + sq(y3-y1)
L3Hypo.lengthSquared = L1.lengthSquared + L2.lengthSquared
L3.lengthSquared = sq(x3-x2) + sq(y3-y2)
したがって、次の擬似コード、
struct Point{
double x, y;
}
// no need to struct, for clarity only
struct Line{
double lengthSquared;
}
#define sq(n) (n*n)
int isObtuse(Point P1, P2, P3){
Line L1, L2, L3, L3Hypo;
L1.lengthSquared = sq(P2.x-P1.x) + sq(P2.y-P1.y);
L2.lengthSquared = sq(P3.x-P1.x) + sq(P3.y-P1.y);
L3Hypo.lengthSquared = L1.lengthSquared + L2.lengthSquared;
L3.lengthSquared = sq(P3.x-P2.x) + sq(P3.y-P2.y);
if (L3>L3Hypo) return 1; //obtuse
else if (L3<L3Hypo) return -1; //acute
else return 0;
}
関数getGradient(Point P、Q)がすでにあると仮定します。
double m1m2 = getGradient(P1,P2);
double m1m3 = getGradient(P1,P3);
double a = Abs(atan(m1m2) - atan(m1m3));
if (isObtuse(P1, P2, P3)>0)
a = PI - a;
私は擬似コードでいくつかのタイプミスを犯したかもしれませんが(うまくいけばそうではありません)、概念の要点を示しました。もしそうなら、誰かがタイプミスを編集するのにとても親切かもしれません。
さらに
、しかし、それを熟考した後、私は、精度のための闘争が、指令のためにその最も弱いリンクでピボットすることを発見しました
#define PI 3.14159blah..blah..blah.
したがって、すべてのトラブルを保存して、これを実行する方がよいでしょう。
double m1m2 = getGradient(P1,P2);
double m1m3 = getGradient(P1,P3);
double a = Abs(atan(m1m2) - atan(m1m3));
double b = PI - a;
return min(a, b);//the smaller of the two is the acute