function GetDistanceToPointBetweenCoords(pos, start, stop)
local startDist, stopDist, length = #(pos - start), #(pos - stop), #(start - stop)
return GetDistanceToLine(startDist, stopDist, length)
end
function GetDistanceToPointAlongCoords(pos, start, stop)
local startDist, stopDist, length = #(pos - start), #(pos - stop), #(start - stop)
return GetDistanceToLineInf(startDist, stopDist, length)
end
function GetDistanceToLine(startDist, stopDist, length)
if math.max(startDist, stopDist) > length then
return math.min(startDist, stopDist)
end
return GetDistanceToLineInf(startDist, stopDist, length)
end
function GetDistanceToLineInf(startDist, stopDist, length)
local s = (1/2) * (startDist + stopDist + length)
local area = math.sqrt(s * (s - startDist) * (s - stopDist) * (s - length))
return area / (length / 2)
end
-- Get angle between two coords via an origin point
-- https://i.imgur.com/2GVvt5I.png
-- Returns a negative value is target is on the left side of the line
function CalculateAngleBetweenPoints(origin, line, target)
local p1x, p1y = origin.x, origin.y
local p2x, p2y = line.x, line.y
local p3x, p3y = target.x, target.y
local numerator = p2y*(p1x-p3x)+p1y*(p3x-p2x)+p3y*(p2x-p1x)
local denominator = (p2x-p1x)*(p1x-p3x)+(p2y-p1y)*(p1y-p3y)
local ratio = numerator / denominator
local anglerad = math.atan(ratio)
local angledeg = (anglerad*180)/math.pi
return angledeg
end
Comments