closestLineSegmentPoints
Definition
-- @/lua/common/mathlib.lua:672
-- returns normalized line-local coordinates (xnorms) at which the distance between the two line segments is minimum
function closestLineSegmentPoints(l1p1, l1p2, l2p1, l2p2)
local ux, uy, uz, vx, vy, vz = l1p2.x - l1p1.x, l1p2.y - l1p1.y, l1p2.z - l1p1.z, l2p2.x - l2p1.x, l2p2.y - l2p1.y, l2p2.z - l2p1.z
local uu, vv, uv = ux*ux + uy*uy + uz*uz, vx*vx + vy*vy + vz*vz, ux*vx + uy*vy + uz*vz
local D = uu*vv - uv*uv
local rx, ry, rz = l1p1.x - l2p1.x, l1p1.y - l2p1.y, l1p1.z - l2p1.z
local ru, rv = rx*ux + ry*uy + rz*uz, rx*vx + ry*vy + rz*vz
if D < 1e-20 then
local t = clamp(rv / (vv + 1e-30), 0, 1)
return clamp((t*uv - ru) / (uu + 1e-30), 0, 1), t
else
return clamp((clamp((uu*rv - uv*ru) / D, 0, 1)*uv - ru) / uu, 0, 1), clamp((clamp((uv*rv - vv*ru) / D, 0, 1)*uv + rv) / vv, 0, 1)
end
end
Callers
@/lua/vehicle/ai.lua
local wp3Pos, wp4Pos = mapData:getEdgePositions(path[i], path[i+1])
local e1Xnorm, e2Xnorm = closestLineSegmentPoints(wp1Pos, wp2Pos, wp3Pos, wp4Pos)
local wp1Rad, wp2Rad = mapData:getEdgeRadii(path[i-1], path[i])