给定一组点的数组,当一个多边形按顺序连接时,发现这个多边形是凸多边形(凸多边形定义)。
思路:我们可以通过判断三角形是顺时针还是逆时针来求解;
具体判断三角形是顺时针还是逆时针参考此篇博文《三角形顺时针和逆时针的判定》
步骤:
1.依次求多边形定点连线的向量(不要忘了最后一个定点指向第一个定点的向量)
2.依次计算并判断向量叉乘值符号是否一致
向量叉乘当aXb<0时,b对应的线段在a的顺时针方向;当aXb=0时,a、b共线;当aXb>0时,b在a的逆时针方向
如果定点依次连接组成的向量叉乘结果符号一致就说明点依次时顺时针连接或者是逆时针连接
即为凸多边形
代码如下:
private bool IsConves(int[][] point)
{
Vector2[] vector2s = new Vector2[point.Length];
for (int i = 0; i < point.Length - 1; i++)
{
vector2s[i] = new Vector2(point[i + 1][0] - point[i][0], point[i + 1][1] - point[i][1]);
}
vector2s[point.Length - 1] = new Vector2(point[0][0] - point[point.Length - 1][0], point[0][1] - point[point.Length - 1][1]);
float per = 0;
float cur = 0;
for (int i = 0; i < vector2s.Length - 1; i++)
{
cur = vector2s[i].x * vector2s[i + 1].y - vector2s[i + 1].x * vector2s[i].y;
if (cur != 0)
{
if (cur * per < 0)
return false;
per = cur;
}
}
return per * (vector2s[vector2s.Length - 1].x * vector2s[0].y - vector2s[0].x * vector2s[vector2s.Length - 1].y) > 0;
}