Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Найти выпуклые и вогнутые углы многоугольника

Автор вопроса: timkadoОтветов: 3

Я пытаюсь определить, является ли угол вогнутым или выпуклым в произвольном многоугольнике. Я сделал функцию ниже, которая вычисляет угол между всеми парами ребер. однако никто никогда не знает, является ли это внутренним или внешним угловым углом, который он возвращает. Я понятия не имею, как это сделать. Любая помощь приветствуется!!!!

function findConvexCorner (pt){
var isCornerConvex = [];
for (var i =0; i < pt.length ;i++)
{
    var lastPt = pt.length -1;
    if (i==0){
        var vec1 = vec3.createXYZ( pt[lastPt].x - pt[i].x , pt[lastPt].y - pt[i].y ,0.0);
        var vec2 = vec3.createXYZ( pt[i].x - pt[i+1].x , pt[i].y - pt[i+1].y ,0.0);
        vec3.normalize(vec1);vec3.normalize(vec2);
            isCornerConvex.push(Math.acos(vec3.dot(vec1,vec2))*180/Math.PI);}
    else if(i == lastPt){
        var vec2 = vec3.createXYZ( pt[i-1].x - pt[i].x , pt[i-1].y - pt[i].y ,0.0);
        var vec1 = vec3.createXYZ( pt[0].x - pt[i].x , pt[0].y - pt[i].y ,0.0);
        vec3.normalize(vec1);vec3.normalize(vec2);
            isCornerConvex.push(Math.acos(vec3.dot(vec1,vec2))*180/Math.PI);}
    else{
        var vec1 = vec3.createXYZ( pt[i-1].x - pt[i].x , pt[i-1].y - pt[i].y ,0.0);
        var vec2 = vec3.createXYZ( pt[i+1].x - pt[i].x , pt[i+1].y - pt[i].y ,0.0);
        vec3.normalize(vec1);vec3.normalize(vec2);
            isCornerConvex.push(Math.acos(vec3.dot(vec1,vec2))*180/Math.PI);}
}
console.log("Angle: "+ isCornerConvex);
}

проблема

javascriptpolygonconvexconcave

Ответы

Ответ 1 · Nuclearman

Немного подробнее о том, что вы пытаетесь сделать, может быть полезно. При этом кажется, что алгоритм для создания выпуклой оболочки может быть полезен. Например, следующий, который, вероятно, является лучшим балансом эффективности и простоты реализации:

http://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain

Как только вы узнаете, какие точки являются частью выпуклой оболочки, остальное должно быть немного более прямолинейным.

Ответ 2 · рейтинг 3 · w-f

Вот некоторый код для работы с вогнутыми и выпуклыми углами:

// this assumes nextEdge and previousEdge are vectors pointing out of a vertex and to the next one
var angle = ((Math.atan2(nextEdge.x, nextEdge.y) - Math.atan2(previousEdge.x, previousEdge.y) + Math.PI * 2) % (Math.PI * 2)) - Math.PI;

if (angle > 0) {
   corner.type = 'convex';
} else if (angle < 0) {
    corner.type = 'concave';
} else {
    corner.type = 'straight';
}

Ответ 3 · Tejas Chavan

Самый простой способ сделать это - оценить детерминанты вектора.

Во-первых, мы убеждаемся, что полигон расположен по часовой стрелке/против часовой стрелки (используя метод шнурков).

Пойдем по часовой стрелке. Это означает, что все ваши внутренние углы можно считать нарисованными против часовой стрелки между соответствующими соседними сторонами.

Скажем, для определенного угла ABC между сторонами AB и BC мы можем вычислить определитель между векторами BA и BC (формула ad - bc).

Если определитель ‹= 0, вы выбираете вогнутый угол (т.е. 360 - угол между векторами). Если det больше 0, берем выпуклый угол. Надеюсь это поможет

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы