プロが教えるわが家の防犯対策術!

∠ABCの場合、3つの座標がどちら報告に回転しているのか判断する方法は無いでしょうか?
座標A、座標B、座標Cで右回りか左回りかを判断したいと思っております。
ご教授をお願いいたします。

A 回答 (4件)

色々書きましたが,結論だけをまとめると,



(Cx - Bx) * (Ay - By) - (Ax - Bx) * (Cy - By)

の符号 (+ or -) が回転方向になるということです.
0ならば A,B,C は一直線上にあります.
    • good
    • 0
この回答へのお礼

noocyteさん

教えていただいた計算式で座標の回転方向を
認識できるようになりました。
とても敏速に回答いただきましてありがとうございます。

お礼日時:2006/10/10 20:01

逆三角関数を使うまでもありません.





│    A
│   /
│  /θ
│ B───C

└──────→X

A=(Ax, Ay), B=(Bx, By), C=(Cx, Cy),

BA = (BAx, BAy) = ベクトル B→A = A - B,
(つまり (BAx, BAy) = (Ax - Bx, Ay - By)),

BC = (BCx, BCy) = ベクトル B→C = C - B = (Cx - Bx, Cy - By)

とします.

2次元ベクトル BC と BA の外積 (クロス積ともいう) は
次のように定義されます.

BC × BA = BCx * BAy - BAx * BCy

この値は,|BC| * |BA| * sinθ に一致します.
(ただしθは B→C から B→A の方向に回転するとき+とします.)

したがって,BC × BA の符号を見れば,右回りか左回りかがわかります.
(ついでに言うと,|BC × BA| は BC,BA を2つの辺とする平行四辺形の面積です.)

このように外積を使えば,2回の乗算だけですむので,
逆三角関数を使う場合に比べて高速かつ計算誤差が少なくなります.
tan-1 を使う場合のように,分母が0になる場合の処理が不要で,
プログラムも簡単になります.

なお,ベクトルの外積は3次元で使われることが多く,
「外積」で検索してもほとんどが3次元の話だと思います.
3次元ベクトル同士の外積は3次元ベクトルになりますが,
2次元ベクトル同士の外積はスカラーになります.
(3次元外積において,元の2つのベクトルがXY平面内にある場合を考えれば,
外積のX,Y成分は0になるので,Z成分だけを考えればよい.
それが2次元の外積となる.)
    • good
    • 0

>(θ1=(atan(ts1)/2π)*360)


間違えました。
x1-x2が正の時
θ1=(atan(ts1)/π)*180
x1-x2が負の時
θ1=(π-(atan(ts1)/π)*180
です。
    • good
    • 0

右回り、左回りというのは線分ABと線分BCの成す角が180°より小さくなるのは右回り、左回りどちらかということですよね?



VB分からないので方法だけ書きます。(Cしかしらない)
A(x1,y1),B(x2,y2),C(x3,y3)
とするとまず線分AB,BCとx軸との成す角(θ)を求める。(tan(θ)を求める)
ts1=tan(θ1)=(x1-x2)/(y1-y2)
ts2=tan(θ2)=(x1-x2)/(y1-y2)
※ここで分子が0になった場合のエラー処理をすること
(x1-x2が0の場合でy1-y2が正の場合θ1=90°,負の場合はθ1=270°)
※TANを求める関数があるはず
ABとx軸の成す角(θ1):atan(ts1)
BCとx軸の成す角(θ2):atan(ts2)
※この値はラジアンで表されているので角度に直す
(θ1=(atan(ts1)/2π)*360)
※ATAN(アークタンジェント)を求める関数があるはず
線分AB、BCの成す角(θ3)は
θ3=θ2-θ1
後はこの値が正の時左回りで負の時が右回りとなる。
(もちろん±180°の時はどちらでもない)

というか自分で書いていてもっと簡単な方法がある気がする。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング