如何从Vector3点数组中找彼此最远的3个点?用于LineRenderer绘制三角形
从LineRenderer点集中选取与原点构成最远三角形的另外两个点
核心思路
已知原点是点集中的一个最远点,我们可以通过两次查找最远点的操作,快速确定另外两个目标点:
- 先从所有点里找出距离原点最远的点A——此时OA是原点与其他点间的最大距离;
- 再从所有点里找出距离点A最远的点B——此时O、A、B三点两两之间的距离是点集中能找到的最大组合,构成的三角形就是跨度最大的。
实现代码(Unity C#)
先获取LineRenderer的点集:
LineRenderer lineRenderer = GetComponent<LineRenderer>(); Vector3[] points = new Vector3[lineRenderer.positionCount]; lineRenderer.GetPositions(points);
实现一个通用的找最远点工具方法:
Vector3 FindFarthestPoint(Vector3 target, Vector3[] pointSet) { float maxDist = 0f; Vector3 farthest = Vector3.zero; foreach (var point in pointSet) { float currentDist = Vector3.Distance(target, point); if (currentDist > maxDist) { maxDist = currentDist; farthest = point; } } return farthest; }
执行两次查找得到目标点:
Vector3 origin = Vector3.zero; Vector3 pointA = FindFarthestPoint(origin, points); Vector3 pointB = FindFarthestPoint(pointA, points); // 此时origin、pointA、pointB就是所需的三个点,可用于绘制三角形
原理说明
这个逻辑基于点集直径(点集中最远两点的距离)的查找规则:
- 第一次找到的点A,是原点能触及的最远点;
- 第二次找到的点B,是点A能触及的最远点,此时AB就是整个点集的直径,而OB的距离也必然处于点集中的较大区间,三者构成的三角形自然满足“彼此距离最远”的要求。
特殊场景处理
- 若所有点都与原点重合:直接返回任意两个点即可(实际开发中LineRenderer一般不会出现这种无效点集);
- 若点集仅包含原点和另一个唯一点:此时无法构成有效三角形,可根据业务需求添加提示或兜底逻辑。
内容的提问来源于stack exchange,提问作者KeepCool
相关产品推荐
相关产品推荐

