5 PREF IIUWGRAPH BLOCK ;
\r
7 (*===========================================================================*)
\r
11 (*===========================================================================*)
\r
13 CONST PI = 3.1415926536 ;
\r
15 (*===========================================================================*)
\r
16 (* ZMIENNE GLOBALNE *)
\r
17 (*===========================================================================*)
\r
20 datapoints : points ,
\r
21 N : integer , (* Liczba punktow *)
\r
25 pierjeryw : integer ,
\r
26 monitor,message : okno ;
\r
30 (*===========================================================================*)
\r
32 (*===========================================================================*)
\r
45 unit PUSH : procedure (p:punkt ;inout stos:lifo) ;
\r
56 unit pops : procedure (inout stos :lifo ) ;
\r
69 (*===========================================================================*)
\r
71 (*===========================================================================*)
\r
73 UNIT sufit :function (x:real):integer ;
\r
75 result := entier (x) ;
\r
76 if result <> x then result := result + 1 fi
\r
79 (*===========================================================================*)
\r
81 UNIT punkt : class (x,y : real) ;
\r
86 xk := x - srodek.x ;
\r
93 (*===========================================================================*)
\r
95 UNIT prosta : class ( A,B :punkt ) ;
\r
98 if A.x = B.x andif A.y = B.y then raise error fi ;
\r
104 (*===========================================================================*)
\r
106 UNIT segment : procedure ( a,b : punkt ) ;
\r
108 VAR x,y,z,t :integer ;
\r
112 x := 21 + (a.x * 55);
\r
113 y := 284 - (a.y * 35);
\r
114 z :=21 + (b.x * 55);
\r
115 t := 284 - (b.y * 35);
\r
116 call move (x ,y ) ;
\r
117 call draw ( z ,t ) ;
\r
119 call point (x , y ) ;
\r
120 call cirb (x,y,2,0,0,1,1,1,1) ;
\r
122 call cirb (z,t,2,0,0,1,1,1,1) ;
\r
126 (*===========================================================================*)
\r
128 UNIT kursor : class (wr,kol : integer) ;
\r
132 (*===========================================================================*)
\r
134 UNIT okno : class (lg,pd : punkt ) ;
\r
136 Var map : arrayof integer ,
\r
140 rozm := 4 + ( pd.y-lg.y) * sufit((pd.x -lg.x ) / 8) ;
\r
141 rozm := rozm div 2 + 1 ;
\r
142 call move (lg.x,lg.y) ;
\r
143 map := getmap(pd.x,pd.y) ;
\r
148 (*===========================================================================*)
\r
150 UNIT points : class ;
\r
157 (*===========================================================================*)
\r
159 UNIT uklad : procedure ;
\r
161 VAR i,j : integer ,
\r
162 pom1,pom2 : punkt ;
\r
165 call move (20,10) ;
\r
166 call draw (15,20) ;
\r
167 call move (25,20) ;
\r
168 call draw (20,10) ;
\r
169 call draw (20,285) ;
\r
170 call draw (545,285) ;
\r
171 call draw (535,280) ;
\r
172 call move (535,290) ;
\r
173 call draw (545,285) ;
\r
174 call move (9,288) ;
\r
177 for i := 75 step 55 to 530 do
\r
179 call move (i,283) ;
\r
180 call draw (i,287) ;
\r
181 call move (i-4,288) ;
\r
182 call hascii (48 + j)
\r
185 for i := 250 step 35 downto 25 do
\r
189 call move (9,i-4) ;
\r
190 call hascii (48 + j) ;
\r
195 (*===========================================================================*)
\r
197 UNIT nwrite : procedure (n : integer ) ;
\r
199 if not (0 <= n and n <= 99) then
\r
202 call hascii (48 + n div 10 ) ;
\r
203 call hascii (48 + n mod 10 )
\r
206 (*===========================================================================*)
\r
208 UNIT hwrite :procedure(s:string) ;
\r
211 tab : arrayof character ;
\r
214 tab := unpack (s) ;
\r
215 for i := lower(tab) to upper(tab) do
\r
216 call hascii(ord(tab(i)))
\r
221 (*===========================================================================*)
\r
223 (*===========================================================================*)
\r
225 unit Reverse : procedure;
\r
227 write( chr(27), "[7m")
\r
230 unit Normal : procedure;
\r
232 write( chr(27), "[0m")
\r
236 unit EraseLine : procedure;
\r
238 write( chr(27), "[K")
\r
241 unit inchar : function : integer;
\r
242 (*podaj nr znaku przeslanego z klawiatury *)
\r
247 if i <> 0 then exit fi;
\r
252 unit NewPage : procedure;
\r
254 write( chr(27), "[2J")
\r
257 unit SetCursor : procedure(row, column : integer);
\r
258 var c,d,e,f : char,
\r
265 i := column div 10;
\r
266 j := column mod 10;
\r
269 write( chr(27), "[", c, d, ";", e, f, "H")
\r
272 unit CursorLeft : procedure (columns : integer);
\r
276 i := columns div 10;
\r
277 j := columns mod 10;
\r
280 write( chr(27), "[", e, f, "D")
\r
283 unit CursorRight : procedure (columns : integer);
\r
287 i := columns div 10;
\r
288 j := columns mod 10;
\r
291 write( chr(27), "[", e, f, "C")
\r
294 unit CursorUp : procedure (rows : integer);
\r
302 write( chr(27), "[", c, d, "A")
\r
305 unit CursorDown : procedure (rows : integer);
\r
313 write( chr(27), "[", c, d, "B")
\r
317 UNIT czekaj :procedure ;
\r
323 UNIT przerwa : procedure ;
\r
326 for i := 1 to pierjeryw do od
\r
329 (*========================================================================*)
\r
330 (*------------------------------------------------------------------------*)
\r
332 (*------------------------------------------------------------------------*)
\r
333 (*========================================================================*)
\r
336 UNIT menu : procedure ;
\r
340 (*------------------------------------------------------------------------*)
\r
342 Unit list : class ;
\r
344 Var nast,pop : list ;
\r
346 Unit virtual proc : procedure ;
\r
354 (*------------------------------------------------------------------------*)
\r
356 UNIT run : list class ;
\r
358 unit virtual proc : procedure ;
\r
361 punkty : arrayof tpunkt ,
\r
367 (* - - - - - - - - - - - - - - - - - - *)
\r
369 Unit tpunkt : punkt class ;
\r
373 Unit bieg : class ;
\r
376 writeln (debug , "353(bieg) reached");
\r
377 r := sqrt ( (x - srodek.x)*(x - srodek.x) +
\r
378 (y - srodek.y)*(y - srodek.y) ) ;
\r
379 if (x - srodek.x) = 0 then
\r
380 if (y - srodek.y) > 0 then
\r
386 if (x - srodek.x) > 0 then
\r
387 a := atan ((y - srodek.y)/(x - srodek.x))
\r
389 a := atan ((y - srodek.y)/(x - srodek.x)) ;
\r
401 (* - - - - - - - - - - - - - - - - - - *)
\r
403 Unit sort :procedure(a:arrayof tpunkt ;
\r
404 function less (p1,p2 : tpunkt):boolean) ;
\r
406 Unit sorting:procedure (l,p : integer ) ;
\r
407 var i,j : integer ,
\r
411 x := a ((l+p) div 2 ) ;
\r
413 while less (a(i),x) do i := i + 1 od ;
\r
414 while less (x,a(j)) do j := j - 1 od ;
\r
419 i := i+1 ; j := j-1
\r
421 if i > j then exit fi
\r
423 if l < j then call sorting (l , j) fi ;
\r
424 if i < p then call sorting (i , p) fi
\r
428 call sorting (lower(a) , upper(a) )
\r
431 (* - - - - - - - - - - - - - - - - - - *)
\r
433 Unit prep:procedure ;
\r
438 poml1 := datapoints.next ;
\r
440 while poml1 <> none
\r
442 if poml1.p.y < miny.y then
\r
445 poml1 := poml1.next
\r
450 (* - - - - - - - - - - - - - - - - - - *)
\r
452 Unit less1 : function (p1,p2 : tpunkt) : boolean ;
\r
454 result := p1.b.a = p2.b.a ;
\r
456 result := p1.b.r < p2.b.r
\r
458 result := p1.b.a < p2.b.a
\r
462 (* - - - - - - - - - - - - - - - - - - *)
\r
464 Unit sameside : function (p1,p2 : punkt ; pr : prosta ) : boolean ;
\r
469 a := (pr.B.y - pr.A.y) / (pr.B.x - pr.A.x) ;
\r
470 b := pr.B.y - a * pr.B.x ;
\r
471 result := (a * p1.x + b - p1.y) * (a * p2.x + b - p2.y) >= 0
\r
474 (* - - - - - - - - - - - - - - - - - - *)
\r
477 when error : terminate ;
\r
480 (* - - - - - - - - - - - - - - - - - - *)
\r
483 if N < 3 then raise error fi ;
\r
486 writeln(debug,"RUN starts");
\r
487 call move (100,320) ;
\r
488 call hwrite("Quicksort working ");
\r
490 writeln(debug,"PREP done");
\r
491 array punkty dim (1 : N-1) ;
\r
492 poml1 := datapoints.next ;
\r
494 while poml1 <> none
\r
496 if poml1.p <> srodek then
\r
497 punkty (i) := new tpunkt(poml1.p.x,poml1.p.y) ;
\r
499 writeln(debug,"PUNKTY (",i:2,") done");
\r
501 poml1 := poml1.next ;
\r
503 if i <> N then raise error fi ;
\r
504 writeln(debug,"PUNKTY done");
\r
505 call sort (punkty,less1) ;
\r
506 call hwrite("done !") ;
\r
507 writeln(debug,"QUICKSORT done");
\r
510 writeln (debug,punkty(i).b.a) ;
\r
514 (*------------- T O J E S T D U S Z A P R O G R A M U ----------------*)
\r
517 call push (srodek,stack ) ;
\r
518 call push (punkty (1) , stack ) ;
\r
519 call segment (srodek,stack.p) ;
\r
521 call push (punkty (2) , stack ) ;
\r
523 call segment (stack.next.p,stack.p) ;
\r
528 call segment (stack.p,punkty(i)) ;
\r
529 a :=copy (stack.p) ;b:=copy (stack.next.p) ;
\r
530 pr := new prosta(a,b) ;
\r
531 while not sameside (punkty(i),srodek,pr)
\r
535 call segment (punkty(i) , stack.p) ;
\r
537 call segment (stack.p,stack.next.p) ;
\r
538 call pops (stack) ;
\r
541 call segment (stack.p,punkty(i) ) ;
\r
542 kill (pr.a);kill(pr.b) ;
\r
544 a := copy (stack.p) ;
\r
545 b := copy (stack.next.p) ;
\r
546 pr := new prosta(a,b) ;
\r
548 kill (pr.a);kill(pr.b) ;
\r
550 call push (punkty(i),stack)
\r
554 call segment (stack.p,srodek) ;
\r
555 writeln(debug,"OTOCZKA DONE") ;
\r
556 poms := stack.next ;
\r
557 writeln(debug,"a done") ;
\r
558 while poms.p <> none
\r
560 call segment (stack.p, poms.p) ;
\r
561 writeln(debug,"b done") ;
\r
563 poms := poms.next ;
\r
564 if poms = none then exit fi
\r
566 writeln(debug,"STACK REWRITTEN") ;
\r
567 poml1 := datapoints.next ;
\r
568 while poml1 <> none
\r
570 x := 21 + (poml1.p.x * 55) ;
\r
571 y := 284 - (poml1.p.y * 35) ;
\r
572 call point ( x , y ) ;
\r
573 call cirb (x,y,2,0,0,1,1,1,1) ;
\r
574 poml1 := poml1.next
\r
576 writeln(debug,"POINTS REWRITTEN") ;
\r
577 message := new okno (new punkt(100,320),new punkt(530,330)) ;
\r
578 call move(100,320) ;
\r
579 call xormap(message.map);
\r
580 kill (message.map) ;
\r
583 while stack <> none
\r
585 poms := poms.next ;
\r
589 writeln(debug,"stack killed") ;
\r
592 kill (punkty(i).b) ;
\r
601 (*------------------------------------------------------------------------*)
\r
603 Unit randp : list class ;
\r
605 Unit virtual proc : procedure ;
\r
607 Var M,i,j : integer ,
\r
612 call move (150,305) ;
\r
613 call hwrite ("There are ");
\r
615 call hwrite (" points now .") ;
\r
616 call move (150 , 327) ;
\r
617 call hwrite ("How many new points generate ?") ;
\r
618 call move (440,316) ;
\r
619 call hwrite("M = ") ;
\r
625 call hascii ( i ) ;
\r
627 while (j<48 or j>57) and j<>13
\r
635 M := (i-48)*10 + j-48 ;
\r
636 while i <> 13 do i := inchar od
\r
639 if N + M > 99 then M := 99 - N fi ;
\r
641 poml1 := datapoints ;
\r
642 while poml1.next <> none
\r
644 poml1 := poml1.next
\r
648 poml1.next := new points ;
\r
649 poml1 := poml1.next ;
\r
650 poml1.p := new punkt (random * 9 , random * 7 ) ;
\r
651 x := 21 + (poml1.p.x * 55) ;
\r
652 y := 284 - (poml1.p.y * 35) ;
\r
653 call point ( x , y ) ;
\r
654 call cirb (x,y,2,0,0,1,1,1,1) ;
\r
656 call move (6,301) ;
\r
657 message := new okno (new punkt(6,301),new punkt (549,339) );
\r
658 call xormap (message.map) ;
\r
659 kill (message.map) ;
\r
666 (*------------------------------------------------------------------------*)
\r
668 Unit Inputp : list class ;
\r
670 Unit virtual proc :procedure ;
\r
672 Var poml1 : points ,
\r
679 call move (70,315);
\r
680 call hwrite (" To many points (Ok?)") ;
\r
685 call move (50,315) ;
\r
686 message := new okno(new punkt(50,315),new punkt(60,550));
\r
687 call xormap (message.map) ;
\r
688 kill (message.map) ;
\r
691 poml1 := datapoints ;
\r
692 while poml1.next <> none
\r
694 poml1 := poml1.next
\r
696 call move(100,315) ;
\r
697 call hwrite("Press 'End' when ready") ;
\r
698 call move (225,150) ;
\r
699 call track (inxpos,inypos) ;
\r
700 if 20 < inxpos andif inxpos < 548 andif
\r
701 7 < inypos andif inypos < 280 then
\r
704 call point ( x , y ) ;
\r
705 call cirb (x,y,2,0,0,1,1,1,1) ;
\r
706 Writeln(debug,"Nowy punkt -",x:3,",",y:3);
\r
707 poml1.next := new points ;
\r
708 poml1 := poml1.next ;
\r
709 poml1.p := new punkt ((x-20)/55,(285-y)/35 ) ;
\r
712 call move (100,315) ;
\r
713 message := new okno(new punkt(100,315),new punkt(500,330)) ;
\r
714 call xormap(message.map) ;
\r
715 kill (message.map) ;
\r
717 poml1 := datapoints ;
\r
719 while poml1.next <> none
\r
721 poml1 := poml1.next ;
\r
724 writeln (debug,i : 3,"PUNKTOW wlozonych") ;
\r
731 (*------------------------------------------------------------------------*)
\r
733 UNIT delp : list class ;
\r
735 Unit virtual proc :procedure ;
\r
737 Var poml1,poml2 : points ;
\r
741 call move ( 50,315) ;
\r
742 call hwrite ("Are you sure ? (y/n) ") ;
\r
744 while i <> 121 and i <> 110
\r
749 poml1 := datapoints.next ;
\r
750 while poml1 <> none
\r
752 poml2 := poml1.next ;
\r
758 monitor := new okno (new punkt (6,6),new punkt(549,299) ) ;
\r
760 call xormap(monitor.map) ;
\r
761 kill (monitor.map) ;
\r
765 call move (50,315) ;
\r
769 call move (inxpos+8,inypos)
\r
778 (*------------------------------------------------------------------------*)
\r
780 UNIT Clrscr : list class ;
\r
782 Unit virtual proc : procedure ;
\r
789 monitor := new okno (new punkt(6,6),new punkt(549,299)) ;
\r
790 call xormap (monitor.map) ;
\r
791 kill (monitor.map) ;
\r
794 poml1 := datapoints.next ;
\r
795 while poml1 <> none
\r
797 x := 21 + (poml1.p.x * 55) ;
\r
798 y := 284 - (poml1.p.y * 35) ;
\r
799 call point ( x , y ) ;
\r
800 call cirb (x,y,2,0,0,1,1,1,1) ;
\r
801 poml1 := poml1.next
\r
809 (*------------------------------------------------------------------------*)
\r
811 Unit pstryczek : procedure (a,b : integer );
\r
813 Unit ramka: procedure(a,b:integer) ;
\r
815 call move (a-1,b-1) ;
\r
816 call draw (a+19*8+2 , b-1) ;
\r
817 call draw (a+19*8+2 , b+9) ;
\r
818 call draw (a-1,b+9 ) ;
\r
819 call draw (a-1,b-1) ;
\r
826 call ramka(inxpos,inypos) ;
\r
833 (*------------------------------------------------------------------------*)
\r
836 lista:= new randp ;
\r
837 lista.pop := new clrscr ;
\r
838 lista.pop.nast := lista ;
\r
839 lista.nast := new inputp ;
\r
840 lista.nast.pop := lista ;
\r
841 lista.nast.nast := new delp ;
\r
842 lista.nast.nast.pop := lista.nast ;
\r
843 lista.nast.nast.nast := new run ;
\r
844 lista.nast.nast.nast.pop :=lista.nast.nast ;
\r
845 lista.nast.nast.nast.nast := lista.pop ;
\r
846 lista.pop.pop := lista.nast.nast.nast ;
\r
848 call move (580,50);
\r
849 call hwrite("Random points ") ;
\r
850 call move (580,80) ;
\r
851 call hwrite("Input point") ;
\r
852 call move (580,110) ;
\r
853 call hwrite("Del points") ;
\r
854 call move (580,140) ;
\r
855 call hwrite("R U N") ;
\r
856 call move (580,170) ;
\r
857 call hwrite("Clr scr") ;
\r
858 call move (560 , 300) ;
\r
859 call hwrite ("Press 'Esc' to quit") ;
\r
861 call pstryczek (555,50) ;
\r
865 if i = 27 then exit fi ;
\r
872 when 0 : lista := lista.nast ;
\r
875 call pstryczek (555,50) ;
\r
878 call pstryczek (555,j)
\r
881 when 8 : lista := lista.pop ;
\r
884 call pstryczek (555,170) ;
\r
887 call pstryczek (555,j)
\r
895 (*------------------------------------------------------------------------*)
\r
896 (* KONIEC MENU GLOWNEGO *)
\r
897 (*------------------------------------------------------------------------*)
\r
899 UNIT welcome : procedure ;
\r
901 Unit ramka : procedure ;
\r
909 call setcursor (10,30)
\r
913 (*===========================================================================*)
\r
916 when error : call groff ;
\r
917 writeln (" BLAD ! ") ;
\r
922 (*===========================================================================*)
\r
924 BEGIN (* BLOKU GLOWNY *)
\r
926 datapoints := new points ;
\r
927 stack := new lifo ;
\r
928 open (debug,text,unpack("debug.dub"));
\r
929 call rewrite(debug) ;
\r
932 call draw (715,5) ;
\r
933 call draw (715,340) ;
\r
934 call draw (5,340) ;
\r
936 call move (550,5) ;
\r
937 call draw (550,340) ;
\r
938 call move (550,300) ;
\r
939 call draw (5,300) ;
\r