Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Принадлежит ли точка прямоугольнику ...   Найти похожие ветки 

 
Lexa11_2002   (2006-03-22 21:52) [0]

Народ подскажите функцию, как определить принадлежит ли точка прямоугольнику заданному координатами, координаты точки заданы


 
Джо ©   (2006-03-22 21:58) [1]

PtInRect? Ей-богу, самому проще написать ;)


 
Lexa11_2002   (2006-03-22 22:03) [2]

Я немного не так выразился... мне надо как такую функцию  самому написать. Как алгоритм пишится намекни, если можешь


 
Джо ©   (2006-03-22 22:13) [3]

Прямоугольник задан прямоугольными координатами двух противоположных вершин?


 
Sergey Masloff   (2006-03-22 22:18) [4]

Джо ©   (22.03.06 22:13) [3]
Ну как двумя? Стороны м.б. не параллельны осям...
Но все равно алгоритм нехитрый.


 
Джо ©   (2006-03-22 22:20) [5]

> [4] Sergey Masloff   (22.03.06 22:18)
> Джо ©   (22.03.06 22:13) [3]
> Ну как двумя? Стороны м.б. не параллельны осям...

Я поэтому и спросил. Иногда задается структурой TRect, двумя вершинами, стороны параллельны осям.


 
имя   (2006-03-22 23:06) [6]

Удалено модератором


 
Просто Лёха   (2006-03-23 10:56) [7]

Удалено модератором
Примечание: Оффтоп...


 
isasa ©   (2006-03-23 12:03) [8]

Обходишь прямоуголиник по кажной стороне (x1,y1,x2,y2), по часовой или против часовой(в одну сторону!).
Сторона - прямая, заданая вершинами(уравнение прямой, проходящей через две точки).
Если заданная точка лежит "с одной и той же стороны" прямых (в данном случае четыре), то она внутри четырехугольника.


 
isasa ©   (2006-03-23 12:11) [9]

Туманно :)
Пример. Точка лежит внутри четырехугольника, если при обходе его по сторонам против часовой стрелки, она слева от прямых(бесконечных векторов), образующих четырехугольник.
:)
Главное не терять направление движения.


 
grisme ©   (2006-03-23 17:37) [10]

я уже отвечал как-то..)
найди площади треугольников, образованных каждой парой вершин и точкой, потом сложи. Если сумма равна площади прямоугольника-она внутри, иначе-снаружи. Все просто..)


 
имя   (2006-03-23 17:50) [11]

Удалено модератором


 
Jeer ©   (2006-03-23 19:14) [12]

А не использовать ли тут общую теорию относительности ?
Самое место.


 
Cash ©   (2006-03-23 22:14) [13]

Удалено модератором
Примечание: Модераторы, они, знаете-ли тоже люди :)


 
Cash ©   (2006-03-23 22:50) [14]

Lexa11_2002   (22.03.06 21:52):
Гы! :)
Придумал!
Заведи себе для помощи запись из 4-х точек (TPoint).
А потом определяй, стоит ли требуемая точка между левой, правой, верхней
и нижней ограничивающими прямыми.

Функция ограничивающей прямой:

Function f(x: integer; P1,P2: TPoint): integer;
var
  pr: single;
begin
  if (P2.Y-P1.Y) <> 0 then pr:=(p2.X-P1.X)/(P2.Y-P1.Y) else pr:=0;
  Result:=Trunc((p1.Y-pr)+(pr*x));
end;


Прямая же проходит через две точки, вот они и нужны для выбора
именно той нужной прямой из всего пространства. А дальше идет
расчет коорднинат точки X на этой прямой. Если, к примеру, у нас
есть левые верхняя и нижняя точки прямоугольника, то мы можем
проверить не находится ли искомая точка справа от образованной
теми двумя точками прямой.


 
Defunct ©   (2006-03-24 02:58) [15]

> isasa ©   (23.03.06 12:11) [9]
е-мае.. У прямоугольника углы прямые! Проще всего повернуть оси так, чтобы прямоугольник представить в виде TRect и сместить точку относительно прямоугольника, ну а дальше просто:

function PtInRect(Pt: Point; R: Rect):boolean;
begin
  Result :=  (Pt.X >= R.Left ) and
                (Pt.X <= R.Right) and
                (Pt.Y >=R.Top) and
                (Pt.Y <= R.Bottom)
end;


 
isasa ©   (2006-03-24 12:11) [16]

Defunct ©   (24.03.06 02:58) [15]
Безусловно.
А теперь - функцию пересчета координат вершин прямоугольника(TRect)?
X(x1,y1...) -> TRect(...) ?


 
Джо ©   (2006-03-24 14:01) [17]

