4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

3点の回転方向を調べる

Last updated at Posted at 2019-05-31

3点 $A,B,C$ が $A → B → C$ の順に動くときの回転方向を調べる。

調べ方

点Aを基点にして、線分ABと線分ACの傾きを比較する。

  • 線分 AB の傾きは $\dfrac{dy1}{dx1}$
  • 線分 AC の傾きは $\dfrac{dy2}{dx2}$

線分 AB の傾きのほうが小さいとき、すなわち、
$\dfrac{dy1}{dx1} < \dfrac{dy2}{dx2}$ のとき 左回り。

線分 AB の傾きのほうが大きいとき、すなわち、
$\dfrac{dy1}{dx1} > \dfrac{dy2}{dx2}$ のとき 右回りとなる。

但し、線分AB又はACがY軸に平行な場合、$dx=0$となり、傾きを定義することができないので比べることができない。

これを避けるために、各傾きに $(dx1 \times dx2)$ を掛けた数値を使って比較する。
  • 線分 AB の傾き $\dfrac{dy1}{dx1} \times (dx1 \times dx2) = dx2 \times dy1$
  • 線分 AC の傾き $\dfrac{dy2}{dx2} \times (dx1 \times dx2) = dx1 \times dy2$

$dx2 \times dy1 < dx1 \times dy2$ ・・・ 左回り(反時計回り)
$dx2 \times dy1 > dx1 \times dy2$ ・・・ 右回り(時計回り)

となる。また、

$dx2 \times dy1 = dx1 \times dy2$ の場合は、

3点は同一直線上の点である。
(3点が同一直線上の点か調べる)

計算例

  1. $A=(2,3), B=(8,5), C=(5,9)$ のとき

$dx2 \times dy1 = 3 \times 2 = 6$
$dx1 \times dy2 = 6 \times 6 = 36$
$dx2 \times dy1 < dx1 \times dy2$ なので左回り(反時計回り)

プログラム

3点が時計回りに配置されているかどうか調べる
( AutoLISP )

(defun point:IsClockwise (a b c)
    (<
        (* (- (car  b) (car  a)) (- (cadr c) (cadr a)))
        (* (- (cadr b) (cadr a)) (- (car  c) (car  a)))
    )
)
;; < Example >
(point:IsClockwise '(2 3) '(8 5) '(5 9))
;; -> nil
(point:IsClockwise '(2 3) '(5 9) '(8 5))
;; -> T

応用

2本の線分の交差判定

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?