[英]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.