Seite 2 von 2

Verfasst: Sonntag 12. April 2009, 12:30
von nuss
damn your right ;)
also müssen alle schnittpunkte überprüft werden, um
eindeutig zu verifizieren, ob ein polygon im anderen liegt.

hab im übrigen auch ne neue "point_collide" geschrieben.

Code: Alles auswählen

    def point_collide(self, p):
        # zuerst werden alle linien, die komplett
        # überhalb oder unterhalb des punktes liegen
        # ausgeschlossen, so dass nurnoch linien übrigbleiben,
        # deren einer Punkt unterhalb des Punktes, und deren anderer
        # Punkt überhalb des Punktes liegen.
        # dann wird geschaut, wieviele der linien rechts, bzw links
        # von dem Punkt liegen. Ist diese Zahl ungerade,
        # so liegt der Punkt im Polygon, ist sie gerade, so liegt der
        # Punkt ausserhalb des Polygons.
        # Eckpunkte auf gleicher höhe wie der Punkt, werden dabei als
        # darüber-liegend angesehen.

        _count = 0
        for l in self.sides():
            # diesen Teil vielleicht wieder raus.
            if any(p == point for point in self):
                return False
            # ----------------------------------------
            # der hauptteil --------------------------
            elif (l[0][1] <= p[1] and l[1][1] > p[1]) or\
                    (l[0][1] > p[1] and l[1][1] <= p[1]):
                _s = left_or_right(l, p)
                if _s == "mid":
                    return False
                elif _s == "right":
                    _count += 1
            # ----------------------------------------

            # diesen Teil vieleicht wieder raus.
            # dieser block ist ausschließlich dafür da,
            # um zu verhindern, das Punkte, die auf einer der unteren
            # Linien des Polygons liegen, als im Polygon befindlich
            # ausgegeben werden.
            # Daher wäre es sinvoll, einen Weg zu finden,
            # das direkt im oberen Teil zu machen.
            elif radian(l[0], l[1]) == radian(l[0], p):
                if distance(l[0], l[1]) > distance(l[0], p):
                    return False
            # -----------------------------------------
        if _count % 2 == 0:
            return False
        return True


    def collide_any(self, points):
        return any(self.point_collide(point) for point in points)

    def polygon_collide(self, polygon):
        return polygon.collide_any(self) or self.collide_any(polygon)
;)