Code: Select all
program Project3;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
const
eps = 1e-5;
function distance (const x1,y1,x2,y2: extended): extended;
var
a,b,t: extended;
begin
a := sqr (x1-x2);
b := sqr (y1-y2);
t := a + b;
t := sqrt (t);
distance := t
end;
function distanceToLineSegment (const x,y,x1,y1,x2,y2: extended): extended;
var
a,b,c,t: extended;
aa,bb,cc: extended;
begin
a := y2 - y1;
b := x1 - x2;
c := -abs(-x1*a - y1*b);
t := sqrt (sqr(a)+sqr(b));
if abs(a*x + b*y +c)<eps then
begin
if (x>=min(x1,x2)-eps) and (x<=max(x1,x2)+eps) and (y>=min(y1,y2)-eps) and (y<=max(y1,y2)+eps) then
distanceToLineSegment := 0
else
distanceToLineSegment := maxint
end
else
begin
aa := sqr(distance (x,y,x1,y1));
bb := sqr(distance (x,y,x2,y2));
cc := sqr(distance (x1,y1,x2,y2));
if (aa>bb+cc) or (bb>aa+cc) then
distanceToLineSegment := min (aa,bb)
else
distanceToLineSegment := abs( (a*x + b*y + c)/t )
end;
end;
var
x1,y1,x2,y2,r: extended;
a,b,c: extended;
d: extended;
d1,d2: extended;
ci,cn: integer;
ax1,ay1,ax2,ay2: extended;
alpha,beta1,beta2,beta: extended;
x11,y11,x12,y12,x21,y21,x22,y22: extended;
a1,a2,a3,a4: extended;
di: extended;
begin
readln (cn);
for ci := 0 to cn - 1 do
begin
readln (x1,y1,x2,y2,r);
if (x1=x2) and (y1=y2) then
begin
writeln (0.0:0:3);
continue
end;
{ transform (x1,y1);
transform (x2,y2);}
d := distanceToLineSegment (0,0,x1,y1,x2,y2);
if d>r-eps then
begin
writeln (distance(x1,y1,x2,y2):0:3);
continue
end;
d := sqrt (sqr(x1) + sqr(y1));
alpha := arcsin (r/d);
alpha := pi/2.0 - alpha;
beta := arctan2 (y1,x1);
while beta<0 do
beta := beta + 2*pi;
beta1 := beta + alpha;
beta2 := beta - alpha;
{ if abs(beta1)<eps then
beta1 := 0;
if abs(beta2)<eps then
beta2 := 0; }
x11 := r*cos (beta1);
y11 := r*sin (beta1);
x12 := r*cos (beta2);
y12 := r*sin (beta2);
d := sqrt (sqr(x2) + sqr(y2));
alpha := arcsin (r/d);
alpha := pi/2.0 - alpha;
beta := arctan2 (y2,x2);
beta1 := beta + alpha;
beta2 := beta - alpha;
x21 := r*cos (beta1);
y21 := r*sin (beta1);
x22 := r*cos (beta2);
y22 := r*sin (beta2);
a1 := arctan2 (y11,x11);
a2 := arctan2 (y12,x12);
a3 := arctan2 (y21,x21);
a4 := arctan2 (y22,x22);
alpha := min ( min(abs(a1-a3),abs(a1-a4)) , min(abs(a2-a3),abs(a2-a4)) );
d1 := alpha*r;
d2 := min (distance (x1,y1,x11,y11), distance (x1,y1,x12,y12));
d2 := d2 + min (distance (x2,y2,x21,y21), distance (x2,y2,x22,y22));
d := d1 + d2;
writeln (d:0:3)
end;
end.