![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Принадлежит ли точка прямоугольнику ...
Lexa11_2002 © (2006-03-22 21:52:00)Народ подскажите функцию, как определить принадлежит ли точка прямоугольнику заданному координатами, координаты точки заданы
Deka (2006-03-25 11:26:00) [1]Что касается "игороков", то можно сложить углы между векторами проведенными из заданной точки к вершинам прямоугольника (многоугольника). Если сумма всех углов равно 360 градусов - точка в прямоугольнике (многоугольнике).
Palladin (2006-03-24 21:12:00) [2]
> (пересечение с вершиной считать за "адын")
извинияюсь, просчет... такую ситуацию нужно рассматривать отдельно...
Palladin (2006-03-24 21:10:00) [3]определяется окаймляющий прямоугольник со сторонами параллельними осям, и считается количество пересечений сторон исходного прямоугольника (N-угольника) с отрезком построенным от заданной точки до любой стороны окаймляющего прямоугольника (пересечение с вершиной считать за "адын"). если количество пересечений четное, значит точка не попадает, нечетное - попадает. исходники приводилось года три четыре назад... может в архивах есть :) писать снова... лень
Джо (2006-03-24 17:37:00) [4]> [21] Leonid Troyanovsky © (24.03.06 16:25)
Да, только если координаты floating point, то привести к целым (простым умножением), ну, и вычесть минимальную координату, для подстраховки, ибо: "Region coordinates are represented as 27-bit signed integers". Сам так делал, для различных полигонов.
Jeer (2006-03-24 17:30:00) [5]Расположение в одной полуплоскости веера прямых, исходящих из точки к вершинам.
isasa (2006-03-24 16:51:00) [6]А интересно, как "игроки" решают проблему :)
Defunct (2006-03-24 16:30:00) [7]isasa © (24.03.06 16:09) [20]
сории, да там одно слово "требуется" лишнее ;>
осталось там при редактировании так что это моя вина, что вы не заметили все сразу..
> Тогда "выгоднее" поместить начало координат в одну из вершин ....
Я бы сказал не "выгоднее", а нагляднее... Еще нагляднее поместить начало координат в точку (x1, y1). Хотя вычислительная сложность при этом незначительно [u]увеличится[/u].
Leonid Troyanovsky (2006-03-24 16:25:00) [8]
> Джо © (24.03.06 14:01) [17]
> Ага, тут с этими афинными преобразованиями функция выйдет
> совсем монструозной :) Ей-
Если сделать из него регион, то функция выйдет совсем простой
PtInRegion.
--
Regards, LVT.
isasa (2006-03-24 16:09:00) [9]Defunct © (24.03.06 15:54) [18]
... и для точки принадлежность которой требуется к прямоугольнику требуется найти.
Сорри, недочитал. Тогда "выгоднее" поместить начало координат в одну из вершин ....
isasa (2006-03-24 16:06:00) [10]Defunct © (24.03.06 15:54) [18]
А координаты самой точки не надо пересчитывать?
Джо © (24.03.06 14:01) [17]
Ей-богу, быстрее будет [10] grisme.
Очень изящно. Запомнил. Но действительно для тех фигур где легко посчитать площадь, а [8] для всех "полностью выпуклых".
:)
Универсального способа не знаю
Defunct (2006-03-24 15:54:00) [11]> А теперь - функцию пересчета координат вершин прямоугольника(TRect)?
Хм.. ну собсно там формула простейшая (один cos и 1 sin):
поворот относительно точки (x1, y1) для точки (x4, y4) и для точки принадлежность которой требуется к прямоугольнику требуется найти.
Находим вектор поворота для точки (x4, y4) - складываем его с точкой (x4, y4) - TRect готов, дальше домножаем этот вектор на вектор образуемый точками (x4, y4) и искомой точкой, складываем полученный вектор с координатами точки.
Джо (2006-03-24 14:01:00) [12]Ага, тут с этими афинными преобразованиями функция выйдет совсем монструозной :) Ей-богу, быстрее будет [10] grisme.
isasa (2006-03-24 12:11:00) [13]Defunct © (24.03.06 02:58) [15]
Безусловно.
А теперь - функцию пересчета координат вершин прямоугольника(TRect)?
X(x1,y1...) -> TRect(...) ?
Defunct (2006-03-24 02:58:00) [14]> 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;
Cash (2006-03-23 22:50:00) [15]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 на этой прямой. Если, к примеру, у нас
есть левые верхняя и нижняя точки прямоугольника, то мы можем
проверить не находится ли искомая точка справа от образованной
теми двумя точками прямой.
Cash (2006-03-23 22:14:00) [16]Удалено модератором
Примечание: Модераторы, они, знаете-ли тоже люди :)
Jeer (2006-03-23 19:14:00) [17]А не использовать ли тут общую теорию относительности ?
Самое место.
(2006-03-23 17:50:00) [18]Удалено модератором
grisme (2006-03-23 17:37:00) [19]я уже отвечал как-то..)
найди площади треугольников, образованных каждой парой вершин и точкой, потом сложи. Если сумма равна площади прямоугольника-она внутри, иначе-снаружи. Все просто..)
isasa (2006-03-23 12:11:00) [20]Туманно :)
Пример. Точка лежит внутри четырехугольника, если при обходе его по сторонам против часовой стрелки, она слева от прямых(бесконечных векторов), образующих четырехугольник.
:)
Главное не терять направление движения.