kb84tkhrのブログ

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

CGL_2_D: Distance (続き4)

解説を読む

まずは点と点の距離
ボトムアップにやっていくんだな
今思えばそのほうが考えやすかったかもしれない

ここは何の問題もない・・・と思いつつ

    def distance(self, other: 'Point') -> float:
        return Segment(self, other).vector().abs()

これはまどろっこしいにも程があったな
なんか頭の中がSegmentになっていた
これでいいんだよな

    def distance(self, other: 'Point') -> float:
        return (self - other).abs()

ついでにSegmentクラスにlengthがあるべきなのかなとも思った

    def length(self) -> float:
        return self.p1.distance(self.p2)

次は点と直線の距離
線分じゃなくて直線
自分はProjectionを取って距離を出したけど

    def distance_to_segment(self, seg: 'Segment') -> float:
            :
            return self.distance(seg.projection(self)) # <-
            :

ここで外積を使っている
なるほど
平行四辺形の面積を底辺で割れば高さが出るってことか

直線との距離を求める部分をまず分離しよう
こう

    def distance_to_line(self, seg: 'Segment') -> float:
        return self.distance(seg.projection(self))

    def distance_to_segment(self, seg: 'Segment') -> float:
        if self.in_width_of(seg):
            return self.distance_to_line(seg)
        else:
            return min(self.distance(seg.p1),
                       self.distance(seg.p2))

それからdistance_to_lineを直す

    def distance_to_line(self, seg: 'Segment') -> float:
        return \
            abs((self - seg.p1).cross(seg.vector())) / \
            seg.length()

ところでPythonおすすめの長い行の切り方スタイルがよくわからないんですが

点と(今度は)線分の距離
あーなるほど
始点→終点のベクトルとの角が鈍角なら始点の方が近いに決まってるのか
常に両方の距離を求めて近い方、っていうのはちょっと手抜き過ぎた
持ってる情報は生かさないとね

こうなった

    def distance_to_segment(self, seg: 'Segment') -> float:
        if not self.in_side_of(seg):
            return self.distance(seg.p1)
        if not self.in_side_of(seg.reverse()):
            return self.distance(seg.p2)
        else:
            return self.distance_to_line(seg)

線分と線分の距離は同じやり方・・・

ここで、2つの線分の交差判定を行うintersectは、16.7節で詳しく確認します。

mjsk
そっちをさきにやるわけにはいかなかったのか
相互参照的な?

念のためもう一度ジャッジにかけておく
テストも書いてるけど少し手抜きなので!