среда, 7 августа 2013 г.

12. Поврежденная картина

prb12Римская цифра I, стоявшая на полу комнаты в точке с координатами X0Y00 не выдержала отношения к решению задачи "Римские цифры" и упала на пол. Поскольку нижний конец был прикреплен шарнирно, то он остался на месте, а верхний оказался в точке с координатами X1Y10. В комнате стояла строго вертикально бумажная картина. Зная координаты концов нижнего основания X2Y20 и X3Y3,0 и высоту картины Н найти длину "разрыва бумаги" на картине.
Код решения:
*****

type TPoint=record
           x,y:real;
           end;
var fi, fo:text;
   p0t, p1t, p2t, p3t:TPoint;
   h, temp:real;
   x, y, s, s1, rez, a, b, c:real;
   k:integer;
function min(xx, yy:real):real;
begin
    if xx<yy then min:=xx
             else min:=yy;
end;
function max(xx, yy:real):real;
begin
    if xx>yy then max:=xx
             else max:=yy;
end;
function peret(p0, p1, p2, p3:TPoint):boolean;
begin
    peret:=false;
    if((max(p0.x,p1.x)>=min(p2.x,p3.x)) and
       (max(p2.x,p3.x)>=min(p0.x,p1.x)) and
       (max(p0.y,p1.y)>=min(p2.y,p3.y)) and
       (max(p2.y,p3.y)>=min(p0.y,p1.y))) then
    if
      (((p2.x-p0.x)*(p1.y-p0.y)-(p1.x-p0.x)*(p2.y-p0.y))*
       ((p3.x-p0.x)*(p1.y-p0.y)-(p1.x-p0.x)*(p3.y-p0.y))<=0)
    then
    if
      (((p0.x-p2.x)*(p3.y-p2.y)-(p3.x-p2.x)*(p0.y-p2.y))*
       ((p1.x-p2.x)*(p3.y-p2.y)-(p3.x-p2.x)*(p1.y-p2.y))<=0)
       then peret:=true;
end;
procedure point_peret(p0, p1, p2, p3:TPoint; var xt, yt:real; var kk:integer);
var a1, b1, c1, a2, b2, c2, d, dx, dy:real;
begin
    kk:=1;
    a1:=p1.y-p0.y; b1:=p0.x-p1.x; c1:=p0.x*p1.y-p0.y*p1.x;
    a2:=p3.y-p2.y; b2:=p2.x-p3.x; c2:=p2.x*p3.y-p2.y*p3.x;
    d:=a1*b2-a2*b1; dx:=c1*b2-c2*b1; dy:=a1*c2-a2*c1;
    xt:=dx/d;
    yt:=dy/d;
end;
function vid(xa, ya, xb, yb:real):real;
begin
    vid:=sqrt(sqr(xa-xb)+sqr(ya-yb));
