CGL_1_C: Counter-Clockwise(続き)
解説を読む
なるほど、直線上にある場合はdotでBACKかどうか、
normでFRONTかどうかを判定するのか
これは短くてすむ
場合分けもいらないし
掛け算の数が多い気がするけど、割り算が不要なのはいいところ?
そういえば今どきのプロセッサだと割り算も遅くなかったりして?
ちょうどいい絵があった
Infographics: Operation Costs in CPU Clock Cycles - IT Hare on Soft.ware
浮動小数点の掛け算が1〜7クロック、割り算が10〜40クロックか
そこそこ遅いんだな
掛け算何回かで済むならそっちのほうが速そう
(符号だけだから必ずしも割り算する必要はないかもしれない)
(まあクロックを数えるくらいならC++使えという話ではある)
こうなるわけですね
これならそんなに見苦しくない
def location(self, seg: 'Segment') -> PointLocation:
p = self - seg.p1
d = seg.vector().cross(p)
if d > EPS:
return PointLocation.COUNTER_CLOCKWISE
if d < -EPS:
return PointLocation.CLOCKWISE
if seg.vector().dot(p) < 0.0:
return PointLocation.ONLINE_BACK
if seg.vector().norm() < p.norm():
return PointLocation.ONLINE_FRONT
return PointLocation.ON_SEGMENT
ところで
static const int CLOCKWISE = -1
って
p0, p1, p2が時計回りになる場合(2)
の2ってなんやったん
使わないと知りつつEnumの値にしてたのに