Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
5-1130421252
Priest
2005-10-27 17:54
2006.04.30
Выпадающий список знач свойства и ReadOnly


2-1145027166
Ибрагим
2006-04-14 19:06
2006.04.30
form


15-1144464917
SergeiV
2006-04-08 06:55
2006.04.30
Интернет через локальную сеть


9-1128962305
JurMan
2005-10-10 20:38
2006.04.30
OnLine games


15-1144321685
Der Nechk@ssoff
2006-04-06 15:08
2006.04.30
Мошенникам-тюрьма!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский