我有一个点(A)和一个向量(V)(假设它无限长),我想找到离我的原始点(A)最近的线上的点(B)。使用Unity Vector2或Vector3,最简单的表达式是什么?
我有一个点(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;
}
有限长度:
如果你有一条有限长度的线段,其起始和结束位置为start和end,获取方向并从起点进行投影。同时,使用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;
}
// For finite lines:
Vector3 GetClosestPointOnFiniteLine(Vector3 point, Vector3 line_start, Vector3 line_end)
{
Vector3 line_direction = line_end - line_start;
float line_length = line_direction.magnitude;
line_direction.Normalize();
float project_length = Mathf.Clamp(Vector3.Dot(point - line_start, line_direction), 0f, line_length);
return line_start + line_direction * project_length;
}
// For infinite lines:
Vector3 GetClosestPointOnInfiniteLine(Vector3 point, Vector3 line_start, Vector3 line_end)
{
return line_start + Vector3.Project(point - line_start, line_end - line_start);
}
对于无限行:
最初的回答:
Vector3 GetPoint(Vector3 p, Vector3 a, Vector3 b)
{
return a + Vector3.Project(p - a, b - a);
}
Vector3
的情况,并且如果参数为Vector2
,则会自动转换为Vector2
。如果需要,输出将隐式转换为Vector2
。"最初的回答"private Vector3 GetPointOnLine(Vector3 lineOrigin, Vector3 lineDirection, Vector3 point)
=> lineOrigin - point - Vector3.Dot(lineOrigin - point, lineDirection) * lineDirection;
public Vector2 FindNearestPointOnLine(Vector2 origin, Vector2 end, Vector2 point)
{
//Get heading
Vector2 heading = (end - origin);
float magnitudeMax = heading.magnitude();
heading = Vector2.Normalize(heading);
//Do projection from the point but clamp it
Vector2 lhs = point - origin;
float dotP = Vector2.Dot(lhs, heading);
dotP = UnityEngine.Mathf.Clamp(dotP, 0f, magnitudeMax);
return origin + heading * dotP;
}
vector2.magnitude未找到