GE Lua Documentation

Press F to search!

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])