如何从四个无序点生成无重叠、无沙漏状的两个三角形?含凹点处理
四个无序点生成符合要求的两个三角形方案
嘿,针对你提出的四个无序点拆分需求,我整理了一套兼顾凸/凹四边形场景,且能优先处理中心型点的可行方案:
核心目标
我们要生成无重叠区域(仅允许共享一条公共边)、非沙漏形状的两个三角形,同时优先将被其他点包围的中心型点(或靠近几何中心的点)作为单个三角形的核心顶点,强化它的“归属”性。
第一步:预处理与目标点定位
首先先排除特殊情况,再找到我们需要优先处理的点:
- 排除共线情况:如果四点共线,无法生成符合要求的三角形,直接做特殊提示;如果三点共线(比如A、B、C共线,D在直线外),唯一无重叠拆分方式是
△ABD和△ACD,共享AD边。 - 定位中心型点:
- 凹四边形场景:遍历每个点P,取另外三个点A、B、C,计算向量叉积判断P的位置:
若cross1 = (B.x - A.x)*(C.y - A.y) - (B.y - A.y)*(C.x - A.x) cross2 = (B.x - A.x)*(P.y - A.y) - (B.y - A.y)*(P.x - A.x) cross3 = (C.x - B.x)*(P.y - B.y) - (C.y - B.y)*(P.x - B.x) cross4 = (A.x - C.x)*(P.y - C.y) - (A.y - C.y)*(P.x - C.x)cross2、cross3、cross4的符号与cross1完全一致,说明P在ABC内部,即为我们要优先处理的中心型点。 - 凸四边形场景:计算四个点的几何中心
O((x1+x2+x3+x4)/4, (y1+y2+y3+y4)/4),找出距离O最近的点作为目标点。
- 凹四边形场景:遍历每个点P,取另外三个点A、B、C,计算向量叉积判断P的位置:
第二步:分场景拆分三角形
情况1:凹四边形(存在内部中心型点P)
假设凸包点为A、B、C:
- 选择凸包中与P距离最近的两个顶点(比如A和B)
- 生成第一个三角形
△PAB,让P作为核心顶点 - 生成第二个三角形
△PAC,两个三角形共享AP边,无重叠区域,且完整覆盖所有四个点 - 这种拆分方式既满足无重叠、非沙漏的要求,也让P的“中心属性”得到体现——它作为两个三角形的公共顶点,且两个三角形都围绕它展开。
情况2:凸四边形(目标点P)
假设凸四边形顶点为A、B、C、D,P是距离中心最近的点:
- 找到P在凸包上的对顶点(比如P是A,对顶点是C)
- 选择对角线AC作为共享边,生成
△ABC和△ADC - 这种拆分方式避免了沙漏形状(仅用一条对角线),且P作为两个三角形的顶点,符合“归入单个核心三角形”的隐含需求;如果想让P所在的三角形更紧凑,也可以选择将P与相邻两个顶点组成
△PAB,再生成△PCD——但注意这种方式会留下空隙,仅适合不需要完全覆盖凸包区域的场景。
第三步:避免沙漏形状的关键
沙漏形状本质是两个三角形交叉重叠的情况,只要我们始终坚持基于单条共享边的拆分逻辑(不管是凸四边形的对角线,还是凹四边形中内部点到凸包顶点的连线),就可以完全避免这种情况。绝对不要同时使用两条对角线生成交叉的三角形组合。
内容的提问来源于stack exchange,提问作者Chilly
相关产品推荐
相关产品推荐

