判斷點是否在多邊形中的方法

這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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章