【问题标题】:How do I check if a 2 dimensional point is inside a polygon in C#?如何检查二维点是否在 C# 中的多边形内?
【发布时间】:2015-09-27 21:17:33
【问题描述】:

我遇到了这个问题,但没有找到合适的方法来检查给定的 X、Y 点是否在任意二维多边形内。

几个小时后,我设法找到了一种方法,该方法也将位于多边形边缘的点视为匹配项。

【问题讨论】:

标签: c# vector 2d polygon collision


【解决方案1】:

通过使用具有双 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;
    }

我希望这会有所帮助。 享受吧!

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多