Ага, тут с этими афинными преобразованиями функция выйдет совсем монструозной :) Ей-богу, быстрее будет [10] grisme.


 
Defunct ©   (2006-03-24 15:54) [18]

> А теперь - функцию пересчета координат вершин прямоугольника(TRect)?

Хм.. ну собсно там формула простейшая (один cos и 1 sin):
поворот относительно точки (x1, y1) для точки (x4, y4) и для точки принадлежность которой требуется к прямоугольнику требуется найти.

Находим вектор поворота для точки (x4, y4) - складываем его с точкой (x4, y4) - TRect готов, дальше домножаем этот вектор на вектор образуемый точками (x4, y4) и искомой точкой, складываем полученный вектор с координатами точки.


 
isasa ©   (2006-03-24 16:06) [19]

Defunct ©   (24.03.06 15:54) [18]
А координаты самой точки не надо пересчитывать?

Джо ©   (24.03.06 14:01) [17]
Ей-богу, быстрее будет [10] grisme.

Очень изящно. Запомнил. Но действительно для тех фигур где легко посчитать площадь, а [8] для всех "полностью выпуклых".
:)
Универсального способа не знаю


 
isasa ©   (2006-03-24 16:09) [20]

Defunct ©   (24.03.06 15:54) [18]
... и для точки принадлежность которой требуется к прямоугольнику требуется найти.


Сорри, недочитал. Тогда "выгоднее" поместить начало координат в одну из вершин ....


 
Leonid Troyanovsky ©   (2006-03-24 16:25) [21]


> Джо ©   (24.03.06 14:01) [17]
> Ага, тут с этими афинными преобразованиями функция выйдет
> совсем монструозной :) Ей-


Если сделать из него регион, то функция выйдет совсем простой
PtInRegion.

--
Regards, LVT.


 
Defunct ©   (2006-03-24 16:30) [22]

isasa ©   (24.03.06 16:09) [20]

сории, да там одно слово "требуется" лишнее ;>
осталось там при редактировании так что это моя вина, что вы не заметили все сразу..

> Тогда "выгоднее" поместить начало координат в одну из вершин ....
Я бы сказал не "выгоднее", а нагляднее... Еще нагляднее поместить начало координат в точку (x1, y1). Хотя вычислительная сложность при этом незначительно [u]увеличится[/u].


 
isasa ©   (2006-03-24 16:51) [23]

А интересно, как "игроки" решают проблему :)


 
Jeer ©   (2006-03-24 17:30) [24]

Расположение в одной полуплоскости веера прямых, исходящих из точки к вершинам.


 
Джо ©   (2006-03-24 17:37) [25]

> [21] Leonid Troyanovsky ©   (24.03.06 16:25)

Да, только если координаты floating point, то привести к целым (простым умножением), ну, и вычесть минимальную координату, для подстраховки, ибо: "Region coordinates are represented as 27-bit signed integers". Сам так делал, для различных полигонов.


 
Palladin ©   (2006-03-24 21:10) [26]

определяется окаймляющий прямоугольник со сторонами параллельними осям, и считается количество пересечений сторон исходного прямоугольника (N-угольника) с отрезком построенным от заданной точки до любой стороны окаймляющего прямоугольника (пересечение с вершиной считать за "адын"). если количество пересечений четное, значит точка не попадает, нечетное - попадает. исходники приводилось года три четыре назад...  может в архивах есть :) писать снова... лень


 
Palladin ©   (2006-03-24 21:12) [27]


>  (пересечение с вершиной считать за "адын")


извинияюсь, просчет... такую ситуацию нужно рассматривать отдельно...


 
Deka ©   (2006-03-25 11:26) [28]

Что касается "игороков", то можно сложить углы между векторами проведенными из заданной точки к вершинам прямоугольника (многоугольника). Если сумма всех углов равно 360 градусов - точка в  прямоугольнике (многоугольнике).



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
2-1145082227
pavlin_pah
2006-04-15 10:23
2006.04.30
Stringgrid и Scroll


2-1144938720
Системщик
2006-04-13 18:32
2006.04.30
Десятичный логарифм


2-1144819651
Leshas
2006-04-12 09:27
2006.04.30
Обработка ошибок


3-1141306264
Dosfalcon
2006-03-02 16:31
2006.04.30
Извлечение системного номера записи DBF


6-1137276570
Spirit111
2006-01-15 01:09
2006.04.30
WSAAccept и условная функция lpfnCondition : LPCONDITIONPROC