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);
}

问题

4

3 回答 3

3

这是一些计算凹角和凸角的代码:

// 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';
}
于 2014-09-03T13:49:42.490 回答
0

关于您尝试做的事情的更多细节可能会有所帮助。话虽如此,似乎生成凸包的算法可能有用。比如下面,这大概是效率和易于实现的最佳平衡:

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

一旦您知道哪些点是凸包的一部分,其余的应该会更直接一些。

于 2012-11-18T07:28:45.310 回答
0

一个简单的方法是评估向量行列式。

首先,我们确保多边形是顺时针/逆时针的(使用鞋带法)。

让我们顺时针走。这意味着您的所有内角都可以被认为是在各个相邻边之间逆时针绘制。

假设对于边 AB 和 BC 之间的特定角度 ABC,我们可以计算向量 BA 和 BC 之间的行列式(ad - bc 公式)。

如果行列式 <= 0,则选择凹角(即 360 - 向量之间的角度)。如果 det 大于 0,我们取凸角。希望这可以帮助

于 2019-07-23T02:21:28.553 回答