判断是否为凸多边形

所有内角都在(0, 180)的多边形为凸多边形(Convex),否则为凹多边形(Concave)。

 

顶点顺序逆时针

 

顶点顺序顺时针

 

 

判断依据

凸多边形,邻边向量的叉乘结果均为同号,均为正或均为负;

凹多边形,邻边向量的叉乘结果有正有负; 

 

//是否为凸多边形
public static bool IsConvexPolygon(Vector2[] polygon)
{
    int len = polygon.Length;

    float firstCross = 0;
    for (int i = 0; i < len; ++i)
    {
        var a = polygon[i];
        var b = polygon[(i+1) % len];
        var c = polygon[(i+2) % len];
        var ba = a - b;
        var bc = c - b;
        float cross = V2Cross(ref ba, ref bc);
        if (0 == i)
            firstCross = cross;
        else if (firstCross * cross <= 0) //叉乘结果有异号就是凹多边形
            return false;
    }
    return true;
}

 

参考

【计算几何】凸多面体重叠判断算法:GJK 算法详解 & C++代码实现二维情形的凸多边形重叠判断_gjk算法-CSDN博客

碰撞检测算法之GJK算法 - 知乎 (zhihu.com)

 

posted @ 2023-11-07 23:24  yanghui01  阅读(140)  评论(0编辑  收藏  举报