Здравствуйте, гость ( Вход | Регистрация )

> Принадлежность точки области на плоскости
DarkMaster
сообщение 11.8.2021, 15:44
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29657
Пользователь №: 11.279



Первая часть задачи стоит в постороении ромба (коортинаты посчитать) отностиельно некоторой наклоненной прямой. Тут вроде синусами посчитать можно, но это надо садиться вспоминать.
А вот вторая интереснее. Нужно понять принажлежит ли некоторая точка данной области.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
sutra
сообщение 13.8.2021, 15:53
Сообщение #2


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Я пока обходился без этого, но в принципе даже интересно стало. Решил "набросать" на вскидку, исходя из базовых школьных знаний тригонометрии (других увы нет). Не проверял толком как работает, чисто для логического примера. Можно работать абсолютно с любым многоугольником. Рисовать такую функцию - лень, да и нет необходимости пока.
Код
--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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения



Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 8.7.2025, 6:11
Designed by Nickostyle