2015-09-27 73 views
0

我有这个问题,并没有找到一个正确的方法来检查给定的X,Y点是否在任意2维多边形内。如何检查2维点是否在C#中的多边形内?

几个小时后,我设法找到一种方法,它也考虑到在多边形边上的点数,以此作为匹配。

+1

使用[GraphicsPath.AddPolygon()](https://msdn.microsoft.com/en-us/library/16k3da3w(v = vs.110).aspx)和[GraphicsPath.IsVisible](https:// msdn.microsoft.com/en-us/library/d20k495d(v=vs.110).aspx)? –

+0

当你使用WinForms时,它确实有效。 –

+0

...你是或者不是**使用WinForms?你还没有指定你的环境。 =) –

回答

0

通过使用自定义类Vector2双X和双Y属性,你可以使用下面的代码来检查,如果给定的“位置”是“点”的多边形内:

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; 
    } 

我希望这帮助。 享受!

相关问题