2016-10-30 5 views
0

Ich entwickle gerade einen Level-Editor, und ich bin an den Punkt gekommen, wo ich eine Liste von Vertices gesammelt habe, die ich verwenden möchte, um einen Polygon Collider zu erstellen.Erhalte den Umfang einer Liste von Vertices

Ich habe diese Scheitelpunkte erhalten, indem ich bestimmte Kacheln als "Collider" gekennzeichnet habe und sie durch einen Algorithmus laufen lasse, um eine Liste der verbundenen Kacheln zu erhalten. Ich habe dann eine Liste von Scheitelpunkten aus der Liste der verbundenen Kacheln erstellt und alle Duplikate entfernt.

Unten ist ein Bild, das helfen wird zu erklären. Alle Punkte sind Vertices, die derzeit in meiner Liste sind, aber ich möchte die Einsen rot verwenden, um ein Polygon zu erstellen.

enter image description here

+0

„Convex Rumpf“ würde gut Suchbegriff ... Aber Sie suchen nach etwas weniger definiert - wenn Sie viel bessere Erklärung dafür, wie Sie festlegen, ob zwei Punkte zu begrenzen gehören können Sie hier beantworten oder vielleicht auf [Cs.se] –

+0

Das ist was ich versuche zu finden. Ich habe derzeit keine Möglichkeit herauszufinden, ob sich ein Eckpunkt auf der Seite oder an der Ecke befindet oder auch nicht. – user1801067

+0

Sie müssen auf das Bild starren und herausfinden, welche Regeln Sie beim Zeichnen verwendet haben. Probiere auch interessantere Bilder aus (z. B. zeichne Buchstaben mit Punkten und finde dann einen Rahmen für sie). An diesem Punkt werden Sie hoffentlich eine bessere Vorstellung davon haben, was Sie wollen und können diese Frage klären. –

Antwort

0

Dies ist, wie ich mein Problem zu lösen endete. Jeder Scheitelpunkt ist ein Teil von vier verschiedenen Kacheln (ausgenommen Kanten von Kartenkästen), so dass ich einfach jeden Scheitelpunkt durchlaufen und gezählt habe, wie viele Nachbarn "vom selben Typ" sind. Wenn das Ergebnis 4 war, bedeutete das, dass der Scheitel irgendwo in der Mitte des Polygons war. Wenn das Ergebnis 3 war, bedeutete dies, dass der Scheitelpunkt an einer inneren Ecke war. 2 bedeutete, dass es an einer Kante war. 1 bedeutete, dass es eine äußere Ecke war.

private List<Vector2> GetPerimeterOfVerticeList(List<Vector2> vertices, TileType type) 
{ 
    int neighborCount = 0; 
    List<Vector2> perimeter = new List<Vector2>(); 

    //Check the four tiles touching this vertex 
    foreach (Vector2 v in vertices) 
    { 
     //upper left tile 
     if (v.x - 1 >= 0 && v.y <= gridHeight - 1 && grid[(int)v.x - 1, (int)v.y].type == type) 
     { 
      neighborCount++; 
     } 
     //upper right 
     if (v.x <= gridWidth - 1 && v.y <= gridHeight - 1 && grid[(int)v.x, (int)v.y].type == type) 
     { 
      neighborCount++; 
     } 
     //bottom right 
     if (v.y - 1 >= 0 && v.x <= gridWidth - 1 && grid[(int)v.x, (int)v.y - 1].type == type) 
     { 
      neighborCount++; 
     } 
     //bottom left 
     if (v.y - 1 >= 0 && v.x - 1 >= 0 && grid[(int)v.x - 1, (int)v.y - 1].type == type) 
     { 
      neighborCount++; 
     } 


     //If we have less than 4 neighbors, it means we are on the edge. 3 is an inner corner, 2 is a side piece, 1 is an outer corner 
     if (neighborCount < 4) 
     { 
      perimeter.Add(v); 
     } 

     //Reset the neighbor count back to 0 for the next vertex check. 
     neighborCount = 0; 
    } 
    return perimeter; 
} 
Verwandte Themen