点集边界生成算法咨询:替代Convex Hull的实现疑问
求助:点集边界生成问题
最近我在做生成点集边界的功能时,用Convex Hull算法跑出来的效果完全达不到预期,想请教怎么生成符合我需求的边界。
效果对比
- 当前Convex Hull生成的效果:

- 我想要的效果(用画图工具手动画的参考):

当前使用的代码
我现在用的是C#版的Convex Hull实现,代码如下:
using System; using System.Collections.Generic; using System.Linq; public class ConvexHull { public static List<Point> ComputeConvexHull(List<Point> points) { if (points == null || points.Count == 0) return new List<Point>(); points.Sort((a, b) => a.X.CompareTo(b.X) != 0 ? a.X.CompareTo(b.X) : a.Y.CompareTo(b.Y)); List<Point> lower = new List<Point>(); foreach (var p in points) { while (lower.Count >= 2 && Cross(lower[lower.Count - 2], lower[lower.Count - 1], p) <= 0) lower.RemoveAt(lower.Count - 1); lower.Add(p); } List<Point> upper = new List<Point>(); for (int i = points.Count - 1; i >= 0; i--) { var p = points[i]; while (upper.Count >= 2 && Cross(upper[upper.Count - 2], upper[upper.Count - 1], p) <= 0) upper.RemoveAt(upper.Count - 1); upper.Add(p); } lower.RemoveAt(lower.Count - 1); upper.RemoveAt(upper.Count - 1); lower.AddRange(upper); return lower; } private 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 struct Point { public double X { get; set; } public double Y { get; set; } public Point(double x, double y) { X = x; Y = y; } }
我整理的疑问和已知信息
我自己先查了一些资料,整理了几个点:
- 我想要的这种边界效果能不能实现?可以实现
- 我现在用的算法是不是我需要的?不是,我需要的不是凸包,而是类似MATLAB里
boundary函数生成的那种贴合点集的凹形边界 - 这种边界生成算法的性能会不会比传统Convex Hull差?经调研两者性能相当
- 目前卡在最后一点:有没有这种边界生成算法的伪代码或者C#的类似实现示例?找了好久都没找到合适的方案,求帮忙!
内容的提问来源于stack exchange,提问作者Mário Gabriel
相关产品推荐
相关产品推荐

