/// 计算一个点是否在一个多边形范围内
/// 如果过该点的线段与多边形的交点不为零且距该点左右方向交点数量都为奇数时 该点再多边形范围内
public static bool PolygonIsContainPoint(Vector3 point, List<Vector3> vertexs)
{
//判断测试点和横坐标方向与多边形的边的交叉点
int leftNum = 0; //左方向上的交叉点数
int rightNum = 0; //右方向上的交叉点数
int index = 1;
for (int i = 0; i < vertexs.Count; i++) {
if (i == vertexs.Count - 1) { index = -i; }
//找到相交的线段
if (point.z >= vertexs[i].z && point.z < vertexs[i + index].z || point.z < vertexs[i].z && point.z >= vertexs[i + index].z)
{
Vector3 vecNor = (vertexs[i + index] - vertexs[i]);
//处理直线方程为常数的情况
if (vecNor.x == 0.0f)
{
if (vertexs[i].x < point.x)
{
leftNum++;
}
else if (vertexs[i].x == point.x)
{ }
else
{
rightNum++;
}
}
else {
vecNor = vecNor.normalized;
float k = vecNor.z / vecNor.x;
//print(vertexs[i + index]);
float b = vertexs[i].z - k * vertexs[i].x;
if ((point.z - b) / k < point.x)
{
leftNum++;
}
else if ((point.z - b) / k == point.x)
{
}
else
{
rightNum++;
}
}
}
}
if (leftNum % 2 != 0 || rightNum % 2 != 0)
{
return true;
}
return false;
}