2 (******* geometryczne znajdywanie pierwiastka kwadratowego ********)
\r
7 unit punkt:zbior class;
\r
10 unit rowne:function (a:punkt):boolean;
\r
12 result:=(a.x=x) and (a.y=y);
\r
15 unit odleglosc:function (a:punkt):real;
\r
18 result:=sqrt((x-a.x)*(x-a.x)+(y-a.y)*(y-a.y))
\r
24 unit rozwiaz:function(a,b,c:real):punkt;
\r
25 (* Funkcja rozwiazuje rownanie kwadratowe i jesli ma rozwiazanie
\r
26 to zwraca je na wspolrzednych punktu*)
\r
29 if (a=/=0) or (b=/=0) then
\r
38 result.x:=(-b+sqrt(d))/(2*a);
\r
39 result.y:=(-b-sqrt(d))/(2*a);
\r
45 unit odcinek:zbior class;
\r
48 unit dlugosc:function:real;
\r
50 result:=a.odleglosc(b);
\r
55 unit okrag:zbior class;
\r
59 unit przeczokreg:function (a:okrag):prosta;
\r
63 pom1:= r*r-o.x*o.x-o.y*o.y;
\r
64 pom2:= a.r*a.r-a.o.x*a.o.x-a.o.y*a.o.y;
\r
65 result := new prosta;
\r
66 result.a:=2*(a.o.x-o.x);
\r
67 result.b:=2*(a.o.y-o.y);
\r
68 result.c:=pom2-pom1;
\r
72 unit przeczprost:function(l:prosta):odcinek;
\r
77 pom:=rozwiaz(1+(l.b/l.a)*(l.b/l.a),2*(l.b*l.c/l.a+o.x*l.b/l.a-o.y),
\r
78 2*o.x*l.c/l.a+(l.c*l.c)/(l.a*l.a)+o.x*o.x+o.y*o.y-r*r);
\r
79 result:=new odcinek;
\r
80 result.a:=new punkt;
\r
81 result.a.x:=-(pom.x*l.b/l.a+l.c/l.a);
\r
83 result.b:=new punkt;
\r
84 result.b.x:=-(pom.y*l.b/l.a+l.c/l.a);
\r
87 pom:=rozwiaz(1+(l.a/l.b)*(l.a/l.b),2*(l.a*l.c/l.b+o.x*l.a/l.b-o.y),
\r
88 2*o.x*l.c/l.b+(l.c*l.c)/(l.b*l.b)+o.x*o.x+o.y*o.y-r*r);
\r
89 result:=new odcinek;
\r
90 result.a:=new punkt;
\r
91 result.a.y:=-(pom.x*l.a/l.b+l.c/l.b);
\r
93 result.b:=new punkt;
\r
94 result.b.y:=-(pom.y*l.a/l.b+l.c/l.b);
\r
100 unit prosta:zbior class;
\r
103 unit przeczprost:function (l:prosta):punkt;
\r
106 if (l=/=none) and (not rownolega(l)) then
\r
107 pom:= 1/(l.a*b-l.b*a);
\r
109 result.x:=-pom*(b*l.c-c*l.b);
\r
110 result.y:=pom*(a*l.c-c*l.a);
\r
114 unit rownolega:function(l:prosta):boolean;
\r
117 if a*l.b-b*l.a=0 then
\r
127 unit ekran:iiuwgraph class;
\r
129 (* Klasa obslugujaca ekran *)
\r
133 poczpoz=szerekr div 2,
\r
134 poczpio=wysekr div 2,
\r
139 unit inchar:function:integer;
\r
146 unit punktnaekr:class;
\r
150 unit naekranie:function(a:punktnaekr):boolean;
\r
152 result:=((a.x>0) and (a.x<szerekr)) and ((a.y>0) and (a.y<wysekr));
\r
155 unit rysodc:procedure(a,b:punkt);
\r
156 (* Procedura rysuje odcinek o ile znajduje sie caly w ekranie *)
\r
157 var c,d:punktnaekr;
\r
161 c.x:=entier(a.x*skala+poczpoz);
\r
162 c.y:=entier(a.y*skala*aspekt+poczpio);
\r
163 d.x:=entier(b.x*skala+poczpoz);
\r
164 d.y:=entier(b.y*skala*aspekt+poczpio);
\r
165 if naekranie(c) and naekranie(d) then
\r
166 call move(c.x,c.y);
\r
167 call draw(d.x,d.y);
\r
171 unit rysokr:procedure(o:okrag);
\r
172 (* Procedura rysuje okrag wedlug algorytmu podanego przez p.Jankowskiego *)
\r
174 var x,y,r,pp,pp4,pp8,qq,qq4,qq8,fx,fy,fs:integer;
\r
176 unit rysczw:procedure(x,y:integer);
\r
177 (* Procedura rysuje cztery punkty symetryczne wzgledem *)
\r
178 (* osi ukladu wspolrzednych *)
\r
183 a.x:=entier(x+poczpoz+o.o.x*skala);
\r
184 a.y:=entier(y+poczpio+o.o.y*skala*aspekt);
\r
185 if naekranie(a) then
\r
186 call move(a.x,a.y);
\r
187 call draw(a.x,a.y);
\r
189 a.x:=entier(-x+poczpoz+o.o.x*skala);
\r
190 if naekranie(a) then
\r
191 call move(a.x,a.y);
\r
192 call draw(a.x,a.y);
\r
194 a.y:=entier(-y+poczpio+o.o.y*skala*aspekt);
\r
195 if naekranie(a) then
\r
196 call move(a.x,a.y);
\r
197 call draw(a.x,a.y);
\r
199 a.x:=entier(x+poczpoz+o.o.x*skala);
\r
200 if naekranie(a) then
\r
201 call move(a.x,a.y);
\r
202 call draw(a.x,a.y);
\r
207 r:=entier(o.r*skala);
\r
231 fs:=fs-(fx-fy) div 2+3*(pp-qq);
\r
246 unit poczatek:procedure;
\r
251 unit koniec:procedure;
\r
256 unit czysc:procedure;
\r
265 ppom,po,pk,pp:punkt,
\r
277 while (i<1) or (i>9) do
\r
278 writeln("Podaj dlugosc odcinka");
\r
293 call ekr.rysodc(pp,pk);
\r
299 call ekr.rysokr(okg);
\r
303 call ekr.rysokr(okl);
\r
309 call ekr.rysokr(okp);
\r
310 ppr:=okl.przeczokreg(okp);
\r
311 odp:=okg.przeczprost(ppr);
\r
312 call ekr.rysodc(odp.a,odp.b);
\r
313 ppom:=pr.przeczprost(ppr);
\r
316 writeln("Punkt przeciecia,x=",ppom.x," y=",ppom.y);
\r
317 writeln("punkt gorny,x=",odp.a.x," y=",odp.a.y);
\r
318 writeln("Dlugosc d=",ppom.odleglosc(odp.a));
\r
319 writeln(" CZY CHCESZ JESZCZE RAZ?(T/N) ");
\r
321 if (a=/='t') and (a=/='T') then exit fi;
\r