2016-10-30 4 views
0

В настоящее время я разрабатываю редактор уровней, и я дошел до того, что собрал список вершин, которые я хочу использовать для создания коллайдера Polygon.Получить периметр списка вершин

Я получил эти вершины, пометив некоторые плитки как «коллайдеры» и пропустив их через алгоритм, чтобы получить список связанных между собой фрагментов. Затем я создал список вершин из списка подключенных плит и удалил любые дубликаты.

Ниже приведено изображение, которое поможет объяснить. Все точки - это вершины, которые в настоящее время включены в мой список, но я хочу использовать те, которые краснеют, чтобы создать многоугольник.

enter image description here

+0

«Выпуклая оболочка» будет хороший термин поиска ... Но вы ищете что-то менее определено - если вы обеспечить гораздо лучшее объяснение того, как можно определить, если пара точек принадлежит к границе вы можете получить ответ здесь или возможно, на [Cs.se] –

+0

То, что я пытаюсь найти. В настоящее время у меня нет способа найти, находится ли вершина сбоку или на углу, или нет. – user1801067

+0

Вы должны смотреть на картинку и выяснить, какие правила вы использовали, когда рисуете ее. Также попробуйте более интересные картинки (например, рисуйте буквы с точками и найдите для них границу). В этот момент вы, надеюсь, поймете, что хотите, и сможете прояснить этот вопрос. –

ответ

0

Это, как я в конечном итоге решить мою проблему. Каждая вершина является частью четырех разных фрагментов (исключая край случаев карты), поэтому я просто повторил каждую вершину и подсчитал, сколько соседей «одного типа». Если результат был равен 4, это означало, что вершина находилась где-то посередине многоугольника. Если результатом было 3, это означало, что вершина находилась на внутреннем углу. 2 означало, что это было на краю. 1 означает, что это был внешний угол.

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; 
} 
Смежные вопросы