VE Lua Documentation

Press F to search!

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