基于K个顶点生成仅含外围边的cycle graph的算法咨询
基于K个顶点生成仅含外围边的cycle graph的算法咨询
嘿,看起来你要找的其实就是环图(Cycle Graph)或者几何意义上的凸包边集的生成方法呀!之前没找到合适的方案大概率是术语没对上,我给你梳理两种最实用的思路:
一、直接生成目标边集(最高效)
这种方法不用先搞完全图,直接一步到位生成外围边:
- 如果你的顶点已经按外围顺序排列(比如顺时针/逆时针的坐标顺序,或者正多边形的顶点顺序):
直接把第i个顶点和第i+1个顶点相连,最后把第K个顶点连回第1个顶点就行。比如顶点列表是v0, v1, ..., vK-1,生成的边就是(v0,v1), (v1,v2), ..., (vK-1,v0),这就是标准的环图结构。 - 如果顶点是随机分布的,没有排序:
先给顶点做凸包计算——你说的“外围边”本质就是这些顶点构成的凸包的边。常用的凸包算法有Graham扫描法、Andrew算法,它们能帮你把顶点按凸包的外围顺序排列好,之后再按上面的方式连接相邻顶点即可。
二、从已有的完全图中筛选外围边
如果你已经生成了完全图,想删掉内部边保留外围边,可以通过以下规则判断:
对于完全图中的任意一条边(u, v),检查剩下的所有顶点是否都在这条边的同一侧:
- 如果所有顶点都在边的同侧,这条边就是外围(凸包)边,保留;
- 如果有顶点分布在边的两侧,这条边就是内部边,可以删除。
判断点在边的哪一侧可以用向量叉积实现:假设边是从u到v,取任意其他顶点p,计算叉积(v.x - u.x) * (p.y - u.y) - (v.y - u.y) * (p.x - u.x)。如果所有顶点的叉积结果符号一致(全正或全负,取决于坐标系的y轴方向),就说明这条边是凸包边。
小提示
- 如果你的需求是生成规整的正多边形外围(比如顶点均匀分布在圆上),可以直接按角度生成每个顶点的坐标,然后依次相连,连凸包计算都省了。
- 术语补充:你要的“仅含外围边的图”,如果是所有顶点都在环上,就是环图(Cycle Graph,记为Cₖ);如果是几何空间中的外围边界,就是凸包边集。
备注:内容来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

