2001 - ĐOẠN THẲNG VÀ HÌNH CHỮ NHẬT(DÀNH CHO HỌC SINH PTTH)THUẬT...

Bài 76/2001 - Đoạn thẳng và hình chữ nhật

(Dành cho học sinh PTTH)

Thuật toán:

- Xét đoạn thẳng cắt với từng cạnh của hình chữ nhật, điều kiện cắt của đoạn thẳng với một đoạn thẳng khác

(cạnh của hình chữ nhật) là:

+ Hai đầu của đoạn thẳng khác phía với đoạn thẳng của hình chữ nhật;

+ Hai đầu của đoạn thẳng hình chữ nhật khác phía với đoạn thẳng.

Chương trình:

Program Bai76;

const inp= ‘input.txt’;

out= ‘output.txt’;

function cat (xs, ys, xe, ye, xl, yt, xr, yb: real): boolean;

var a, b, x, y: real;

lg1, lg2: boolean;

Begin

if xs=xe then

begin

lg1:=(xs<xl) or (xs>xr) or ((ys>yt) and (ye>yt)) or ((ys<yb) and (ye<yb));

lg2:=(xs>xl) and (xs<xr) and (ys<yt)and (ye<yt) and (ys>yb) and (ye>yb);

cat:=not (lg1 or lg2);

end

else begin

if ys=ye then

lg1:=((xs<xl) and (xe<xl)) or ((xs>xr) and (xe>xr)) or (ys>yt) or (ys<yb));

lg2:=(xs>xl) and (xe>xl) and (xs<xr)and (xe<xr) and (ys<yt) and (ys>yb);

cat:=false;

a:=(ys-ye)/(xs-xe);

b:=ys-a*xs;

y:= a*xl+b;

if(y<=yt)and(y>=yb)then cat:= true;

y: =a*xr+b;

if(y<=yt)and(y>=yb)then cat:=true;

x:=(yt-b)/a;

if (x>=xl)and (x<=xr)then cat:=true;

x:=(yb-b)/a;

end;

procedure xuly;

var n, i: word; xs, ys, xe, ye, xl, yt, xr, yb: real;

fi, fo: text;

assign(fi, inp); reset (fi);

assign (fo, out); rewrite(fo);

readln(fi, n);

for i:=1 to n do begin

readln (fi, xs, ys, xe, ye, xl, yt, xr, yb);

if cat (xs, ys, xe, ye, xl, yt, xr, yb) then writeln (fo, ‘T’)

else writeln(fo, ‘F’);

end;

close (fi);

close (fo);

BEGIN

xuly;

END.

(Lời giải của bạn Lê Mạnh Hà - Lớp 10A Tin - Khối PTCTT - ĐHKHTN - ĐHQG Hà Nội)