如何在线找到最近的点?
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
以上是关于如何在线找到最近的点?的主要内容,如果未能解决你的问题,请参考以下文章
如何在片段中使用 GetJsonFromUrlTask.java