|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Serg Belyaev 2:5015/166.7 30 Oct 2001 03:57:16 To : Oleg Polubasoff Subject : Re:[* - гео] - середина дуги --------------------------------------------------------------------------------
Hиже приведен алгоритм, похожий на правду.
За основу взята формула
z=z1*sqrt(z2/z1)
У этого варианта есть _маленькое_ преимущество:
вектор sqrt(z2/z1) должен лежать в верхней полуплоскости,
при повороте z1 к z2 против часовой стрелки.
В итоге получаем всего одну проверку, которая
выявляет в т.ч. случай, когда нет однозначного решения -
совпадение z1 и z2.
var Cx,Cy,Ax,Ay,Bx,By:real;
x1,x2,y1,y2,a:real;
x,y:real;
begin
Cx:=1;Cy:=2;
Ax:=25;Ay:=27;
Bx:=26;By:=26;
x2:=Bx-Cx;x1:=Ax-Cx;
y2:=By-Cy;y1:=Ay-Cy;
a:=(x1*x2+y1*y2)/(x1*x1+y1*y1);
x:=sqrt((1+a)/2);y:=sqrt((1-a)/2);
if (x1*y2-x2*y1)=0 then begin
writeln('Точки совпадают - решения нет');exit
end else
if (x1*y2-x2*y1)<0 then x:=-x;
x2:=x1*x-y1*y+Cx;y2:=x1*y+y1*x+Cy;
writeln(x2:0:3,', ',y2:0:3)
end.
Всего доброго,
<SVB> (Serg Belyaev)
--- Terminate 5.00/Pro
* Origin: (svb@sandy.ru) or (2:5015/166.7)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33772126512f.html, оценка из 5, голосов 10
|