kb84tkhrのブログ

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

CGL_3_C: Polygon-Point Containment

点が多角形の内部にいるかどうか
点から外側に向かって線を引き、辺と交わった回数が奇数回なら内部、
偶数回なら外部、とあとは辺にのっかってるかどうかを見ればいいはず

そういえばPolygonクラスって作ってなかったな
とりあえず初期化はこんな感じだろうか

class Polygon:
    def __init__(self, vertices: List[Point]) -> None:
        self.vertices = vertices
        self.n = len(vertices)

この問題は順番に辺を取り出したい
forで書けるとよさそうだから、イテレータだかジェネレータだか作ろう
よくわかってないけどこう?

    def sides(self):
        for i in range(self.n):
            yield Segment(self.vertices[i],
                          self.vertices[(i + 1) % self.n])

試す

$ python3 -i shape.py
>>> tri = Polygon([Point(0, 0), Point(1, 0), Point(0, 1)])
>>> for s in tri.sides():
...     print(s)
... 
Segment(Point(0, 0), Point(1, 0))
Segment(Point(1, 0), Point(0, 1))
Segment(Point(0, 1), Point(0, 0))

よさそうではある
でも一度ちゃんと調べておこうかな