【问题标题】:find convex an concave corners in a polygon在多边形中找到凸角和凹角
【发布时间】:2012-11-05 18:07:34
【问题描述】:

我正在尝试检测任意多边形中的角是凹的还是凸的。 我制作了下面的函数来计算所有边对之间的角度。但是,人们永远不知道它返回的是内角还是外角。我不知道该怎么做。任何帮助表示赞赏!!!!

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

【问题讨论】:

    标签: javascript polygon convex concave


    【解决方案1】:

    这里有一些代码可以计算凹角和凸角:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 哦,如果凸包本身不够好,那么对于大多边形或奇怪形状的多边形是可能的。使用叉积应该仍然能够帮助确定角是凸的还是凹的。使用角度可能不是最好的方法。
      【解决方案3】:

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

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

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

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

      如果行列式

      【讨论】:

        猜你喜欢
        • 2013-07-11
        • 1970-01-01
        • 2012-04-30
        • 2011-01-28
        • 2018-08-22
        • 1970-01-01
        • 2011-05-09
        • 2016-09-28
        • 2020-11-02
        相关资源
        最近更新 更多