Skip to main content

ccw

Function ccw 

Source
pub fn ccw(a: Point, b: Point, c: Point) -> isize
Expand description

3点 a, b, c の向きを外積で返します。

正なら反時計回り、負なら時計回り、0 なら一直線上です。計算量は O(1) です。

有向直線 a → b から見て c が左側なら正、右側なら負です。 戻り値は (b - a) × (c - a) そのもので、-1 / 0 / 1 に正規化しません。 絶対値は三角形 abc の面積の2倍です。0 だけでは c が線分上かは 分からないため、線分上の判定には on_segment を使ってください。

use atcoder::geometry::{ccw, Point};
let a = Point::new(0, 0);
let b = Point::new(2, 0);
assert_eq!(ccw(a, b, Point::new(1, 3)), 6);  // 左側(上側)
assert_eq!(ccw(a, b, Point::new(1, -3)), -6); // 右側(下側)
assert_eq!(ccw(a, b, Point::new(3, 0)), 0);  // 直線上だが線分外