Постройте по заданным трем неколлинеарным точкам A, B, C окружность минимального радиуса, покрывающую эти точки (минимальная окружность), и обсудите, как изменится решение при малых возмущениях точек; сравните алгоритмы построения и их сложность
Кратко — конструкция, критерий и разбор устойчивости + сравнение алгоритмов. Шаги построения (дано A(xa,ya),B(xb,yb),C(xc,yc)A(x_a,y_a),B(x_b,y_b),C(x_c,y_c)A(xa,ya),B(xb,yb),C(xc,yc), точки неколлинеарны): 1) Вычислите квадраты сторон a2=(xb−xc)2+(yb−yc)2,b2=(xc−xa)2+(yc−ya)2,c2=(xa−xb)2+(ya−yb)2.
a^2=(x_b-x_c)^2+(y_b-y_c)^2,\quad b^2=(x_c-x_a)^2+(y_c-y_a)^2,\quad c^2=(x_a-x_b)^2+(y_a-y_b)^2. a2=(xb−xc)2+(yb−yc)2,b2=(xc−xa)2+(yc−ya)2,c2=(xa−xb)2+(ya−yb)2. 2) Найдите наибольшую сторону, пусть это сторона с длиной ccc. Если c2≥a2+b2,
c^2\ge a^2+b^2, c2≥a2+b2,
то треугольник прямой или тупой относительно этой стороны — минимальная окружность имеет диаметр эту сторону. Центр и радиус: O=A+B2=(xa+xb2,ya+yb2),R=c22.
O=\frac{A+B}{2}=\Big(\frac{x_a+x_b}{2},\frac{y_a+y_b}{2}\Big),\qquad R=\frac{\sqrt{c^2}}{2}. O=2A+B=(2xa+xb,2ya+yb),R=2c2. (Если наибольшая сторона — не ABABAB, подставьте соответствующие вершины.) 3) Иначе (треугольник острый) минимальная окружность — описанная окружность. Найдите её центр как пересечение серединных перпендикуляров; в явной форме: D=2(xa(yb−yc)+xb(yc−ya)+xc(ya−yb)),
D=2\big(x_a(y_b-y_c)+x_b(y_c-y_a)+x_c(y_a-y_b)\big), D=2(xa(yb−yc)+xb(yc−ya)+xc(ya−yb)),Ox=(xa2+ya2)(yb−yc)+(xb2+yb2)(yc−ya)+(xc2+yc2)(ya−yb)D,
O_x=\frac{(x_a^2+y_a^2)(y_b-y_c)+(x_b^2+y_b^2)(y_c-y_a)+(x_c^2+y_c^2)(y_a-y_b)}{D}, Ox=D(xa2+ya2)(yb−yc)+(xb2+yb2)(yc−ya)+(xc2+yc2)(ya−yb),Oy=(xa2+ya2)(xc−xb)+(xb2+yb2)(xa−xc)+(xc2+yc2)(xb−xa)D,
O_y=\frac{(x_a^2+y_a^2)(x_c-x_b)+(x_b^2+y_b^2)(x_a-x_c)+(x_c^2+y_c^2)(x_b-x_a)}{D}, Oy=D(xa2+ya2)(xc−xb)+(xb2+yb2)(xa−xc)+(xc2+yc2)(xb−xa),
радиус R=∣O−A∣R=|O-A|R=∣O−A∣. Устойчивость при малых возмущениях: - Решение меняется непрерывно, но чувствительность может быть большой. Для кругов, полученных как описанная окружность, радиус можно записать R=abc4Δ,
R=\frac{abc}{4\Delta}, R=4Δabc,
где площадь Δ=12∣(B−A)×(C−A)∣\Delta=\tfrac12\big|(B-A)\times(C-A)\big|Δ=21(B−A)×(C−A). При малой площади (точки почти коллинеарны) RRR становится большим — малые возмущения координат дают большой относительный сдвиг центра и радиуса. - Переход между случаями (диаметр = longest side) и описанной окружностью происходит при границе c2=a2+b2c^2=a^2+b^2c2=a2+b2 (прямой угол). Если треугольник близок к этой границе, малое возмущение может изменить тип решения, но значения радиусов слева и справа близки (на границе они совпадают). - Практически: в численных реализациях используйте порог ε\varepsilonε для проверки коллинеарности/прямого угла (например Δ<ε\Delta<\varepsilonΔ<ε или ∣c2−(a2+b2)∣<ε|c^2-(a^2+b^2)|<\varepsilon∣c2−(a2+b2)∣<ε), и переключайтесь на надёжную схему (например выбирать диаметр при малой площади) чтобы избежать деления на малые числа. Сравнение алгоритмов и их сложность: - Для именно трёх точек оптимально использовать вышеописённую явную конструкцию — вычисления требуют константное число операций, сложность O(1)O(1)O(1). Это и точнее, и быстрее любых общих алгоритмов. - Для общего множества из nnn точек классический оптимальный ожидаемый алгоритм — случайный алгоритм Welzl с ожидаемой сложностью O(n)O(n)O(n). Существуют детерминированные алгоритмы со сложностью O(n)O(n)O(n), но реализация сложнее. - Численная устойчивость: у явной формулы для описанной окружности при почти коллинеарных точках плохая обусловленность (деление на малое DDD), поэтому лучше заранее обрабатывать пары крайних точек и использовать оценку площади/порог. Резюме: для трёх неколлинеарных точек — проверить условие c2≥a2+b2c^2\ge a^2+b^2c2≥a2+b2; если да, центр — середина наибольшей стороны, иначе вычислить описанный центр по формулам выше. Для реализации учитывать пороги и использовать более устойчивые численные приёмы при малой площади.
Шаги построения (дано A(xa,ya),B(xb,yb),C(xc,yc)A(x_a,y_a),B(x_b,y_b),C(x_c,y_c)A(xa ,ya ),B(xb ,yb ),C(xc ,yc ), точки неколлинеарны):
1) Вычислите квадраты сторон
a2=(xb−xc)2+(yb−yc)2,b2=(xc−xa)2+(yc−ya)2,c2=(xa−xb)2+(ya−yb)2. a^2=(x_b-x_c)^2+(y_b-y_c)^2,\quad b^2=(x_c-x_a)^2+(y_c-y_a)^2,\quad c^2=(x_a-x_b)^2+(y_a-y_b)^2.
a2=(xb −xc )2+(yb −yc )2,b2=(xc −xa )2+(yc −ya )2,c2=(xa −xb )2+(ya −yb )2.
2) Найдите наибольшую сторону, пусть это сторона с длиной ccc. Если
c2≥a2+b2, c^2\ge a^2+b^2,
c2≥a2+b2, то треугольник прямой или тупой относительно этой стороны — минимальная окружность имеет диаметр эту сторону. Центр и радиус:
O=A+B2=(xa+xb2,ya+yb2),R=c22. O=\frac{A+B}{2}=\Big(\frac{x_a+x_b}{2},\frac{y_a+y_b}{2}\Big),\qquad R=\frac{\sqrt{c^2}}{2}.
O=2A+B =(2xa +xb ,2ya +yb ),R=2c2 .
(Если наибольшая сторона — не ABABAB, подставьте соответствующие вершины.)
3) Иначе (треугольник острый) минимальная окружность — описанная окружность. Найдите её центр как пересечение серединных перпендикуляров; в явной форме:
D=2(xa(yb−yc)+xb(yc−ya)+xc(ya−yb)), D=2\big(x_a(y_b-y_c)+x_b(y_c-y_a)+x_c(y_a-y_b)\big),
D=2(xa (yb −yc )+xb (yc −ya )+xc (ya −yb )), Ox=(xa2+ya2)(yb−yc)+(xb2+yb2)(yc−ya)+(xc2+yc2)(ya−yb)D, O_x=\frac{(x_a^2+y_a^2)(y_b-y_c)+(x_b^2+y_b^2)(y_c-y_a)+(x_c^2+y_c^2)(y_a-y_b)}{D},
Ox =D(xa2 +ya2 )(yb −yc )+(xb2 +yb2 )(yc −ya )+(xc2 +yc2 )(ya −yb ) , Oy=(xa2+ya2)(xc−xb)+(xb2+yb2)(xa−xc)+(xc2+yc2)(xb−xa)D, O_y=\frac{(x_a^2+y_a^2)(x_c-x_b)+(x_b^2+y_b^2)(x_a-x_c)+(x_c^2+y_c^2)(x_b-x_a)}{D},
Oy =D(xa2 +ya2 )(xc −xb )+(xb2 +yb2 )(xa −xc )+(xc2 +yc2 )(xb −xa ) , радиус R=∣O−A∣R=|O-A|R=∣O−A∣.
Устойчивость при малых возмущениях:
- Решение меняется непрерывно, но чувствительность может быть большой. Для кругов, полученных как описанная окружность, радиус можно записать
R=abc4Δ, R=\frac{abc}{4\Delta},
R=4Δabc , где площадь Δ=12∣(B−A)×(C−A)∣\Delta=\tfrac12\big|(B-A)\times(C-A)\big|Δ=21 (B−A)×(C−A) . При малой площади (точки почти коллинеарны) RRR становится большим — малые возмущения координат дают большой относительный сдвиг центра и радиуса.
- Переход между случаями (диаметр = longest side) и описанной окружностью происходит при границе c2=a2+b2c^2=a^2+b^2c2=a2+b2 (прямой угол). Если треугольник близок к этой границе, малое возмущение может изменить тип решения, но значения радиусов слева и справа близки (на границе они совпадают).
- Практически: в численных реализациях используйте порог ε\varepsilonε для проверки коллинеарности/прямого угла (например Δ<ε\Delta<\varepsilonΔ<ε или ∣c2−(a2+b2)∣<ε|c^2-(a^2+b^2)|<\varepsilon∣c2−(a2+b2)∣<ε), и переключайтесь на надёжную схему (например выбирать диаметр при малой площади) чтобы избежать деления на малые числа.
Сравнение алгоритмов и их сложность:
- Для именно трёх точек оптимально использовать вышеописённую явную конструкцию — вычисления требуют константное число операций, сложность O(1)O(1)O(1). Это и точнее, и быстрее любых общих алгоритмов.
- Для общего множества из nnn точек классический оптимальный ожидаемый алгоритм — случайный алгоритм Welzl с ожидаемой сложностью O(n)O(n)O(n). Существуют детерминированные алгоритмы со сложностью O(n)O(n)O(n), но реализация сложнее.
- Численная устойчивость: у явной формулы для описанной окружности при почти коллинеарных точках плохая обусловленность (деление на малое DDD), поэтому лучше заранее обрабатывать пары крайних точек и использовать оценку площади/порог.
Резюме: для трёх неколлинеарных точек — проверить условие c2≥a2+b2c^2\ge a^2+b^2c2≥a2+b2; если да, центр — середина наибольшей стороны, иначе вычислить описанный центр по формулам выше. Для реализации учитывать пороги и использовать более устойчивые численные приёмы при малой площади.