Я использую физический движок Box2D. И есть тип формы для box2D, который называется b2PolygonShape.
В этом классе вы можете создавать полигоны. Существует также функция Set (), которая принимает массив точек и количество вершин.
У Box2D есть такой пример:
// This defines a triangle in CCW order.
b2Vec2 vertices[3];
vertices[0].Set(0.0f, 0.0f);
vertices[1].Set(1.0f, 0.0f);
vertices[2].Set(0.0f, 1.0f);
int32 count = 3;
b2PolygonShape polygon;
polygon.Set(vertices, count);
Это работает. Тем не менее, когда я попытался попрактиковаться с этой функцией, я сделал это:
b2Vec2 vertices[4];
vertices[0].Set(0, 0);
vertices[1].Set(0,10);
vertices[2].Set(10,10);
vertices[3].Set(10,0);
int32 count = 4;
b2PolygonShape polygon;
polygon.Set(vertices, count);
Когда я скомпилировал и запустил это, он потерпел крах после функции Set (). Разве это не создаст квадрат?
Также в консоли я получил это:
Assertion failed: s > 0.0f
Что я сделал не так?
Вы можете определить намотку многоугольника, а затем развернуть его, если он против часовой стрелки.
Одним из распространенных методов является вычисление площади многоугольника с использованием приведенного ниже алгоритма. Он вернет число + ve для намотки по часовой стрелке и число -ve для намотки против часовой стрелки.
Вот пример Python:
источник