5 aspekt=1.33333333333,
\r
8 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
9 unit WaitMoment:procedure;
\r
13 call outstring("Press any key!");
\r
18 call outstring(" * ");
\r
20 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
21 unit punkt:class(x,y:real);
\r
22 unit plot:procedure;
\r
24 call move(round(x*aspekt)-3,round(y));
\r
25 call draw(round(x*aspekt)+3,round(y));
\r
26 call move(round(x*aspekt),round(y)-2);
\r
27 call draw(round(x*aspekt),round(y)+3);
\r
31 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
33 unit okrag :class (S:punkt;r:real);
\r
34 unit cirb:procedure(alfa,beta:real);
\r
42 x:=round(aspekt*(S.x+(r*cos(gamma))));
\r
43 y:=round(S.y+(r*sin(gamma)));
\r
45 while gamma<=beta do
\r
46 x:=round(aspekt*(S.x+(r*cos(gamma))));
\r
47 y:=round(S.y+(r*sin(gamma)));
\r
52 unit rys:procedure(A:punkt);
\r
55 pom:=(A.y-S.y)/(A.x-S.x);
\r
60 call cirb(alfa-0.3,alfa+0.3);
\r
64 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
66 unit odcinek:class(A,B:punkt);
\r
68 call move(round(A.x*aspekt),round(A.y));
\r
69 call draw(round(B.x*aspekt),round(B.y))
\r
72 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
74 unit odleglosc:function(A,B:punkt):real;
\r
76 result:=sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y))
\r
79 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
81 unit srodek_odcinka:function(GH:odcinek):punkt;
\r
87 o2:=new okrag(GH.A,odleglosc(GH.A,GH.B));
\r
88 o3:=new okrag(GH.B,odleglosc(GH.A,GH.B));
\r
89 call okrag_okrag(o2,o3,C,D);
\r
91 CD:=new odcinek(C,D);
\r
92 result:=odcinek_odcinek(GH,CD)
\r
94 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
96 unit okrag_okrag:procedure(o2,o1:okrag;output G,H:punkt);
\r
98 ax2,ay2,cx2,cy2,r12,r22:real,
\r
102 ax2:=o1.S.x * o1.S.x;
\r
103 ay2:=o1.S.y * o1.S.y;
\r
104 cx2:=o2.S.x * o2.S.x;
\r
105 cy2:=o2.S.y * o2.S.y;
\r
108 A:=new punkt(0,(r12-r22-ay2-ax2+cx2+cy2)/(2*(o2.S.y-o1.s.y)));
\r
109 B:=new punkt(1,(r12-r22-ay2-ax2+cx2+cy2+2*o1.s.x-2*o2.s.x)/(2*(o2.S.y-o1.s.y)));
\r
110 AB:=new odcinek(A,B);
\r
111 call okrag_odcinek(o1,AB,G,H);
\r
115 call outstring("G");
\r
119 call outstring("H");
\r
122 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
124 unit okrag_odcinek:procedure(o:okrag;p:odcinek;output G,H:punkt);
\r
126 a,b,c,x,y,delta,m:real;
\r
129 m:=(p.B.y - p.A.y) / (p.B.x - p.A.x);
\r
131 b:=(-2) * ((m * m * p.A.x) - (m * p.A.y)+(o.s.x)+(m*o.s.y));
\r
132 c:=m * p.A.x *(m * p.A.x - 2 * p.A.y) + (p.A.y * p.A.y) - (o.r * o.r);
\r
133 c:=c+(o.s.x*o.s.x)+(o.s.y*o.s.y)-(2*p.a.y*o.s.y);
\r
134 c:=c+(2*m*p.a.x*o.s.y);
\r
135 delta :=b * b -(4 * a * c);
\r
142 y:= m *(x - p.A.x) + p.A.y;
\r
143 G:=new punkt(x ,y);
\r
144 else delta:=sqrt(delta);
\r
145 x:= (-b - delta) / (2 * a);
\r
146 y:= m *(x - p.A.x) + p.A.y;
\r
147 G:=new punkt(x ,y);
\r
148 x:= (-b + delta) / (2 * a);
\r
149 y:= m *(x - p.A.x) + p.A.y;
\r
150 H:=new punkt(x ,y);
\r
156 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
158 unit punkt_odlegly:function(AB:odcinek;odl:integer):punkt;
\r
159 (* Funkcja zwraca punkt odlegly w poziomie o odl lezacy na prostej AB. *)
\r
164 o:=new okrag(AB.B,odl*jednostka);
\r
165 call okrag_odcinek(o,AB,G,H);
\r
166 if odleglosc(AB.A,G)<odleglosc(AB.A,H) then
\r
173 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
175 unit odcinek_odcinek:function(AB,CD:odcinek):punkt;
\r
179 m1:=(AB.B.y-AB.A.y)/(AB.B.x-AB.A.x);
\r
180 m2:=(CD.B.y-CD.A.y)/(CD.B.x-CD.A.x);
\r
181 x:=(m1*AB.A.x-AB.A.y-m2*CD.A.x+CD.A.y)/(m1-m2);
\r
182 y:=m1*(x-AB.A.x)+AB.A.y;
\r
183 result:=new punkt(x,y)
\r
184 end odcinek_odcinek;
\r
186 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
188 unit prostopadla:function(AC:odcinek;B:punkt):odcinek;
\r
193 o1:=new okrag(B,odleglosc(B,AC.B));
\r
194 call okrag_odcinek(o1,AC,G,H);
\r
195 o2:=new okrag(G,2*odleglosc(B,AC.B));
\r
196 o3:=new okrag(H,2*odleglosc(B,AC.B));
\r
197 call okrag_okrag(o2,o3,K,L);
\r
198 result:=new odcinek (K,L)
\r
201 (*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*)
\r
206 A,B,C,D,E,F,G:punkt,
\r
208 AC,AB,BE,BF:odcinek,
\r
213 A:=new punkt(200,100);
\r
215 call outstring ("A");
\r
216 call move (100,300);
\r
217 call outstring("Choose second point and press <END>.");
\r
218 call track(303,202);
\r
219 B:=new punkt(inxpos*(1/aspekt),inypos);
\r
221 call outstring ("B");
\r
222 call move (100,300);
\r
223 call outstring(" ");
\r
224 AB:=new odcinek(A,B);
\r
225 C:=punkt_odlegly(AB,1);
\r
227 call outstring ("C");
\r
228 AC:=new odcinek(A,C);
\r
230 D:=srodek_odcinka(AC);
\r
232 call outstring("D");
\r
234 o1:=new okrag(D,odleglosc(D,C));
\r
235 call cirb(round(D.x*aspekt),round(d.y),round(odleglosc(D,C)*aspekt),1,1,1,0,1,1);
\r
236 BE:=prostopadla(AC,B);
\r
238 call okrag_odcinek(o1,BE,F,G);
\r
239 wynik:=odleglosc(B,F);
\r
241 call outstring("F");
\r
242 BF:=new odcinek(B,F);
\r
243 call move(100,310);
\r
244 call outstring("Dlugosc odcinka BF wynosi pierwiastek z dlugosci odcinka AB.");
\r