end;
function variant (x0, y0, x1, y1, x2, y2, x3, y3:real):integer;
begin
    if (x0<=x1) and (y0<=y1) and (x1<=x2) and (y1<=y2) and (x2<=x3) and (y2<=y3) or
       (x0>=x1) and (y0<=y1) and (x1>=x2) and (y1<=y2) and (x2>=x3) and (y2<=y3) or
       (x0>=x1) and (y0>=y1) and (x1>=x2) and (y1>=y2) and (x2>=x3) and (y2>=y3) or
       (x0>=x1) and (y0<=y1) and (x1>=x2) and (y1<=y2) and (x2>=x3) and (y2<=y3) then variant:=1;
    if (x0<=x1) and (y0<=y1) and (x1<=x3) and (y1<=y3) and (x3<=x2) and (y3<=y2) or
       (x0>=x1) and (y0<=y1) and (x1>=x3) and (y1<=y3) and (x3>=x2) and (y3<=y2) or
       (x0>=x1) and (y0>=y1) and (x1>=x3) and (y1>=y3) and (x3>=x2) and (y3>=y2) or
       (x0>=x1) and (y0<=y1) and (x1>=x3) and (y1<=y3) and (x3>=x2) and (y3<=y2) then variant:=2;
    if (x1<=x0) and (y1<=y0) and (x0<=x2) and (y0<=y2) and (x2<=x3) and (y2<=y3) or
       (x1>=x0) and (y1<=y0) and (x0>=x2) and (y0<=y2) and (x2>=x3) and (y2<=y3) or
       (x1>=x0) and (y1>=y0) and (x0>=x2) and (y0>=y2) and (x2>=x3) and (y2>=y3) or
       (x1>=x0) and (y1<=y0) and (x0>=x2) and (y0<=y2) and (x2>=x3) and (y2<=y3) then variant:=3;
    if (x1<=x0) and (y1<=y0) and (x0<=x3) and (y0<=y3) and (x3<=x2) and (y3<=y2) or
       (x1>=x0) and (y1<=y0) and (x0>=x3) and (y0<=y3) and (x3>=x2) and (y3<=y2) or
       (x1>=x0) and (y1>=y0) and (x0>=x3) and (y0>=y3) and (x3>=x2) and (y3>=y2) or
       (x1>=x0) and (y1<=y0) and (x0>=x3) and (y0<=y3) and (x3>=x2) and (y3<=y2) then variant:=4;
    if (x0<=x3) and (y0<=y3) and (x3<=x1) and (y3<=y1) and (x1<=x2) and (y1<=y2) or
       (x0>=x3) and (y0<=y3) and (x3>=x1) and (y3<=y1) and (x1>=x2) and (y1<=y2) or
       (x0>=x3) and (y0>=y3) and (x3>=x1) and (y3>=y1) and (x1>=x2) and (y1>=y2) or
       (x0>=x3) and (y0<=y3) and (x3>=x1) and (y3<=y1) and (x1>=x2) and (y1<=y2) then variant:=5;
    if (x0<=x3) and (y0<=y3) and (x3<=x2) and (y3<=y2) and (x2<=x1) and (y2<=y1) or
       (x0>=x3) and (y0<=y3) and (x3>=x2) and (y3<=y2) and (x2>=x1) and (y2<=y1) or
       (x0>=x3) and (y0>=y3) and (x3>=x2) and (y3>=y2) and (x2>=x1) and (y2>=y1) or
       (x0>=x3) and (y0<=y3) and (x3>=x2) and (y3<=y2) and (x2>=x1) and (y2<=y1) then variant:=6;
    if (x0<=x2) and (y0<=y2) and (x2<=x1) and (y2<=y1) and (x1<=x3) and (y1<=y3) or
       (x0>=x2) and (y0<=y2) and (x2>=x1) and (y2<=y1) and (x1>=x3) and (y1<=y3) or
       (x0>=x2) and (y0>=y2) and (x2>=x1) and (y2>=y1) and (x1>=x3) and (y1>=y3) or
       (x0>=x2) and (y0<=y2) and (x2>=x1) and (y2<=y1) and (x1>=x3) and (y1<=y3) then variant:=7;
    if (x0<=x2) and (y0<=y2) and (x2<=x3) and (y2<=y3) and (x3<=x1) and (y3<=y1) or
       (x0>=x2) and (y0<=y2) and (x2>=x3) and (y2<=y3) and (x3>=x1) and (y3<=y1) or
       (x0>=x2) and (y0>=y2) and (x2>=x3) and (y2>=y3) and (x3>=x1) and (y3>=y1) or
       (x0>=x2) and (y0<=y2) and (x2>=x3) and (y2<=y3) and (x3>=x1) and (y3<=y1) then variant:=8;
    if (x1<=x2) and (y1<=y2) and (x2<=x0) and (y2<=y0) and (x0<=x3) and (y0<=y3) or
       (x1>=x2) and (y1<=y2) and (x2>=x0) and (y2<=y0) and (x0>=x3) and (y0<=y3) or
       (x1>=x2) and (y1>=y2) and (x2>=x0) and (y2>=y0) and (x0>=x3) and (y0>=y3) or
       (x1>=x2) and (y1<=y2) and (x2>=x0) and (y2<=y0) and (x0>=x3) and (y0<=y3) then variant:=9;
    if (x1<=x3) and (y1<=y3) and (x3<=x0) and (y3<=y0) and (x0<=x2) and (y0<=y2) or
       (x1>=x3) and (y1<=y3) and (x3>=x0) and (y3<=y0) and (x0>=x2) and (y0<=y2) or
       (x1>=x3) and (y1>=y3) and (x3>=x0) and (y3>=y0) and (x0>=x2) and (y0>=y2) or
       (x1>=x3) and (y1<=y3) and (x3>=x0) and (y3<=y0) and (x0>=x2) and (y0<=y2) then variant:=10;
    if (x2<=x0) and (y2<=y0) and (x0<=x1) and (y0<=y1) and (x1<=x3) and (y1<=y3) or
       (x2>=x0) and (y2<=y0) and (x0>=x1) and (y0<=y1) and (x1>=x3) and (y1<=y3) or
       (x2>=x0) and (y2>=y0) and (x0>=x1) and (y0>=y1) and (x1>=x3) and (y1>=y3) or
       (x2>=x0) and (y2<=y0) and (x0>=x1) and (y0<=y1) and (x1>=x3) and (y1<=y3) then variant:=11;
    if (x2<=x1) and (y2<=y1) and (x1<=x0) and (y1<=y0) and (x0<=x3) and (y0<=y3) or
       (x2>=x1) and (y2<=y1) and (x1>=x0) and (y1<=y0) and (x0>=x3) and (y0<=y3) or
       (x2>=x1) and (y2>=y1) and (x1>=x0) and (y1>=y0) and (x0>=x3) and (y0>=y3) or
       (x2>=x1) and (y2<=y1) and (x1>=x0) and (y1<=y0) and (x0>=x3) and (y0<=y3) then variant:=12;
