2012-11-17 110 views
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); 
} 

problem

回答

1

什么你试图做可能是有益的一些详细信息。这就是说,似乎是一个生成凸包的算法可能是有用的。比如下面的,这可能是执行的效率和易用性之间的最佳平衡:

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

一旦你知道哪些点的凸包的一部分,剩下的应该是有点更直截了当。

+0

哦,如果凸包本身不够好,这是可能的大多边形或不规则形状的。利用交叉产品应该仍然能够帮助确定拐角是凸的还是凹的。使用角度可能不是最好的办法。 – Nuclearman

3

下面是一些代码摸出凹VS凸角:

// 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'; 
}