저는 C#에 익숙하지 않으며 볼록 선체를 계산하는 데 어려움을 겪고 있습니다. C#에는이를위한 일종의 수학 라이브러리가 있습니까? 그렇지 않다면 나는 내 자신을 구현해야 할 것 같아요.볼록 선체 라이브러리
답변
MIConvexHull-https://designengrlab.github.io/MIConvexHull/ - C#의 고성능 볼록 선체 구현으로 고차원 컨벡션 헐 (hull)도 지원합니다. LGPL 라이센스.
여기는 Monotone Chain 알고리즘 인 앤드류 알고리즘 (Andrew 's Algorithm)을 사용하여 작성한 2D 볼록 헐 알고리즘입니다.
public static IListSource<Point> ComputeConvexHull(List<Point> points, bool sortInPlace = false)
{
if (!sortInPlace)
points = new List<Point>(points);
points.Sort((a, b) =>
a.X == b.X ? a.Y.CompareTo(b.Y) : a.X.CompareTo(b.X));
// Importantly, DList provides O(1) insertion at beginning and end
DList<Point> hull = new DList<Point>();
int L = 0, U = 0; // size of lower and upper hulls
// Builds a hull such that the output polygon starts at the leftmost point.
for (int i = points.Count - 1; i >= 0 ; i--)
{
Point p = points[i], p1;
// build lower hull (at end of output list)
while (L >= 2 && (p1 = hull.Last).Sub(hull[hull.Count-2]).Cross(p.Sub(p1)) >= 0) {
hull.RemoveAt(hull.Count-1);
L--;
}
hull.PushLast(p);
L++;
// build upper hull (at beginning of output list)
while (U >= 2 && (p1 = hull.First).Sub(hull[1]).Cross(p.Sub(p1)) <= 0)
{
hull.RemoveAt(0);
U--;
}
if (U != 0) // when U=0, share the point added above
hull.PushFirst(p);
U++;
Debug.Assert(U + L == hull.Count + 1);
}
hull.RemoveAt(hull.Count - 1);
return hull;
}
존재하는 것으로 간주되는 일부 사항에 의존합니다. 자세한 내용은 내 blog post을 참조하십시오.
다음은 Qwertie의 대답에 사용 된 동일한 Java 소스의 음역이지만 이중 필드가있는 Point 클래스 이외의 비표준 클래스에는 종속되지 않습니다.
class ConvexHull
{
public static double cross(Point O, Point A, Point B)
{
return (A.X - O.X) * (B.Y - O.Y) - (A.Y - O.Y) * (B.X - O.X);
}
public static List<Point> GetConvexHull(List<Point> points)
{
if (points == null)
return null;
if (points.Count() <= 1)
return points;
int n = points.Count(), k = 0;
List<Point> H = new List<Point>(new Point[2 * n]);
points.Sort((a, b) =>
a.X == b.X ? a.Y.CompareTo(b.Y) : a.X.CompareTo(b.X));
// Build lower hull
for (int i = 0; i < n; ++i)
{
while (k >= 2 && cross(H[k - 2], H[k - 1], points[i]) <= 0)
k--;
H[k++] = points[i];
}
// Build upper hull
for (int i = n - 2, t = k + 1; i >= 0; i--)
{
while (k >= t && cross(H[k - 2], H[k - 1], points[i]) <= 0)
k--;
H[k++] = points[i];
}
return H.Take(k - 1).ToList();
}
}
제공된 모든 코드로 많은 볼록 알고리즘/구현을 비교했습니다. 모든 것은 CodeProject 기사에 포함됩니다.
알고리즘 비교 :
- 모노톤 체인
- MiConvexHull (들로네 삼각 측량 및 보로 노이 그물코)
- Ouellet (내)
문서 :
- 2017년 10월 13일 - 5 월 알고리즘/구현과 테스트 벤치 - Fast and improved 2D Convex Hull algorithm and its implementation in O(n log h)
- 2014년 5월 20일 내 자신의 알고리즘을 설명합니다 : A Convex Hull Algorithm and its implementation in O(n log h)
@ephraim, 저에게 신고 해 주셔서 고맙습니다. 나는 현재이 사건을보고있다! –
@ephraim, 어디서 버그가 있었습니까? 나는 최신 기사의 코드로 그것을 재현 할 수 없다? 내가 직접 버그를 볼 수있는 힌트가 있니? 모든 Ouellet 알고리즘과 오류/예외가없는 4 000 점의 테스트 (1 포인트를 한 번에 4 분면으로 나타냄)? –
@ephraim, 버그 발견! 감사합니다! 첫 번째 기사에만있었습니다. 수정 된 기사는 곧 제공 될 예정입니다 (15 분 안에 파이프 라인에있을 예정이며 CodeProject가 승인했을 때 ~ 가능할 것입니다.) –
- 1. 부드러운 볼록 선체
- 2. .NET의 볼록 선체 생성
- 3. 점 구름에서 3D 볼록 선체
- 4. 배낭 알고리즘 및 볼록 선체
- 5. 볼록 선체 - 점의 순서를 결정합니다.
- 6. 고차원 볼록 선체 표현 (3+)
- 7. 동적 프로그래밍 최적화, 볼록 선체
- 8. scipy.spatial.Delaunay가있는 파이썬 볼록 선체, 선체 내부의 포인트를 어떻게 줄입니까?
- 9. 객관적인 C의 목표 집합 알고리즘의 볼록 선체
- 10. 점 집합의 내부에 최대 볼록 선체 맞추기
- 11. 2D 또는 3D 볼록 선체 팽창
- 12. 모든 공 선형 점의 볼록 선체?
- 13. 볼록 선체 : 알려진 점 수 자체가 아닌 점
- 14. scipy.spatial의 볼록 선체 루틴은 원래 점 집합을 다시 나타냅니다.
- 15. 볼록 선체 (Python)에서 XY 좌표를 읽는 것
- 16. 원치 않는 점을 제외하기 위해 볼록 선체 수정
- 17. 가능한 가장 작은 주위의 주어진 점 집합의 볼록한 선체 또는 2 개의 볼록 선체
- 18. 투명한 선체 트릭이란 무엇입니까?
- 19. 구면의 (경도, 위도) 볼록한 선체
- 20. 간체 오목 선체
- 21. 자바 선형 대수/볼록 최적화 라이브러리
- 22. 보로 노이 다이어그램의 볼록한 선체
- 23. 가 볼록 선체를 단순화
- 24. 점 목록의 곡면 컨투어 (오목한 선체)
- 25. 위도와 경도가 주어진 지구의 볼록한 선체 다각형 영역을 계산하십시오.
- 26. 더 높은 차원에서 위 (볼록한) 선체 찾기 (3+)
- 27. 점 집합으로부터 볼록 레이어를 생성하기위한 효율적인 알고리즘
- 28. 포인트가 4 점의 볼록한 선체 안에 있는지 확인하십시오.
- 29. Google지도에 볼록한 선체 그리기
- 30. openCV로 볼록한 선체 및 힙 손상
매우 첫번째'C# 볼록 선체에 대한 구글의 히트 '- http://www.codeproject.com/Articles/29275/Convex-Hull. 어떤 연구를 했습니까? –
예, 나는 그것을 보았습니다. 내 질문은 C#에 기존 라이브러리가 내장되어있는 경우였습니다 ... – Owen