You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:21:01