Изменения

Перейти к: навигация, поиск

Предикат "левый поворот"

1285 байт добавлено, 19:12, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{В разработке}}Допустим нам дана задача: Даны два отрезка AB , которые задаются начальной и конечной точками <tex>a,b\ \mathcal{2}\ \mathbb R^2</tex> и CD определяются как множества точек <tex>s\ =\ \{(они могут вырождаться в точки1-t)a + tb,\ t\ \in [0;1]\}</tex>. Требуется проверить, пересекаются они на плоскости или нетсуществование множества их общих точек. Для упрощения определения этого факта в вычислительной геометрии используется предикат "''левый поворот" '' (или "''по часовой стрелке"''). Для начала разберемсяРассмотрим возможные расположения точек и самих отрезков относительно друг друга: [[Файл:Cross.png]][[Файл:Two_segments.png]][[Файл:Touch.jpg]] Определим, что за зверь такой - Предикатлежат ли точки концов отрезков по разные стороны от другого отрезка.
{{Определение
|definition =
'''Предикат''' <tex dpi = "120">$$\operatorname{LeftTurn}(лат. '''praedicatum''' — заявленноеa, упомянутоеb, сказанноеc) — любое математическое высказывание=\left\{\begin{array}{rl}-1 &\mbox{, в котором естьif}\ (c - a)\times(b - a) < 0\\0 &\mbox{, по меньшей мереif}\ (c - a)\times(b - a) = 0\\1 &\mbox{, одна переменнаяif}\ (c - a)\times(b - a) > 0\end{array}\right.$$</tex>
}}
Распишем подробнее:<tex dpi =120>(c - a)\times(b - a) = Примеры (c_x - a_x)(b_y - a_y) - (c_y - a_y)(b_x - a_x) =V</tex> Какие при этом у нас будут погрешности? Допустим, что все числа положительные и будем писать без модулей: '''Замечание:''' при сложении складываются абсолютные погрешности, при умножении складываются относительные погрешности. <tex dpi ="150"> \delta (c - a)\times(b - a) = A \varepsilon \left(\frac{(c_x + a_x)}{(c_x \cdot a_x)} + \frac{(b_y + a_y)}{(b_y \cdot a_y)}\right) + B \varepsilon \left(\frac{(c_y + a_y)}{(c_y \cdot a_y)} + \frac{(b_x + a_x)}{(b_x \cdot a_x)}\right)</tex> Именно поэтому, когда угол между отрезками АВ и АС ''крайне мал'', мы можем получить неверное значение предиката.
- Например, обозначим предикатом EQ(x, y) отношение равенства («x = y»), где ''x'' и ''y'' принадлежат множеству вещественных чисел. В этом случае предикат EQ будет принимать истинное значение для всех равных x и y[[Файл:Tiny_angle.jpg]]
- Более житейским примером может служить предикат ПРОЖИВАЕТЗаметим, что все координаты (xа, yзначит, zи наши вычисления) для отношения «x проживает производятся в городе y на улице z» или ЛЮБИТ(xвещественных числах, а это значит, y) для «x любит y»что при вычислениях мы можем допустить ошибку.Распишем вещественное исчисление:
<tex dpi = 140>V = (c - a)\times(b - a) \approx (c_x \ominus a_x)\otimes(b_y \ominus a_y) \ominus (c_y \ominus a_y)\otimes(b_x \ominus a_x) =</tex>
Итак, у нас есть задача, с чего начнем её решать? Какие вообще могут быть расположения точек и самих отрезков относительно друг друга?<tex dpi = 130>= \big((c_x - a_x)(b_y - a_y)(1 + \delta_1)(1 + \delta_2)(1 + \delta_3)\ -</tex>
[[Файл:Cross.png]][[Файл:Two_segments.png]][[Файл:Touch.jpg]]<tex dpi = 130>-\ (c_y - a_y)(b_x - a_x)(1 + \delta_4)(1 + \delta_5)(1 + \delta_6)\big)(1 + \delta_7) = \tilde{V}</tex>
Одно из решений - определить, лежат ли точки концов отрезков по разные стороны от другого отрезка. Вот тут нам и поможет наш предикат, где два из трех аргументов (например a и b) это точки концов одного отрезка, а последний - один из концов другого отрезка.{{Определение|definition <tex dpi =Left_Turn(a, b, c) 130>\mid\delta_i\mid \le \varepsilon_m = true, если (b 2^{- a)*(c - a) 54}</tex> 0}};
ЗаметимПолучим некую окрестность <tex dpi = 130>|V - \tilde{V}| \le 8 \varepsilon_m</tex>, что все координаты (а значит и наши вычисления) производятся если ноль попадает в вещественных числахнаш интервал, то приходится пользоваться более тяжелой артиллерией, а это значиттакими как [[Adaptive precision arithmetic|''adaptive precision arithmetic'']], что при вычислениях мы можем допустить ошибкулибо [[Интервальная арифметика |''интервальная арифметика'']]. Какую? Посмотрим внимательнее на наш предикатВо второй, исходные переменные будут вырожденными интервалами. Ошибка раскрывается тогдаИз-за погрешностей, когда угол между отрезками АВ и АС крайне малвозникающих при округлении вещественных чисел, истинные значения операций нам будут неизвестны, но они обязательно будет содержаться в посчитанных интервалах.
'''Замечание:''' расписанное неравенство смотрите в [[Файл:Tiny_angleПредставление_чисел_с_плавающей_точкой#.D0.A0.D0.B0.D1.81.D1.87.D0.B5.D1.jpg82|''другом конспекте'']]
=Bounding box=Ещё следует обратить внимание на граничные случаи, когда какие-то точки попадают на саму прямую. При этом возникает единственный особый случай, когда вышеописанные проверки ничего не дадут — случай, когда оба отрезка лежат на одной прямой. Этот случай надо рассмотреть рассматривается отдельно. Для этого достаточно проверить, что проекции этих двух отрезков на оси X и Y пересекаются (часто эту проверку называют "''проверкой на bounding box"''). Но отметим, что чаще всего данный предикат используют для трех точек, где одна из них относится сразу к двум отрезкам.
[[Файл:Bounting_box().png]]
[[Файл:Bounting_box_.png]]
== Ссылки == * [http[Категория://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%B8%D0%BA%D0%B0%D1%82 wikipedia.ru - ПредикатВычислительная геометрия]* [http://e-maxx.ru/algo/segments_intersection_checking e-maxx.ru/algo - Проверка двух отрезков на пересечение]
1632
правки

Навигация