C#에서 선이 다각형과 교차하는지 어떻게 알 수 있나요?
-
12-09-2019 - |
문제
다음과 매우 유사한 질문이 있습니다.
선이 임의의 다각형과 교차하는지 알려주는 메서드(C#)를 찾고 있습니다.
내 생각 엔 Chris Marasti-Georg의 알고리즘 매우 도움이 되었지만 가장 중요한 방법이 누락되었습니다.선과 선의 교차점.
Chris Marasti-Georg의 코드를 완성하는 선 교차 방법을 아는 사람이나 비슷한 것이 있습니까?
C#에 이에 대한 기본 제공 코드가 있나요?
이 방법은 금지된 영역 기능으로 강화된 Bing Maps 알고리즘과 함께 사용하기 위한 것입니다.결과 경로는 금지된 영역(임의의 다각형)을 통과해서는 안 됩니다.
해결책
.NET 프레임 워크에 내장 된 에지 감지용 내장 코드가 없습니다.
다음은 필요한 작업을 수행하는 코드 (C#에 포팅)입니다 (실제 알고리즘은 Google 그룹의 Comp.Graphics.Algorithms에서 찾을 수 있습니다) :
public static PointF FindLineIntersection(PointF start1, PointF end1, PointF start2, PointF end2)
{
float denom = ((end1.X - start1.X) * (end2.Y - start2.Y)) - ((end1.Y - start1.Y) * (end2.X - start2.X));
// AB & CD are parallel
if (denom == 0)
return PointF.Empty;
float numer = ((start1.Y - start2.Y) * (end2.X - start2.X)) - ((start1.X - start2.X) * (end2.Y - start2.Y));
float r = numer / denom;
float numer2 = ((start1.Y - start2.Y) * (end1.X - start1.X)) - ((start1.X - start2.X) * (end1.Y - start1.Y));
float s = numer2 / denom;
if ((r < 0 || r > 1) || (s < 0 || s > 1))
return PointF.Empty;
// Find intersection point
PointF result = new PointF();
result.X = start1.X + (r * (end1.X - start1.X));
result.Y = start1.Y + (r * (end1.Y - start1.Y));
return result;
}
다른 팁
주제가 약간 벗어 났지만 줄이 있다면 무한 훨씬 간단한 해결책이 있다고 생각합니다.
모든 지점이 동일하게있는 경우 라인은 다각형을 통과하지 않습니다. 옆 라인의.
이 두 가지의 도움으로 :
- LINQ를 사용하거나 그렇지 않으면 모든 목록 항목이 동일한 값을 갖고 반환하는지 확인하거나 그렇지 않은 경우 "기타 값"을 반환하는 방법은 무엇입니까?
- 선의 어느 쪽이 지점이 있는지 결정하십시오
나는이 작은 보석을 얻었다 :
public class PointsAndLines
{
public static bool IsOutside(Point lineP1, Point lineP2, IEnumerable<Point> region)
{
if (region == null || !region.Any()) return true;
var side = GetSide(lineP1, lineP2, region.First());
return
side == 0
? false
: region.All(x => GetSide(lineP1, lineP2, x) == side);
}
public static int GetSide(Point lineP1, Point lineP2, Point queryP)
{
return Math.Sign((lineP2.X - lineP1.X) * (queryP.Y - lineP1.Y) - (lineP2.Y - lineP1.Y) * (queryP.X - lineP1.X));
}
}
실버 라이트 맵 프로젝트에서 다각형 간의 충돌을 감지하기 위해 Clipper 라이브러리를 사용하고 있습니다.
상업용 용도, 작은 크기, 훌륭한 성능 및 매우 사용하기 쉬운 경우 무료입니다.
이 글이 도움이 될 것 같습니다
http://www.codeproject.com/KB/recipes/2dpolyclip.aspx
이 코드는 선이 다각형 테두리와 교차하는 위치를 정확하게 결정하는 2차원 다각형 자르기 알고리즘입니다.이 코드는 완전히 임의적인 모양의 오목 및 볼록 다각형 모두에 대해 작동하며 모든 선 방향을 처리할 수 있습니다.