|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Serg Belyaev 2:5015/166.7 09 Nov 2001 02:26:37 To : Oleg Polubasoff Subject : [* - гео] - середина дуги --------------------------------------------------------------------------------
08-Nov-01 17:32:50, Oleg Polubasoff wrote to All
Subject: [* - гео] - середина дуги
OP> Сразу скажу, подвох в том, что координаты точек даются не абсолютно
OP> точно, а с погрешностью. Пусть координаты округлены до целых.
OP> Hапример, точки (100.2, 10) и (100, 12)
OP> могут быть даны как A = (100, 10) и B = (100, 12),
OP> а точки (100.4999, -0.2) и (100.5001, 0) -
OP> как A = (100, 0) и B = (101, 0).
OP> Можно считать, что A и B расположены достаточно далеко от C.
OP> При любых данных нужно бы выдать правдоподобный результат.
OP> Линейного решения (без ветвлений) быть не может, так как функция
OP> разрывна, когда угол ACB равен 0. Будем считать, что величина дуги строго
OP> меньше 360 градусов, то есть разрешать неоднозначность в пользу 0.
OP> Решение 5 (Serg Belyaev). Комплексно-алгебраическое
OP> (z=z1*sqrt(z2/z1)).
Я заметил после отправки письма - ниже исправленный
вариант:
OP> x2:=Bx-Cx;x1:=Ax-Cx;
OP> y2:=By-Cy;y1:=Ay-Cy;
a:=2*(x1*x2+y1*y2)/(x1*x1+y1*y1+x2*x2+y2*y2);
OP> x:=sqrt((1+a)/2);y:=sqrt((1-a)/2);
OP> if (x1*y2-x2*y1)<0 then x:=-x;
OP> x2:=x1*x-y1*y+Cx;y2:=x1*y+y1*x+Cy;
Можно сделать очевидные преобразования для подкоренных
выражений для _x_ и _y_, чтобы там стояли суммы квадратов,
но, похоже, это уже будет перестраховкой. Я не могу
представить себе такие тайны округления, что модуль _a_
стал бы больше 1. о... в ответственном пакете
можно было бы записать так
x:=sqrt(abs(1+a)/2);y:=sqrt(abs(1-a)/2);
почти без потерь времени.
Всего доброго,
<SVB> (Serg Belyaev)
--- Terminate 5.00/Pro
* Origin: (svb@sandy.ru) or (2:5015/166.7)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/3377c78160c4.html, оценка из 5, голосов 10
|