end;
procedure line(p0, p1, p2, p3:TPoint; var rezt:real);
var p0p1, p0p2, p0p3, p1p2, p1p3, p2p3:real;
   tem:integer;
begin
    p0p1:=vid(p0.x, p0.y, p1.x, p1.y);
    p0p2:=vid(p0.x, p0.y, p2.x, p2.y);
    p0p3:=vid(p0.x, p0.y, p3.x, p3.y);
    p1p2:=vid(p1.x, p1.y, p2.x, p2.y);
    p1p3:=vid(p1.x, p1.y, p3.x, p3.y);
    p2p3:=vid(p2.x, p2.y, p3.x, p3.y);
    rezt:=0;
    tem:=variant(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);
    if tem=5 then if (sqrt(p0p1*p0p1-p0p3*p0p3)<=h)
    then begin rezt:=p0p1*arctan(sqrt(p0p1*p0p1-p0p3*p0p3)/p0p3); exit; end;
    if tem=5 then if (sqrt(p0p1*p0p1-p0p3*p0p3)>h)
    then begin rezt:=p0p1*arctan(h/sqrt(p0p1*p0p1-h*h)); exit; end;
    if tem=6 then if (sqrt(p0p1*p0p1-p0p3*p0p3)<=h)
    then begin rezt:=p0p1*(arctan(sqrt(p0p1*p0p1-p0p3*p0p3)/p0p3)-
    arctan(sqrt(p0p1*p0p1-p0p2*p0p2)/p0p2)); exit; end;
    if tem=6 then if (sqrt(p0p1*p0p1-p0p3*p0p3)>h) and (sqrt(p0p1*p0p1-p0p2*p0p2)<h) and (p0p2<>0)
    then begin rezt:=p0p1*(arctan(h/sqrt(p0p1*p0p1-h*h))-
    arctan(sqrt(p0p1*p0p1-p0p2*p0p2)/p0p2)); exit; end;
    if tem=7 then if (sqrt(p0p1*p0p1-p0p2*p0p2)<=h)
    then begin rezt:=p0p1*arctan(sqrt(p0p1*p0p1-p0p2*p0p2)/p0p2); exit; end;
    if tem=7 then if (sqrt(p0p1*p0p1-p0p2*p0p2)>h)
    then begin rezt:=p0p1*arctan(h/sqrt(p0p1*p0p1-h*h)); exit; end;
    if tem=8 then if (sqrt(p0p1*p0p1-p0p2*p0p2)<=h)
    then begin rezt:=p0p1*(arctan(sqrt(p0p1*p0p1-p0p2*p0p2)/p0p2)-
    arctan(sqrt(p0p1*p0p1-p0p3*p0p3)/p0p3)); exit; end;
    if tem=8 then if (sqrt(p0p1*p0p1-p0p2*p0p2)>h) and (sqrt(p0p1*p0p1-p0p3*p0p3)<h){ and (p0p3<>0)}
    then begin rezt:=p0p1*(arctan(h/sqrt(p0p1*p0p1-h*h))-
    arctan(sqrt(p0p1*p0p1-p0p3*p0p3)/p0p3)); exit; end;
    if tem=9 then if (p0p1<=h)
    then begin rezt:=p0p1*(pi/2-arctan(sqrt(p0p1*p0p1-p0p2*p0p2)/p0p2)); exit; end;
    if tem=9 then if (p0p1>h) and (sqrt(p0p1*p0p1-p0p2*p0p2)<h)
    then begin rezt:=p0p1*(arctan(h/sqrt(p0p1*p0p1-h*h))-
    arctan(sqrt(p0p1*p0p1-p0p2*p0p2)/p0p2)); exit; end;
    if tem=10 then if (p0p1<=h)
    then begin rezt:=p0p1*(pi/2-arctan(sqrt(p0p1*p0p1-p0p3*p0p3)/p0p3)); exit; end;
    if tem=10 then if (p0p1>h) and (sqrt(p0p1*p0p1-p0p3*p0p3)<h)
    then begin rezt:=p0p1*(arctan(h/sqrt(p0p1*p0p1-h*h))-
    arctan(sqrt(p0p1*p0p1-p0p3*p0p3)/p0p3)); exit; end;
    if tem=11 then if p0p1<=h then begin rezt:=p0p1*pi/2; exit; end;
    if tem=11 then if p0p1>h then begin rezt:=p0p1*arctan(h/sqrt(p0p1*p0p1-h*h)); exit; end;
    if tem=12 then if p0p1<=h then begin rezt:=p0p1*pi/2; exit; end;
    if tem=12 then if p0p1>h then begin rezt:=p0p1*arctan(h/sqrt(p0p1*p0p1-h*h)); exit; end;
end;
begin
    readln (p0t.x, p0t.y, p1t.x, p1t.y, p2t.x, p2t.y, p3t.x, p3t.y, h);
    a:=p1t.y-p0t.y;  b:=p0t.x-p1t.x;  c:=p0t.x*p1t.y-p0t.y*p1t.x;
    if (a*p2t.x+b*p2t.y=c) and (a*p3t.x+b*p3t.y=c) then
        line (p0t, p1t, p2t, p3t, rez) else
    if peret(p0t, p1t, p2t, p3t) then
       begin
          point_peret(p0t, p1t, p2t, p3t, x, y, k);
          if k>0 then
             begin
                  s:=vid(p0t.x, p0t.y, x, y);
                  s1:=vid(p0t.x, p0t.y, p1t.x, p1t.y);
                  if s1>s then rez:=sqrt(sqr(s1)-sqr(s));
                  if rez>h then rez:=h;
                  if (x=p2t.x) and (y=p2t.y) or (x=p3t.x) and (y=p3t.y) then rez:=0;
                  if s=0 then rez:=0;
             end
             else rez:=0;
       end;
    writeln (rez:0:3);
end.

*****

Комментариев нет:

Отправить комментарий