Предполагая, что у вас есть 2D-форма, определенная контуром, последовательность 2D-векторов в порядке CCW. Форма является выпуклой, если все пары последовательных ребер образуют левый (против часовой стрелки) контур. Вы можете убедиться в этом, представив два ребра в виде тройки точек, а затем вызвать leftOn()
, который возвращает истину, если упомянутое свойство left задано или если точки коллинеарны.
function leftOn( a, b, c ) {
return area2( a, b, c ) >= 0;
}
function area2( a, b, c ) {
return ( ( c.x - a.x ) * ( b.y - a.y ) ) - ( ( b.x - a.x ) * ( c.y - a.y ) );
}
Подробнее об этом подходе вы можете прочитать в: Вычислительная геометрия в Си, Джозеф О'Рурк