幾何は外積の符号から
点の位置関係を角度で求める代わりに、ベクトルの外積で左右を判定します。整数座標なら整数演算で扱えます。
言語:Python / 計算量:判定 O(1)
前提:制約から計算量を見積もる
考え方
- A→B と A→C のベクトルを作ります。
- 外積 ux*vy-uy*vx を計算。
- 正なら反時計回り、負なら時計回り、0なら同一直線上。
具体例
A=(0,0),B=(2,0),C=(1,1)。外積は2×1-0×1=2なので、CはA→Bの左側です。
実装
def cross(a,b,c):
ux,uy=b[0]-a[0],b[1]-a[1]
vx,vy=c[0]-a[0],c[1]-a[1]
return ux*vy-uy*vx
print(cross((0,0),(2,0),(1,1)))注意する条件
外積0は同一直線を意味するだけで、線分上にあるとは限りません。座標の範囲判定も必要です。
確認問題
A=(0,0),B=(2,0),C=(1,1)の外積は?
解答と理由
2
(2,0)×(1,1)=2です。
実装課題
3点A,B,Cを各行 x y で入力。Cが有向直線A→Bの左なら Left、右なら Right、直線上なら On。A≠B、座標絶対値≤10^9。
入力:
0 0
2 0
1 1
出力:
Left参考実装
a=tuple(map(int,input().split()));b=tuple(map(int,input().split()));c=tuple(map(int,input().split()))
x=(b[0]-a[0])*(c[1]-a[1])-(b[1]-a[1])*(c[0]-a[0])
print("Left" if x>0 else "Right" if x<0 else "On")