Wie finde ich am schnellsten den "visuellen" Mittelpunkt eines unregelmäßig geformten Polygons?
Ich brauche, um einen Punkt zu finden, dass ist eine optische Mittelpunkt eines unregelmäßig geformten polygon. Von visual center, meine ich, ein Punkt erscheint in der Mitte eine große Fläche des Polygons sichtbar. Die Anwendung ist ein label innerhalb des Polygons.
Hier ist eine Lösung, dass Verwendungen im inneren-Pufferung:
Wenn diese benutzt werden, was eine effektive und schnelle Möglichkeit zu finden die Puffer? Wenn irgendeine andere Weise verwendet werden, die in dieser Art?
Ein gutes Beispiel für wirklich harte Polygone ist ein Riesen-dicken U (geschrieben in Arial Black oder Impact oder so schriftart).
InformationsquelleAutor der Frage | 2009-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie umwandeln können das polygon in ein binäres Bild, dann können Sie die Stiftung ist im Bereich der Bildverarbeitung, z.B.: Eine Schnelle Skeleton-Algorithmus
auf Block Binär Dargestellt Bilder.
Aber das ist nicht wirklich sinnvoll, in den Allgemeinen Fall, weil der Diskretisierung Fehler und zusätzliche Arbeit.
Aber vielleicht finden Sie diese nützlich:
EDIT: Vielleicht wollen Sie suchen den Punkt, der die Mitte des größten Kreises enthalten, die in das polygon. Es ist nicht unbedingt immer im Zentrum beobachtet, aber die meiste Zeit würde wahrscheinlich geben das erwartete Ergebnis, und nur im leicht pathologischen Fällen etwas, das völlig aus.
InformationsquelleAutor der Antwort Reunanen
Haben Sie schaute in mit den Schwerpunkt Formel?
http://en.wikipedia.org/wiki/Centroid
http://en.wikipedia.org/wiki/K-means_algorithm
InformationsquelleAutor der Antwort Arron S
Habe ich eine sehr gute Lösung gefunden, um diese von MapBox genannt Polylabel. Den vollständigen Quellcode finden Sie auf Ihrer Github zu.
Im wesentlichen versucht es zu finden, das visuelle Zentrum des Polygons als T Austin sagte.
Bestimmte details deuten dies kann eine praktische Lösung sein:
Eine kurze Notiz über die Verwendung though. Der Quellcode funktioniert großartig für das Javascript aus der box jedoch, wenn Sie beabsichtigen, mit dieser mit einem "normalen" polygon", dann sollten Sie wickeln Sie es in ein leeres array, da die Funktionen hier nehmen GeoJSONPolygons eher als normale Polygone, d.h.
InformationsquelleAutor der Antwort Chris
Wie etwa:
Wenn der Schwerpunkt des Polygons innerhalb des Polygons, dann benutze ihn, sonst:
1) Erweitern Sie eine Linie vom Schwerpunkt durch die polygon-Aufteilung des Polygons in zwei Hälften gleicher Fläche
2) Das "visual center" ist der Punkt, auf halbem Weg zwischen dem nächstgelegenen Punkt, wo die Linie berührt den Umfang und den nächsten Punkt schneiden den Umkreis in die Richtung gehen, Weg vom Schwerpunkt
Hier sind ein paar Bilder, um es zu illustrieren:
InformationsquelleAutor der Antwort T.Austin
Centroid-Methode hat bereits vorgeschlagen worden, mehrere Male. Ich denke, das ist eine ausgezeichnete Ressource, die den Prozess beschreibt (und viele andere nützliche tricks, mit Polygonen) sehr intuitiv:
http://paulbourke.net/geometry/polygonmesh/centroid.pdf
Außerdem legen Sie sich eine einfache UI-label, es könnte ausreichen, einfach nur die Berechnung der bounding box des Polygons (ein Rechteck, definiert durch den niedrigsten und höchsten x-und y-Koordinaten eines vertex im polygon) und den center auf:
Dieser ist ein Stück schneller als die Berechnung der Schwerpunkt, die möglicherweise Bedeutung für eine Echtzeit-oder embedded Applikation.
Beachten Sie auch, dass, wenn Ihr Polygone statisch sind (Sie ändern sich nicht bilden), könnte man optimieren, wenn das Ergebnis der BB-center /center of mass-Berechnung (im Vergleich zu z.B. der erste Eckpunkt des Polygons) auf die Datenstruktur des polygon.
InformationsquelleAutor der Antwort safdsas
Berechnen Sie die mittlere position (x,y) für jede Kante des Polygons. Sie können dies tun, indem die Differenz zwischen den Positionen der enden jeder Kante. Nehmen Sie den Durchschnitt jedes Zentrum in jeder dimension. Dies wird der Mittelpunkt des Polygons.
InformationsquelleAutor der Antwort ire_and_curses
Ich sage nicht, dass dies der Schnellste, aber es wird geben Sie einen Punkt innerhalb des Polygons. Berechnen Sie die Gerade Skelett. Den Punkt, den Sie suchen, ist auf diesem Skelett. Sie könnten Holen die man mit der kürzesten normalen Abstand zum Zentrum der bounding-box zum Beispiel.
InformationsquelleAutor der Antwort Harald Scheirich
Wie über die Suche nach der "Innenkreis" des Polygons (der größte Kreis, der passt hinein), und dann die Zentrierung der Beschriftung auf der Mitte der? Hier sind ein paar links zum Einstieg:
http://www.mathopenref.com/polygonincircle.html
https://nrich.maths.org/discus/messages/145082/144373.html?1219439473
Diese nicht perfekt funktionieren auf jedem polygon, wahrscheinlich; ein polygon, das aussieht wie ein C hätte die Beschriftung etwas unberechenbar spot. Aber der Vorteil wäre, dass die Beschriftung überlappen Sie stets ein fester Teil des Polygons.
InformationsquelleAutor der Antwort Ryan Lundy
Wenn ich verstehe den Punkt des Papiers, das Sie verbunden mit (durchaus ein Interessantes problem, btw), das "innen buffering" - Technik ist etwas Analog zu der Modellierung der Form in Frage, die aus einem Stück Würfelzucker, aufgelöst wird, durch Säure aus den Kanten. (z.B. als Puffer-Abstand steigt, wird weniger von der ursprünglichen Form bleibt) Das Letzte bit übrigen ist der ideale Ort, um ein label.
Wie dies in einem Algorithmus ist leider nicht sehr klar für mich....
InformationsquelleAutor der Antwort Jason S
Ich denke, wenn Sie brach das polygon wieder zurück in die Ecken, und dann angewendet, eine Funktion zu finden, die größte konvexe Hülle , und dann finden Sie die Mitte aus, die konvexe Hülle, es würde passen eng mit der "scheinbaren" center.
Finden der größte konvexe Hülle gegeben, die Eckpunkte: Schauen Sie unter das Einfache Polygon Absatz.
Durchschnitt der Eckpunkte der konvexen Hülle zu finden die Mitte.
InformationsquelleAutor der Antwort CookieOfFortune
Konnte Sie den Aufkleber an der naiv-center (der bounding-box, vielleicht), und dann verschieben Sie es auf der Grundlage der Schnittpunkte der lokalen polygon-Kanten und der Beschriftung BB? Bewegen sich entlang der sich kreuzenden Kanten' normalen, und wenn mehrere Kanten schneiden, die Summe Ihrer normalen Bewegung?
Hier nur raten; in dieser Art von problem, ich würde wahrscheinlich versuchen, Sie zu lösen iterativ, solange die Leistung nicht allzu viel von einer Besorgnis.
InformationsquelleAutor der Antwort dash-tom-bang
Nicht viel Zeit, zu aufwändig oder testen Sie diese jetzt, aber ich werde versuchen, mehr zu tun, wenn ich eine chance bekomme.
Verwenden centroide als Ihre primäre Methode. Test, um zu sehen, ob der Schwerpunkt ist innerhalb des Polygons; wenn nicht, zeichnen Sie eine Linie durch der nächste Punkt, und auf der anderen Seite des Polygons. In der Mitte des Abschnitts der Zeile, die innerhalb des Polygons, legen Sie Ihre Etikett.
Weil der Punkt, der am nächsten zum Schwerpunkt, ist wahrscheinlich gebunden, ein ziemlich großes Gebiet, ich denke, das könnte geben Ergebnisse ähnlich wie Kyralessa ist incircles. Natürlich, dies könnte Amok, wenn Sie hatte ein polygon mit Löchern. In diesem Fall, die incircles würde wahrscheinlich viel besser. Auf der anderen Seite, es wird standardmäßig der (schnelle?) centroid-Methode für die typischen Fälle.
InformationsquelleAutor der Antwort Matt Parker
Dieses problem wäre wahrscheinlich Analog zur Suche nach dem "center of mass" unter der Annahme einer einheitlichen Dichte.
EDIT: Diese Methode funktioniert nicht, wenn das polygon hat "Löcher"
InformationsquelleAutor der Antwort Janie
können Sie verwenden, der Massenmittelpunkt (oder Schwerpunkt) - Methode, die verwendet wird, im Tiefbau, hier ist ein nützlicher link aus wikipedia:
http://en.wikipedia.org/wiki/Center_of_mass
InformationsquelleAutor der Antwort kamyar