Tôi mới sử dụng C# và đang gặp khó khăn trong việc tính toán vỏ lồi. Có C# có một số loại của một thư viện toán học cho điều này? Nếu không, thì tôi đoán tôi sẽ phải tự mình thực hiện.Thư viện thân tàu lồi
Trả lời
MIConvexHull - https://designengrlab.github.io/MIConvexHull/ - là một hiệu suất cao lồi thực hiện thân tàu trong C#, hỗ trợ vỏ lồi cao hơn chiều quá. Giấy phép LGPL.
Đây là thuật toán lồi 2D lồi mà tôi đã viết bằng thuật toán Monotone Chain, thuật toán của Andrew.b.a.
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;
}
Nó dựa vào một số điều được cho là tồn tại, xem chi tiết blog post của tôi.
Dưới đây là một chuyển ngữ thành C# của cùng một nguồn Java được sử dụng trong câu trả lời của Qwertie nhưng không phụ thuộc vào các lớp không chuẩn ngoài lớp Point với các trường kép.
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();
}
}
Tôi đã so sánh nhiều thuật toán/triển khai của Convex Hull với tất cả mã được cung cấp. Mọi thứ được bao gồm trong bài viết CodeProject.
Thuật toán so sánh:
- chuỗi đơn điệu
- MiConvexHull (Delaunay triangulations và Voronoi meshes)
- Graham quét
- Chan
- Ouellet (mỏ)
bài viết:
- 2017/10/13 - băng ghế dự bị thử nghiệm với thuật toán tháng/triển khai: Fast and improved 2D Convex Hull algorithm and its implementation in O(n log h)
- 2014/05/20 - Giải thích thuật toán của riêng tôi: A Convex Hull Algorithm and its implementation in O(n log h)
@ephraim, Cảm ơn rất nhiều vì đã báo cáo cho tôi. Tôi hiện đang xem xét trường hợp đó! –
@ephraim, Bạn đã gặp lỗi ở đâu, trong bài viết nào? Tôi không thể tái tạo nó với mã từ bài viết mới nhất của tôi? Bạn có gợi ý về cách tôi có thể tự mình xem lỗi không? 1 000 000 thử nghiệm với 4 điểm (mà nên kết quả trong 1 điểm của góc phần tư một lần trong một thời gian) với tất cả các aglorithms Ouellet và không có lỗi/ngoại lệ? –
@ephraim, Đã tìm thấy lỗi! Cảm ơn nhiều! Chỉ trong bài viết đầu tiên. bài viết với sự điều chỉnh sẽ có sẵn rất sớm (sẽ được trong các đường ống trong 15 phút và sẽ có sẵn khi được phê duyệt bởi CodeProject ~ có lẽ ngày hôm nay) –
- 1. Cách tìm thân lồi trong không gian 3 chiều
- 2. Thư viện tối ưu hóa lồi tốt là gì?
- 3. Tìm một điểm nằm bên trong thân lồi cho một tập hợp các điểm mà không cần tính toán thân tàu
- 4. lồi thân ggplot sử dụng data.tables trong R
- 5. Thư viện Dependency Inject (DI) "thân thiện"
- 6. Thân lồi (kinh độ, vĩ độ) trên bề mặt hình cầu
- 7. TimeSpan vào thư viện chuỗi thân thiện (C#)
- 8. Một thư viện tệp thân thiện với TDD thân thiện với môi trường IO
- 9. Tạo lồi lồi trong .NET
- 10. Điểm kiểm tra cho vị trí của nó so với thân lồi trong log (n)
- 11. Tính toán vùng đa giác lồi của Trái Đất cho vĩ độ và kinh độ
- 12. Ước tính tỷ lệ co của một lồi lồi
- 13. Cao cấp, thư viện thân thiện OpenGL cho người lập trình C++ mới bắt đầu
- 14. Một thư viện thân thiện với clojure để phát âm thanh
- 15. Thư viện PHP để tạo dấu thời gian tương đối thân thiện với người dùng
- 16. C# Thư viện chung
- 17. Thư viện để tạo lưới trong .Net?
- 18. Centroid của đa diện lồi
- 19. Bắt đầu Onboard Tàu nguồn mở
- 20. thư viện javascript để xử lý hình học 2D phức tạp
- 21. Nhúng Thư viện C++ vào .Net Thư viện
- 22. Trộn các thư viện tĩnh và thư viện chia sẻ
- 23. Thư viện Python của Twitter: thư viện nào?
- 24. Thư viện tĩnh & Thư viện động: Lẫn lộn
- 25. Thư viện chuyển thư viện SFTP của Java
- 26. Sự khác biệt giữa thư viện và thư viện gốc
- 27. Compiler Thư viện vs Hệ điều hành Thư viện
- 28. Java: Thư viện ECC (sửa lỗi mã)?
- 29. Phân hủy đối với Đa giác lồi
- 30. OpenCV thác tàu thời gian
Rất đầu tiên đánh vào google cho 'C# lồi thân '- http://www.codeproject.com/Articles/29275/Convex-Hull. Bạn đã làm bất kỳ nghiên cứu? –
vâng, tôi đã thấy điều đó. Câu hỏi của tôi là nếu C# có một thư viện tích hợp sẵn cho nó ... – Owen