1. Устойчивая реализация алгоритмов вычислительной
геометрии
Антон Ковалев
ЗАО Транзас, СПбГУ ИТМО
октябрь 2011
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 1 / 27
2. Расчеты в вычислительной геометрии
Реализация алгоритмов вычислительной геометрии зачастую очень
сложна, так как:
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 2 / 27
3. Расчеты в вычислительной геометрии
Реализация алгоритмов вычислительной геометрии зачастую очень
сложна, так как:
сложен сам алгоритм (например, incremental segment Voronoi
diagram);
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 2 / 27
4. Расчеты в вычислительной геометрии
Реализация алгоритмов вычислительной геометрии зачастую очень
сложна, так как:
сложен сам алгоритм (например, incremental segment Voronoi
diagram);
в описании алгоритма опущены вырожденные случаи (например,
Bentley-Ottmann);
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 2 / 27
5. Расчеты в вычислительной геометрии
Реализация алгоритмов вычислительной геометрии зачастую очень
сложна, так как:
сложен сам алгоритм (например, incremental segment Voronoi
diagram);
в описании алгоритма опущены вырожденные случаи (например,
Bentley-Ottmann);
вычисления с плавающей точкой дают погрешность, что приводит
к нарушению инвариантов алгоритма.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 2 / 27
6. Расчеты в вычислительной геометрии
Реализация алгоритмов вычислительной геометрии зачастую очень
сложна, так как:
сложен сам алгоритм (например, incremental segment Voronoi
diagram);
в описании алгоритма опущены вырожденные случаи (например,
Bentley-Ottmann);
вычисления с плавающей точкой дают погрешность, что приводит
к нарушению инвариантов алгоритма.
Рассмотрим один из способов справиться с последней проблемой:
фильтрованное вычисление предикатов.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 2 / 27
7. Определение пересечения двух отрезков на плоскости
Определение
Отрезок s задается начальной и конечной точками a, b ∈ R2 и
определяется как множество точек s = (1 − t)a + tb, t ∈ [0; 1] .
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 3 / 27
8. Определение пересечения двух отрезков на плоскости
Определение
Отрезок s задается начальной и конечной точками a, b ∈ R2 и
определяется как множество точек s = (1 − t)a + tb, t ∈ [0; 1] .
Определение
Отрезки s1 и s2 пересекаются, если существует непустое множество
общих точек.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 3 / 27
9. Определение пересечения двух отрезков на плоскости
Определение
1
точка c лежит слева от направленного отрезка s,
Turn(s, c) = −1 точка c лежит справа от направленного отрезка s,
0 s и c коллинеарны.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 4 / 27
10. Определение пересечения двух отрезков на плоскости
Определение
1
точка c лежит слева от направленного отрезка s,
Turn(s, c) = −1 точка c лежит справа от направленного отрезка s,
0 s и c коллинеарны.
Утверждение
Turn(s1 , s2,a ) · Turn(s1 , s2,b ) ≤ 0
s1 s2 ⇐⇒ Turn(s2 , s1,a ) · Turn(s2 , s1,b ) ≤ 0 ,
AABB(s1 ) AABB(s2 ) = ∅
где AABB это axis-aligned bounding box.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 4 / 27
11. Вычисление предиката Turn
Утверждение
sb,x − sa,x cx − sa,x
Turn(s, c) = sign (sb − sa ) × (c − sa ) = sign
sb,y − sa,y cy − sa,y
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 5 / 27
12. Вычисление предиката Turn
Утверждение
sb,x − sa,x cx − sa,x
Turn(s, c) = sign (sb − sa ) × (c − sa ) = sign
sb,y − sa,y cy − sa,y
Проблема?
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 5 / 27
13. Вычисление предиката Turn
Утверждение
sb,x − sa,x cx − sa,x
Turn(s, c) = sign (sb − sa ) × (c − sa ) = sign
sb,y − sa,y cy − sa,y
Проблема? Вычисления с плавающей точкой:
point_2 a ( 3 . 0 , 5 . 0 ) ;
point_2 b = −a ;
point_2 c = a ∗ ( 1 LL << 5 2 ) ;
// Что в е р н е т э т а функция ?
Turn ( segment_2 ( a , b ) , c ) ;
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 5 / 27
14. Вычисление предиката Turn
Вычисление поворота от отрезка и точки плоскости: красный цвет
левый поворот, синий правый, зеленый точка и отрезок
принадлежат одной прямой.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 6 / 27
15. Вычисление предиката Turn
Числа с плавающей точкой
Двоичное число с плавающей точкой:
a = ±1.a1 a2 a3 . . . ap−1 × 2γ , ai ∈ {0, 1}.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 7 / 27
16. Вычисление предиката Turn
Числа с плавающей точкой
Двоичное число с плавающей точкой:
a = ±1.a1 a2 a3 . . . ap−1 × 2γ , ai ∈ {0, 1}.
Определение
ulp(a) = 2−p+1+γ
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 7 / 27
17. Вычисление предиката Turn
Числа с плавающей точкой
Двоичное число с плавающей точкой:
a = ±1.a1 a2 a3 . . . ap−1 × 2γ , ai ∈ {0, 1}.
Определение
ulp(a) = 2−p+1+γ
D множество всех чисел c плавающей точкой c операциями ⊕, , ⊗.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 7 / 27
18. Вычисление предиката Turn
Числа с плавающей точкой
Двоичное число с плавающей точкой:
a = ±1.a1 a2 a3 . . . ap−1 × 2γ , ai ∈ {0, 1}.
Определение
ulp(a) = 2−p+1+γ
D множество всех чисел c плавающей точкой c операциями ⊕, , ⊗.
∀a, b ∈ D, ε = 2−p :
a ⊕ b = (a + b)(1 + δ), |δ| ≤ ε
a b = (a − b)(1 + δ), |δ| ≤ ε
a ⊗ b = ab(1 + δ), |δ| ≤ ε
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 7 / 27
19. Вычисление предиката Turn
Числа с плавающей точкой
Двоичное число с плавающей точкой:
a = ±1.a1 a2 a3 . . . ap−1 × 2γ , ai ∈ {0, 1}.
Определение
ulp(a) = 2−p+1+γ
D множество всех чисел c плавающей точкой c операциями ⊕, , ⊗.
∀a, b ∈ D, ε = 2−p :
a ⊕ b = (a + b)(1 + δ), |δ| ≤ ε
a b = (a − b)(1 + δ), |δ| ≤ ε
a ⊗ b = ab(1 + δ), |δ| ≤ ε
Утверждение
∀a, b, c ∈ D 2 , v = (bx ax ) ⊗ (cy ay ) (by
˜ ay ) ⊗ (cx ax )
v > ˜ ⇒ (b − a) × (c − a) > 0
˜
∃˜ ∈ D :
v < −˜ ⇒ (b − a) × (c − a) < 0
˜
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 7 / 27
20. Вычисление предиката Turn
Расчет ˜
v v
˜
(b − a) × (c − a) ≈ (bx ax ) ⊗ (cy ay ) (by ay ) ⊗ (cx ax )
= (bx − ax )(cy − ay )(1 + δ1 )(1 + δ2 )(1 + δ3 )
− (by − ay )(cx − ax )(1 + δ4 )(1 + δ5 )(1 + δ6 ) (1 + δ7 ),
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 8 / 27
21. Вычисление предиката Turn
Расчет ˜
v v
˜
(b − a) × (c − a) ≈ (bx ax ) ⊗ (cy ay ) (by ay ) ⊗ (cx ax )
= (bx − ax )(cy − ay )(1 + δ1 )(1 + δ2 )(1 + δ3 )
− (by − ay )(cx − ax )(1 + δ4 )(1 + δ5 )(1 + δ6 ) (1 + δ7 ),
|δi | ≤ ε;
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 8 / 27
22. Вычисление предиката Turn
Расчет ˜
v v
˜
(b − a) × (c − a) ≈ (bx ax ) ⊗ (cy ay ) (by ay ) ⊗ (cx ax )
= (bx − ax )(cy − ay )(1 + δ1 )(1 + δ2 )(1 + δ3 )
− (by − ay )(cx − ax )(1 + δ4 )(1 + δ5 )(1 + δ6 ) (1 + δ7 ),
|δi | ≤ ε;
e
= |v − v | ≤ |(bx − ax )(cy − ay )| + |(by − ay )(cx − ax )| ×
˜
× (4ε + 6ε2 + 4ε3 + ε4 )
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 8 / 27
23. Вычисление предиката Turn
Расчет ˜
v v
˜
(b − a) × (c − a) ≈ (bx ax ) ⊗ (cy ay ) (by ay ) ⊗ (cx ax )
= (bx − ax )(cy − ay )(1 + δ1 )(1 + δ2 )(1 + δ3 )
− (by − ay )(cx − ax )(1 + δ4 )(1 + δ5 )(1 + δ6 ) (1 + δ7 ),
|δi | ≤ ε;
e
= |v − v | ≤ |(bx − ax )(cy − ay )| + |(by − ay )(cx − ax )| ×
˜
× (4ε + 6ε2 + 4ε3 + ε4 )
Вычислим выражение справа в модели floating-point.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 8 / 27
24. Вычисление предиката Turn
Расчет ˜
e
|(bx − ax )(cy − ay )| + |(by − ay )(cx − ax )| (1 − ε)4 ≤
e
˜
≤ |(bx ax ) ⊗ (cy ⊗ ay )| ⊕ |(by ay ) ⊗ (cx ax )|
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 9 / 27
25. Вычисление предиката Turn
Расчет ˜
e
|(bx − ax )(cy − ay )| + |(by − ay )(cx − ax )| (1 − ε)4 ≤
e
˜
≤ |(bx ax ) ⊗ (cy ⊗ ay )| ⊕ |(by ay ) ⊗ (cx ax )|
1
e≤e
˜ = e (1 + 4ε + 10ε2 + 20ε3 + · · · )
˜
(1 − ε)4
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 9 / 27
27. Вычисление предиката Turn
Расчет ˜
e
|(bx − ax )(cy − ay )| + |(by − ay )(cx − ax )| (1 − ε)4 ≤
e
˜
≤ |(bx ax ) ⊗ (cy ⊗ ay )| ⊕ |(by ay ) ⊗ (cx ax )|
1
e≤e
˜ = e (1 + 4ε + 10ε2 + 20ε3 + · · · )
˜
(1 − ε)4
≤ ˜ ≤ e (1 + 4ε + 10ε2 + 20ε3 + · · · )(4ε + 6ε2 + 4ε3 + ε4 )
˜
˜ < 8ε˜
e
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 9 / 27
28. Вычисление предиката Turn
Утверждение
v > 8ε˜ ⇒ v > 0
˜ e
v < −8ε˜ ⇒ v < 0
˜ e
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 10 / 27
29. Вычисление предиката Turn
Утверждение
v > 8ε˜ ⇒ v > 0
˜ e
v < −8ε˜ ⇒ v < 0
˜ e
Что делать, если v ∈ [−8ε˜; 8ε˜]?
˜ e e
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 10 / 27
30. Вычисление предиката Turn
Интервальная арифметика
Определение
Интервальная арифметика:
a ∈ [alo , ahi ];
a·b ∈ min a b ; max a b ,
a ∈[alo ;ahi ] a ∈[alo ;ahi ]
b ∈[blo ;bhi ] b ∈[blo ;bhi ]
· ∈ [+, −, ×],
∈ [⊕, , ⊗] с округлением, соответственно, к − ∞ и + ∞.
Замечание
sqr ([alo , ahi ]) =?
31. Вычисление предиката Turn
Интервальная арифметика
Определение
Интервальная арифметика:
a ∈ [alo , ahi ];
a·b ∈ min a b ; max a b ,
a ∈[alo ;ahi ] a ∈[alo ;ahi ]
b ∈[blo ;bhi ] b ∈[blo ;bhi ]
· ∈ [+, −, ×],
∈ [⊕, , ⊗] с округлением, соответственно, к − ∞ и + ∞.
Замечание
sqr ([alo , ahi ]) =?
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 11 / 27
32. Вычисление предиката Turn
Интервальная арифметика
Утверждение
Если интервал v = (b − a) × (c − a) не содержит 0, знак v вычислен
точно.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 12 / 27
33. Вычисление предиката Turn
Интервальная арифметика
Утверждение
Если интервал v = (b − a) × (c − a) не содержит 0, знак v вычислен
точно.
Замечание
Переключать режим округления процессора дорого.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 12 / 27
34. Вычисление предиката Turn
Интервальная арифметика
Утверждение
Если интервал v = (b − a) × (c − a) не содержит 0, знак v вычислен
точно.
Замечание
Переключать режим округления процессора дорого.
[alo ; ahi ] = −[−ahi ; −alo ].
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 12 / 27
35. Вычисление предиката Turn
Интервальная арифметика
Утверждение
Если интервал v = (b − a) × (c − a) не содержит 0, знак v вычислен
точно.
Замечание
Переключать режим округления процессора дорого.
[alo ; ahi ] = −[−ahi ; −alo ].
Эффективная реализация есть, например, в boost/interval.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 12 / 27
36. Вычисление предиката Turn
Интервальная арифметика
Утверждение
Если интервал v = (b − a) × (c − a) не содержит 0, знак v вычислен
точно.
Замечание
Переключать режим округления процессора дорого.
[alo ; ahi ] = −[−ahi ; −alo ].
Эффективная реализация есть, например, в boost/interval.
Что делать, если интервал v содержит 0?
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 12 / 27
37. Вычисление предиката Turn
Рациональная арифметика
Определение
Рациональная арифметика: число представляется в виде
рациональной дроби с длинным числителем и длинным знаменателем.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 13 / 27
38. Вычисление предиката Turn
Рациональная арифметика
Определение
Рациональная арифметика: число представляется в виде
рациональной дроби с длинным числителем и длинным знаменателем.
Замечание
Недостатки:
даже эффективные реализации сложны и медленны;
требует или сложной разработки, или добавления еще одной
зависимости (gmp, например).
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 13 / 27
39. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
Идея
∀a, b ∈ D ∃c ∈ D :
1
a + b = a ⊕ b + c, |c| ≤ 2 ulp (a ⊕ b)
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 14 / 27
40. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
Идея
∀a, b ∈ D ∃c ∈ D :
1
a + b = a ⊕ b + c, |c| ≤ 2 ulp (a ⊕ b)
1
ab = a ⊗ b + c, |c| ≤ 2 ulp (a ⊗ b)
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 14 / 27
41. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
Идея
∀a, b ∈ D ∃c ∈ D :
1
a + b = a ⊕ b + c, |c| ≤ 2 ulp (a ⊕ b)
1
ab = a ⊗ b + c, |c| ≤ 2 ulp (a ⊗ b)
cj ∈ D
∀b = f (a1 , a2 , . . . , an )ai ∈D 1
∃{cj } : |cj | ≤ 2 ulp(cj+1 ) ,
b = cj
где f это арифметическое выражение с операциями +, − и ×.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 14 / 27
42. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
double sum ( double a , double b
, double & r o u n d o f f )
{
double r e s = a + b ;
double bv = r e s − a ;
double av = r e s − bv ;
double b r = b − bv ;
double a r = a − av ;
roundoff = ar + br ;
return r e s ;
}
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 15 / 27
43. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
double mul ( double a , double b , double & r o u n d o f f )
{
double r e s = a ∗ b ;
s i z e _ t s = s t d : : n u m e r i c _ l i m i t s <double > : : d i g i t s / 2
+ s t d : : n u m e r i c _ l i m i t s <double > : : d i g i t s % 2 ;
double a_hi , a_lo , b_hi , b_lo ;
i m p l : : s p l i t ( a , s , a_hi , a_lo ) ;
i m p l : : s p l i t ( b , s , b_hi , b_lo ) ;
double e1 = r e s − ( a_hi ∗ b_hi ) ;
double e2 = e1 − ( a_lo ∗ b_hi ) ;
double e3 = e2 − ( b_lo ∗ a_hi ) ;
r o u n d o f f = ( a_lo ∗ b_lo ) − e3 ;
return r e s ;
}
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 16 / 27
44. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
v o i d s p l i t ( double a , s i z e _ t s
, double & h i , double & l o )
{
double c = ( ( 1 LL << s ) + 1LL ) ∗ a ;
double ab = c − a ;
h i = c − ab ;
lo = a − hi ;
}
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 17 / 27
45. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
template <s i z e _ t N> s t r u c t grow_expansion_f
{
s t a t i c v o i d c a l c ( double const ∗ e , double b
, double ∗ r)
{
b = sum ( ∗ e , b , ∗ r ) ;
grow_expansion_f<N − 1 >:: c a l c ( e + 1 , b , r + 1 ) ;
}
};
template <> s t r u c t grow_expansion_f <0>
{
s t a t i c v o i d c a l c ( double const ∗ e , double b
, double ∗ r )
{ ∗r = b; }
};
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 18 / 27
46. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
template <s i z e _ t N1 , s i z e _ t N2> s t r u c t expand_sum_f
{
s t a t i c v o i d c a l c ( double const ∗ e , double const ∗ f
, double ∗ r )
{
grow_expansion <N1>(e , ∗ f , r ) ;
expand_sum_f<N1 , N2 − 1 >:: c a l c ( r + 1
, f + 1 , r + 1);
}
};
template <s i z e _ t N1> s t r u c t expand_sum_f<N1 , 0>
{
s t a t i c v o i d c a l c ( double const ∗ e , double const ∗ f
, double ∗ r ) {}
};
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 19 / 27
47. Вычисление предиката Turn
Adaptive precision floating-point arithmetic
double s a [ 1 2 ] ;
s a [ 1 ] = mul ( b . x , c . y , s a [ 0 ] ) ;
...
s a [ 1 1 ] = mul ( b . y , a . x , s a [ 1 0 ] ) ;
double s b [ 1 2 ] ;
expand_sum <2, 2>( s a + 0 , s a + 2 , s b ) ;
expand_sum <2, 2>( s a + 4 , s a + 6 , s b + 4 ) ;
expand_sum <2, 2>( s a + 8 , s a + 1 0 , s b + 8 ) ;
double s c [ 8 ] ;
expand_sum <4, 4>( sb , s b + 4 , s c ) ;
double s d [ 1 2 ] ;
expand_sum <8, 4>( sc , s b + 8 , s d ) ;
r e t u r n s i g n <12>( s d ) ;
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 20 / 27
49. Фильтрованное вычисление предиката
Эффективное и точное решение:
числа с плавающей точкой;
интервальная арифметика;
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 21 / 27
50. Фильтрованное вычисление предиката
Эффективное и точное решение:
числа с плавающей точкой;
интервальная арифметика;
рациональная или адаптивная арифметика, ESSA, etc.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 21 / 27
51. Фильтрованное вычисление предиката
Эффективное и точное решение:
числа с плавающей точкой;
интервальная арифметика;
рациональная или адаптивная арифметика, ESSA, etc.
Замечание
Большинство предикатов в вычислительной геометрии сводятся к sign
от элементарного арифметического выражения.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 21 / 27
52. Алгоритм Бентли-Оттмана
S = {s} – множество отрезков, n = S . Требуется найти множество
R = {ri }, где ri = {si,k } множество всех отрезков, проходящих через
некоторую точку qi .
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 22 / 27
53. Алгоритм Бентли-Оттмана
S = {s} – множество отрезков, n = S . Требуется найти множество
R = {ri }, где ri = {si,k } множество всех отрезков, проходящих через
некоторую точку qi .
Идея: заметающая прямая, O((n + k) log n) (k – число пересечений).
s3
s2
s1
s1 s1 s3 s1 s2 s3 s2 s1 s3 s2 s3 s1 s3 s2 s1 s3 s1 s3
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 22 / 27
55. Алгоритм Бентли-Оттмана
Все хорошо? Вот, что будет, если добавлять в очередь событий
координаты точек пересечений отрезков:
s3
s2
s1
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 23 / 27
56. Алгоритм Бентли-Оттмана
А нужны ли сами точки пересечений?
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 24 / 27
57. Алгоритм Бентли-Оттмана
А нужны ли сами точки пересечений? Необходимо поддерживать
корректный порядок событий:
e1,x < e2,x
e1 < e2 ⇔
e1,x = e2,x ∧ e1,y < e2,y
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 24 / 27
58. Алгоритм Бентли-Оттмана
А нужны ли сами точки пересечений? Необходимо поддерживать
корректный порядок событий:
e1,x < e2,x
e1 < e2 ⇔
e1,x = e2,x ∧ e1,y < e2,y
Найдем точку пересечения q двух непараллельных отрезков a1 b1 и
a2 b2 :
a1,y − b1,y b1,x − a1,x x (a1,y − b1,y )a1,x + (b1,x − a1,x )a1,y
=
a2,y − b2,y b2,x − a2,x y (a2,y − b2,y )a2,x + (b2,x − a2,x )a2,y
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 24 / 27
59. Алгоритм Бентли-Оттмана
А нужны ли сами точки пересечений? Необходимо поддерживать
корректный порядок событий:
e1,x < e2,x
e1 < e2 ⇔
e1,x = e2,x ∧ e1,y < e2,y
Найдем точку пересечения q двух непараллельных отрезков a1 b1 и
a2 b2 :
a1,y − b1,y b1,x − a1,x x (a1,y − b1,y )a1,x + (b1,x − a1,x )a1,y
=
a2,y − b2,y b2,x − a2,x y (a2,y − b2,y )a2,x + (b2,x − a2,x )a2,y
b2,x − a2,x a1,x − b1,x b1,x a1,y − b1,y a1,x
x b2,y − a2,y a1,y − b1,y b2,x a2,y − b2,y a2,x
=
y a1,y − b1,y b1,x − a1,x
a2,y − b2,y b2,x − a2,x
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 24 / 27
60. Алгоритм Бентли-Оттмана
Таким образом:
можно тем же способом эффективно сравнивать все возможные
события (начала и концы отрезков и точки пересечений отрезков);
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 25 / 27
61. Алгоритм Бентли-Оттмана
Таким образом:
можно тем же способом эффективно сравнивать все возможные
события (начала и концы отрезков и точки пересечений отрезков);
с помощью Turn можно эффективно локализовать точку при
добавлении начала отрезка в статус.
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 25 / 27
62. Ссылки
D. Goldberg.
What every computer scientist should know about floating-point
arithmetic.
ACM Comput. Surv., March, 1991.
J. Shewchuk.
Adaptive precision floating-point arithmetic and fast robust geometric
predicates.
Discrete & Computational Geometry, 1996
Chee K. Yap.
Robust Geometric Computation.
Handbook of Discrete and Computational Geometry, 2004
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 26 / 27
63. Спасибо за внимание!
А. Ковалев (Транзас, ИТМО) Exact geometric computation октябрь 2011 27 / 27