计算一个点是否在一个多边形范围内

/// 计算一个点是否在一个多边形范围内
/// 如果过该点的线段与多边形的交点不为零且距该点左右方向交点数量都为奇数时  该点再多边形范围内
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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值