closestLinePoints
Definition
-- @/lua/common/mathlib.lua:652
-- returns xnormals for the two lines: http://geomalgorithms.com/a07-_distance.html
function closestLinePoints(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
-- handles the following cases vv == 0, uu == 0, u // v
if vv == 0 then
return -ru / (uu + 1e-30), 0
else
return 0, rv / (vv + 1e-30)
end
else
return (uv*rv - vv*ru) / D, (uu*rv - uv*ru) / D
end
end
Callers
@/lua/ge/extensions/editor/vehicleEditor/staticEditor/vePartTree.lua
if not hitNodes and imguiNotHovered then
local xnorm1, xnorm2 = closestLinePoints(rayStartPos, rayEndPos, p1, p2)
if xnorm2 >= 0 and xnorm2 <= 1 then
@/lua/ge/extensions/editor/gen/utils.lua
--intersectsRay_Plane
local s,t = closestLinePoints(line[1], line[2], b, core_camera.getPosition())
-- lo('?? aDS:'..tostring(s)..':'..tostring(t))
@/lua/ge/extensions/editor/gen/world.lua
local function ray2segment(ray, a, b)
local s = closestLinePoints(a, b, ray.pos, ray.pos + ray.dir)
if 0 <= s and s <= 1 then
local p = ray.pos + d*ray.dir
local s = closestLinePoints(
base2world(desc, ij)+vup, base2world(desc, {ij[1],ij[2]+1}) + vup,
U.dump(plate2, '??+++++**** PLATE2 istart:'..2)
local p1, p2 = closestLinePoints(
plate1[2], plate1[3], plate2[1], plate2[2])
-- ami = a
local s = closestLinePoints(base[k], U.mod(k+1,base), a, a+vec3(0,0,1))
bmi = base[k] + (U.mod(k+1,base) - base[k])*s
ami = a
local s = closestLinePoints(floorpre.base[k], U.mod(k+1,floorpre.base), a, a+vec3(0,0,1))
bmi = floorpre.base[k] + (U.mod(k+1,floorpre.base) - floorpre.base[k])*s
lo('?? HIT_edge:'..dmi, true)
local s = closestLinePoints(floorpre.base[imi], U.mod(imi+1,floorpre.base), a, a+vec3(0,0,1))
-- lo('?? for_s:'..imi..':'..s)
if dmi < near_dist then
local s = closestLinePoints(floorpre.base[imi], U.mod(imi+1,floorpre.base), a, a+vec3(0,0,1))
-- lo('?? for_s:'..imi..':'..s)
local campos = core_camera.getPosition()
local s = closestLinePoints(p, p + vec3(0,0,floor.h), campos, campos + ray.dir)
local ps = p + vec3(0,0,floor.h*s)
@/lua/ge/extensions/editor/gen/decal.lua
e2p = epos(rd.body, e2, side)
s = closestLinePoints(e1p, e2p, p, p+U.vturn(e2p-e1p,math.pi/2))
if s>1 then
e2p = epos(rd.body, e2, side)
s = closestLinePoints(e1p, e2p, p, p+U.vturn(e2p-e1p,math.pi/2))
end
e2p = epos(rd.body, e2, side)
s = closestLinePoints(e1p, e2p, p, p+U.vturn(e2p-e1p,math.pi/2))
end
e2p = epos(rd.body, e2, side)
s = closestLinePoints(e1p, e2p, p, p+U.vturn(e2p-e1p,math.pi/2))
if e1 == 0 and e2 == rd.ne-1 then break end
e2p = epos(rd.body, e2, side)
s = closestLinePoints(e1p, e2p, p, p+U.vturn(e2p-e1p,math.pi/2))
if e1 == 0 and e2 == rd.ne-1 then break end
local vn = U.vturn(e2-e1, math.pi)
local s = closestLinePoints(e1, e2, p, p+vn)
if dmi < rwidth + mantle then
local p1, p2 = closestLinePoints(U.proj2D(aeinfo[imi].pos), U.proj2D(aeinfo[imi+1].pos), t, U.proj2D(t))
-- TODO: p1 may be > 1 (non-ontersecting segments)
local t = U.proj2D(p)
local p1, p2 = closestLinePoints(
U.proj2D(rd:getMiddleEdgePosition(i)), U.proj2D(rd:getMiddleEdgePosition(i+1)),
@/lua/ge/extensions/editor/gen/top.lua
local v1,v2 = U.mod(i+k,base),U.mod(i+k+1,base)
local s = closestLinePoints(v1, v2, u1, u2)
-- lo('?? if_cross:'..k..'>'..s..'<'..U.mod(i+k,#base)..':'..U.mod(i+k+1,#base)..':'..i..':'..U.mod(i+1,#base))
@/lua/ge/extensions/editor/toolUtilities/geom.lua
local function isLineSegIntersect(a, b, c, d)
local xnorm, xnorm2 = closestLinePoints(a, b, c, d)
return xnorm >= 0.0 and xnorm <= 1.0 and xnorm2 >= 0.0 and xnorm2 <= 1.0
local function intersection2LineSegs(p1, p2, q1, q2, out)
local xnorm, xnorm2 = closestLinePoints(p1, p2, q1, q2)
if xnorm >= 0.0 and xnorm <= 1.0 and xnorm2 >= 0.0 and xnorm2 <= 1.0 then
@/lua/vehicle/ai.lua
else
local e1Xnorm, e2Xnorm = closestLinePoints(e1P1, e1P2, e2P1, e2P2)
local e2Xnorm2 = closestLinePoints(e2P1, e2P2, e1P1, e1P2)
local e1Xnorm, e2Xnorm = closestLinePoints(e1P1, e1P2, e2P1, e2P2)
local e2Xnorm2 = closestLinePoints(e2P1, e2P2, e1P1, e1P2)
local _, e1R2 = mapData:getEdgeRadii(wp1, wp2)
local _, t2 = closestLinePoints(newNode.pos, newNode.pos + newNode.normal, n1.posOrig, n2.posOrig)
newNode.posOrig:set(t2 * (push3(n2.posOrig) - n1.posOrig) + n1.posOrig)
local edgeNormal = (push3(n1.posOrig) - n2.posOrig):cross(newNode.biNormal):normalized():copy()
local _, t2 = closestLinePoints(newNode.posOrig, newNode.posOrig + newNode.normal, plan[i].posOrig + plan[i].radiusOrig * edgeNormal, plan[i+1].posOrig + plan[i+1].radiusOrig * edgeNormal)
local limPos = linePointFromXnorm(plan[i].posOrig + plan[i].radiusOrig * edgeNormal, plan[i+1].posOrig + plan[i+1].radiusOrig * edgeNormal, max(0, min(1, t2)))
local xnorm1, xnorm2 = closestLinePoints(posF, posR, rl, fl)
local xnorm3, xnorm4 = closestLinePoints(posF, posL, rr, fr)
local xnorm1, xnorm2 = closestLinePoints(posF, posR, rl, fl)
local xnorm3, xnorm4 = closestLinePoints(posF, posL, rr, fr)
local n1ext, n2ext = n1pos - extVec, n2pos + extVec
local rnorm, vnorm = closestLinePoints(n1ext, n2ext, plPosFront, plPosRear)
local targetLineDir = vec3(-segDir.y, segDir.x, 0); targetLineDir:normalize()
local xnorm1 = closestLinePoints(playerNodePos1, playerNodePos1 + targetLineDir, player.pos, player.pos + player.dirVec)
local xnorm2 = closestLinePoints(playerNodePos1, playerNodePos1 + targetLineDir, ego.pos, ego.pos + ego.dirVec)
local xnorm1 = closestLinePoints(playerNodePos1, playerNodePos1 + targetLineDir, player.pos, player.pos + player.dirVec)
local xnorm2 = closestLinePoints(playerNodePos1, playerNodePos1 + targetLineDir, ego.pos, ego.pos + ego.dirVec)
-- player xnorm and ego xnorm get interpolated here
@/gameplay/missionTypes/aiRace/customNodes/collisionTrackingNode.lua
local p = i < 4 and i + 1 or 1
local xnorm1, xnorm2 = closestLinePoints(bbA:getPoint(a):z0(), centerB:z0(), bbB:getPoint(b):z0(), bbB:getPoint(bbPoints[p]):z0())
if xnorm1 > 0 and xnorm1 < 1 and xnorm2 > 0 and xnorm2 < 1 then
@/lua/ge/extensions/editor/gen/region.lua
-- out.awhite[#out.awhite+1] = p
local s = closestLinePoints(a, b, p, p + vec3(0,0,1))
-- lo('?? for_s:'..i..':'..j..':'..tostring(s)..'<'..tostring(spre))
if ppre then
local s = closestLinePoints(ppre, p, a, a + vec3(0,0,1))
if 0 <= s and s < 1 then
end
s = closestLinePoints(ppre, p, b, b + vec3(0,0,1))
if 0 <= s and s < 1 then
local x,y = U.lineCross(anode[ni],anode[ni-side.dir],line[1],line[2])
local s = closestLinePoints(
anode[ni-side.dir], anode[ni],
-- start on side
local s = closestLinePoints(
anode[ni-side.dir], anode[ni],
for i = #basepre/2,#basepre/2+1 do
local s = closestLinePoints(basepre[i], basepre[i+1], p, p + vec3(0,0,1))
if 0 <= s and s < 1 then
@/lua/ge/extensions/editor/vehicleEditor/liveEditor/veJBeamPicker.lua
if imguiNotHovered then
local xnorm1, xnorm2 = closestLinePoints(rayStartPos, rayEndPos, beamPos1, beamPos2)
if xnorm2 >= 0 and xnorm2 <= 1 then
@/lua/ge/extensions/editor/gen/mesh.lua
local pos2,dir2 = av[mdata.faces[i].v+1], (av[mdata.faces[j].v+1]-av[mdata.faces[i].v+1]):normalized()
local s,r = closestLinePoints(pos, dir, pos2, dir2)
local d = (pos + dir*s - (pos2 + dir2*r)):length()
--[[
local s1 = closestLinePoints(pos, dir, av[mdata.faces[i].v+1], av[mdata.faces[i+1].v+1] - av[mdata.faces[i].v+1])
local s2 = closestLinePoints(pos, dir, av[mdata.faces[i+1].v+1], av[mdata.faces[i+2].v+1] - av[mdata.faces[i+1].v+1])
local s1 = closestLinePoints(pos, dir, av[mdata.faces[i].v+1], av[mdata.faces[i+1].v+1] - av[mdata.faces[i].v+1])
local s2 = closestLinePoints(pos, dir, av[mdata.faces[i+1].v+1], av[mdata.faces[i+2].v+1] - av[mdata.faces[i+1].v+1])
local s3 = closestLinePoints(pos, dir, av[mdata.faces[i+2].v+1], av[mdata.faces[i].v+1] - av[mdata.faces[i+2].v+1])
local s2 = closestLinePoints(pos, dir, av[mdata.faces[i+1].v+1], av[mdata.faces[i+2].v+1] - av[mdata.faces[i+1].v+1])
local s3 = closestLinePoints(pos, dir, av[mdata.faces[i+2].v+1], av[mdata.faces[i].v+1] - av[mdata.faces[i+2].v+1])
lo(s1..':'..s2..':'..s3)
@/lua/ge/extensions/editor/vehicleEditor/staticEditor/veStaticRenderView.lua
if arrowVec:dot(vec3(0,-1,0)) < 0.99 then
local xnorm1, xnorm2 = closestLinePoints(rayStartPos, rayEndPos, zeroVec, arrowVec)
@/lua/ge/map.lua
--local pos1 = l1n1pos + (l1n2pos - l1n1pos):normalized() * l1n1rad -- why do this?
local l1xn, l2xn = closestLinePoints(l1n1pos, l1n2pos, edges[l_id][3].inPos, edges[l_id][3].outPos)
if l2xn >= 0 and l2xn <= 1 and l1xn <= 0 and l1xn > minXnorm then -- find largest negative xnorm
local l2n2rad = edges[j][3].outRadius
local l1xn, l2xn = closestLinePoints(l1n1pos, l1n2pos, l2n1pos, l2n2pos)
if l1xn > 0 and l1xn < 1 and l2xn > 0 and l2xn < 1 then