Liang Basky
Program Liang_Barsky;
Uses Crt,Graph;
Var
gd,gm,k : integer;
xmin,xmax,ymin,ymax : integer;
a1,b1,a2,b2,dx,dy : Real;
p,q : Array[1..4] Of Real;
(*****************************)
Procedure Special_Line(x1,y1,x2,y2: Real);
Var
tg: Real;
Begin
If (x1=x2) And (x1>xmin) And (x1<xmax) Then
Begin
If y1>y2 Then
Begin
tg:=y1; y1:=y2; y2:=tg;
End;
If (y1<ymax) And (y2>ymin) Then
Begin
If y1<ymin Then y1:=ymin;
If y2>ymax Then y2:=ymax;
End;
Line(Round(x1),Round(y1),Round(x2),Round(y2));
End;
If (y1=y2) And (y1>ymin) And (y1<ymax) Then
Begin
If x1>x2 Then
Begin
tg:=x1; x1:=x2; x2:=tg;
End;
If (x1<xmax) And (x2>xmin) Then
Begin
If x1<xmin Then x1:=xmin;
If x2>xmax Then x2:=xmax;
End; Line(Round(x1),Round(y1),Round(x2),Round(y2));
End;
End;
(*****************************)
Procedure Liang_Barsky_Clipping(x1,y1,x2,y2: Real);
Var
xw1,yw1,xw2,yw2,t,t1,t2: Real;
Begin
t1:=0; t2:=1;
dx:=x2-x1; dy:=y2-y1;
p[1]:=-dx; p[2]:=dx; p[3]:=-dy; p[4]:=dy;
q[1]:=x1-xmin; q[2]:=xmax-x1; q[3]:=y1-ymin; q[4]:=ymax-y1;
For k:=1 To 4 Do
Begin
t:=q[k]/p[k];
If p[k]<0 then If t1<t Then t1:=t;
If p[k]>0 then If t2>t then t2:=t;
End;
If t1<=t2 then
Begin
xw1:=x1+t1*dx; yw1:=y1+t1*dy;
xw2:=x1+t2*dx; yw2:=y1+t2*dy;
Line(Round(xw1),Round(yw1),Round(xw2),Round(yw2));
End;
End;
(*****************************)
Begin
Clrscr;
write('Nhap (xmin,ymin): '); readln(xmin,ymin);
write('Nhap (xmax,ymax): '); readln(xmax,ymax);
write('Nhap (a1,b1): '); readln(a1,b1);
write('Nhap (a2,b2): '); readln(a2,b2);
gd:=detect; Initgraph(gd,gm,'C:\tp\bgi');
setcolor(White);
setlinestyle(1,0,0);
Line(Round(a1),Round(b1),Round(a2),Round(b2));
setlinestyle(0,0,0);
If (a1<>a2) And (b1<>b2) Then Liang_Barsky_Clipping(a1,b1,a2,b2)
Else Special_Line(a1,b1,a2,b2);
settextjustify(1,1);
outtextxy(320,450,'HIEN THI MOT DOAN THANG TRONG MOT CUA SO CHO TRUOC');
outtextxy(320,470,'THEO THUAT TOAN LIANG_BARSKY');
rectangle(xmin,ymin,xmax,ymax);
Readln;
Closegraph;
End.
Bạn đang đọc truyện trên: AzTruyen.Top