判断点是否在多边形中的方法

这2个都只适用于不考虑y的情况

public static bool IsPointInPolygon(Vector2 point, IReadOnlyList<Vector2> polygon)
{
    int polygonLength = polygon.Count, i = 0;
    bool inside = false;

    float pointX = point.x, pointY = point.y;
    float startX, startY, endX, endY;

    Vector2 endPoint = polygon[polygonLength - 1];
    endX = endPoint.x;
    endY = endPoint.y;

    while (i < polygonLength)
    {
        startX = endX;
        startY = endY;
        endPoint = polygon[i++];
        endX = endPoint.x;
        endY = endPoint.y;
        inside ^= (endY > pointY ^ startY > pointY) &&
                    ((pointX - endX) < (pointY - endY) * (startX - endX) / (startY - endY));
    }

    return inside;
}
/// <summary>
/// 计算一个点是否在一个多边形范围内,没有考虑y的影响
/// 如果过该点的线段与多边形的交点不为零且距该点左右方向交点数量都为奇数时  该点再多边形范围内
/// </summary>
/// <param name="point">测试点</param>
/// <param name="vertexs">多边形的顶点集合</param>
/// <returns></returns>
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;
                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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值