2016-06-03 10 views
0

Ich habe eine Karte mit einem Hex-Gitter darauf. Ich versuche "Gruppierungen" von Hexagons zu konstruieren, um Subregionen zu schaffen. Ich habe die Regionen tatsächlich konstruiert, aber das Problem ist die Reihenfolge, in der jeder Punkt des 'Kantenpolygons' bestimmt wird. Was ich suche, ist ein Algorithmus, der mit einer Reihe von Punkten (hoffentlich) die richtige Form der äußeren Sechsecke konstruieren kann. Wichtig ist die Reihenfolge der Punkte, wenn ich diese an Dynmap übergebe, um eine polygonale Region zu konstruieren, erfolgt dies nach Punkt-Reihenfolge.Erhalten Sie bestellte äußere Punkte einer Gruppierung von Hexagons

Formweise nehme ich an, es ist ein bisschen wie konvexe Hülle, glaube ich, aber ich will nicht, dass eine neue Form mit weniger Punkten konstruiert wird. Als ein Beispiel ist, unter dem, was ich bin immer und ist falsch:

enter image description here

Below das gewünschte Ergebnis ist, so zu sprechen: enter image description here

Danke Jungs!

+0

Danke für das Teilen, was Sie tun. –

+0

Hast du den Code dafür oder ist das etwas, was du in Paint Pro Shop gezeichnet hast? – gpasch

Antwort

0

Dies ist vielleicht nicht sehr effizient, aber es ist das erste, was einem einfällt.

Zuerst, vergessen Sie die Kanten und zeichnen Sie einfach die rote Hintergrundfarbe für jedes Sechseck.

Jetzt möchten Sie nur noch Außenkanten zeichnen. Das heißt, Kanten, die nicht an ein anderes Sechseck angrenzen. Erstellen Sie eine Edge-Klasse mit korrektem equals/hashcode (unabhängig von der Reihenfolge der Punkte). Erzeugen Sie für jedes Sechseck alle Kanten und sammeln Sie diese in einer Karte, die jede Kante zählt. Zeichnen Sie jetzt nur die Kanten, die einmal gezählt wurden.

Map<Edge,Integer> counts = new HashMap<>(); 

for (Hexagon hexagon : hexagons) 
    for (Edge edge : edges(hexagon)) 
     counts.merge(edge, 1, (x,y) -> x+y); 

counts.forEach((edge,count) -> { if (count == 1) draw(edge); }); 

Es ist wahrscheinlich eine effizientere Art und Weise, aber dies hat den Vorteil, einfach zu sein, und es ist wahrscheinlich schnell genug für Ihren Anwendungsfall.

+0

Das Problem ist, dass die Reihenfolge der Operationen extrem wichtig ist, da die Reihenfolge der Punkte wie die polygonale Region erstellt wird. Edges bringt mich nicht so sehr, denn es ist wirklich die richtige Reihenfolge der Ecken, die ich brauche. – Cryptite

+0

Sie können Ihre Frage klären, um zu erklären, warum die Reihenfolge der Punkte wichtig ist. In meinen Augen scheint das nicht notwendig. Wenn Sie jedes der Sechsecke kennen, haben Sie die Region. Es bleibt nur noch zu wählen, welche Kanten gezeichnet werden sollen. – user2297560

+0

Die Wahl ist der schwierige Teil. Der Code, den ich geschrieben habe, funktioniert genauso wie du, außer durch Punkte statt Kanten; also bekomme ich am Ende die richtigen Punkte, aber die Reihenfolge ist falsch (also das erste Bild) – Cryptite