Liegt ein Punkt im gleichseitigen Polygon oder ausserhalb?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nuss
User
Beiträge: 53
Registriert: Donnerstag 28. August 2008, 11:36

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)
;)
Antworten