Я пока обходился без этого, но в принципе даже интересно стало. Решил "набросать" на вскидку, исходя из базовых школьных знаний тригонометрии (других увы нет). Не проверял толком как работает, чисто для логического примера. Можно работать абсолютно с любым многоугольником. Рисовать такую функцию - лень, да и нет необходимости пока.
Код
--lua
local function AngleLine(xA,yA,xB,yB) -- функция определения угла произвольной прямой
local katet=math.abs(xB-xA)
local BasicAngle=math.deg(math.acos(katet/math.sqrt(katet^2+(yB-yA)^2))) -- катет делим на гипотенузу
local FinalAngle=BasicAngle
if xB<xA then FinalAngle=180-BasicAngle end -- зеркалируем угол
if yB<yA then -- коррекция для 3-й и 4-й четверти
if xB<xA then
FinalAngle=FinalAngle+BasicAngle*2
else
FinalAngle=360-BasicAngle
end
end
return FinalAngle
end
local dot={50,200} -- тут можно поиграться с координатами
local romb={{100,100},{50,200},{300,300},{150,200}} -- да и тут можно, можно и не ромб
--/\ снизу вверх по часовой, ординаты в плюс - на север (лень в нормальные координаты переводить)
local angle1=AngleLine(romb[1][1],romb[1][2],dot[1],dot[2])
local angle2=AngleLine(romb[3][1],romb[3][2],dot[1],dot[2])
local result=true
-- лень делать функцию - чисто пример
if angle1 > AngleLine(romb[1][1],romb[1][2],romb[2][1],romb[2][2])then -- снизу влево вверх
result=false
elseif angle1 < AngleLine(romb[1][1],romb[1][2],romb[4][1],romb[4][2])then -- снизу вправо вверх
result=false
elseif angle2 < AngleLine(romb[3][1],romb[3][2],romb[2][1],romb[2][2])then -- сверху влево вниз
result=false
elseif angle2 > AngleLine(romb[3][1],romb[3][2],romb[4][1],romb[4][2])then -- сверху вправо вниз
result=false
end
if result then
log("Точка принадлежит ромбу")
else
log("Точка НЕ принадлежит ромбу")
end