簡體   English   中英

如何檢查C#中的二維點是否在多邊形內?

[英]How do I check if a 2 dimensional point is inside a polygon in C#?

我遇到了這個問題,沒有找到檢查給定X,Y點是否在任意二維多邊形內的正確方法。

幾個小時后,我設法找到一種方法,該方法也將多邊形邊緣上的點視為匹配項。

通過使用具有雙X和雙Y屬性的自定義類Vector2,可以使用以下代碼檢查給定的“位置”是否在“點”的多邊形內:

    public bool CheckCollision( Vector2[] Points, Vector2 Position )
    {
        double MinX = Points.Min( a => a.X );
        double MinY = Points.Min( a => a.Y );
        double MaxX = Points.Max( a => a.X );
        double MaxY = Points.Max( a => a.Y );

        if( Position.X < MinX || Position.X > MaxX || Position.Y < MinY || Position.Y > MaxY )
            return false;

        int I = 0;
        int J = Points.Count() - 1;
        bool IsMatch = false;

        for( ; I < Points.Count(); J = I++ )
        {
            //When the position is right on a point, count it as a match.
            if( Points[ I ].X == Position.X && Points[ I ].Y == Position.Y )
                return true;
            if( Points[ J ].X == Position.X && Points[ J ].Y == Position.Y )
                return true;

            //When the position is on a horizontal or vertical line, count it as a match.
            if( Points[ I ].X == Points[ J ].X && Position.X == Points[ I ].X && Position.Y >= Math.Min( Points[ I ].Y, Points[ J ].Y ) && Position.Y <= Math.Max( Points[ I ].Y, Points[ J ].Y ) )
                return true;
            if( Points[ I ].Y == Points[ J ].Y && Position.Y == Points[ I ].Y && Position.X >= Math.Min( Points[ I ].X, Points[ J ].X ) && Position.X <= Math.Max( Points[ I ].X, Points[ J ].X ) )
                return true;

            if( ( ( Points[ I ].Y > Position.Y ) != ( Points[ J ].Y > Position.Y ) ) && ( Position.X < ( Points[ J ].X - Points[ I ].X ) * ( Position.Y - Points[ I ].Y ) / ( Points[ J ].Y - Points[ I ].Y ) + Points[ I ].X ) )
            {
                IsMatch = !IsMatch;
            }
        }

        return IsMatch;
    }

我希望這有幫助。 請享用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM