kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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の値にしてたのに