如何在线找到最近的点?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在线找到最近的点?相关的知识,希望对你有一定的参考价值。

我有一个点(A)和一个向量(V)(假设它是无限长度),我想在线上找到最接近原点(A)的点(B)。使用Unity Vector2或Vector3获取此功能的最简单的表达方式是什么?

答案

无限长度:

如果您的线条具有无限长度的开始和方向,请计算线方向的点积,然后将其乘以方向并将起点添加到该方向。

public Vector2 FindNearestPointOnLine(Vector2 origin, Vector2 direction, Vector2 point)
{
    direction.Normalize();
    Vector2 lhs = point - origin;

    float dotP = Vector2.Dot(lhs, direction);
    return origin + direction * dotP;
}

有限长度:

如果您的行具有从开始到结束位置的有限长度,则获取标题执行从起点到终点的投影。另外,使用Mathf.Clamp来拍击它,以防线路关闭。

public Vector2 FindNearestPointOnLine(Vector2 origin, Vector2 end, Vector2 point)
{
    //Get heading
    Vector2 heading = (end - origin);
    float magnitudeMax = heading.magnitude;
    heading.Normalize();

    //Do projection from the point but clamp it
    Vector2 lhs = point - origin;
    float dotP = Vector2.Dot(lhs, heading);
    dotP = Mathf.Clamp(dotP, 0f, magnitudeMax);
    return origin + heading * dotP;
}
另一答案

我假设你不知道两个点的位置,因为找到两个已知点之间的距离的解决方案是简单的减法。如果你想动态找到距离,我建议使用raycasting

将这样的脚本添加到您认为pointA可能适合您的GameObject:

using UnityEngine;

public class Raycasting : MonoBehaviour 
{
    [SerializeField]
    private LayerMask pointMask; //Set this to the same tag as any GameObject you consider a "point"
    private Vector2 pointA, distance;

    private void Update()
    {
        CheckForPoint();

        Debug.Log(distance);
    }

    private void CheckForPoint()
    {
        pointA = transform.position; //The GameObject's current position in the world

        RaycastHit2D pointB =  Physics2D.Raycast(pointA, Vector2.right * Mathf.Sign(transform.localScale.x), Mathf.Infinity, pointMask);

        //Draws a visible ray in the game view (must have gizmos enabled)
        Debug.DrawRay(pointA, Vector2.right * Mathf.Sign(transform.localScale.x), Color.green); 

        if (pointB)
        {
            distance = (Vector2)pointB.transform.position - pointA;
        }
    }
}

确保你正在寻找的点上有对撞机;然后你可以设置光线投射到Mathf.Infinity(或你想要的任何其他长度)的距离,并且pointB将是光线碰撞的第一个物体。

你可以阅读更多关于qazxsw poi API qazxsw poi的信息,通过相同的方法也可以在3D中工作。

另一答案
Physics2D.Raycast

以上是关于如何在线找到最近的点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在距离另一个点最近的点数组中找到点

如何计算 PostGIS 中离线串最近的点?

如何从球面上的当前点(纬度/经度)找到线段上最近的点

如何在片段中使用 GetJsonFromUrlTask​​.java

python - 如何使用python pandas为超过1M点的点集中的每个点找到最近的8个点

tarjan算法求最近公共祖先