|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 5376 (0x1500)
Types: TextFile
Names: »XYGRAF.PAS«
└─⟦ba3b4f658⟧ Bits:30003088 Xray: elevopgave i Pascal, feb 92
└─⟦this⟧ »XYGRAF.PAS«
(* **************************************************************************
**** XYGRAF ****
**** Forklaring ligger i fotokopi. ****
************************************************************************** *)
PROCEDURE AKSER(A,B,aenhed,benhed:INTEGER);
var sted,streg :integer;
BEGIN
IF (B>=0) AND(B<=1023) THEN (* X-AKSEN TEGNES *)
BEGIN
POSITION(0,B);FLYTTIL(1023,B);
IF B<993 THEN FLYTTIL(993,B+30) ELSE FLYTTIL(993,1023);
IF B>30 THEN FLYTTIL(993,B-30) ELSE FLYTTIL(993,0);
FLYTTIL(1023,B);
(* enheder tegnes *)
STED:=A;WHILE STED>0 DO STED:=STED-AENHED;
IF B<1013 THEN STREG:=10 ELSE STREG:=-10;
WHILE STED<1023-AENHED DO
BEGIN
STED:=STED+AENHED;
POSITION(STED,B);
FLYTTIL(STED,B+STREG);
END;
END;
IF (A>=0) AND (A<=1023) THEN (* Y-AKSEN TEGNGES *)
BEGIN
POSITION(A,0);FLYTTIL(A,1023);
IF A<993 THEN FLYTTIL(A+30,993) ELSE FLYTTIL(1023,993);
IF A>30 THEN FLYTTIL(A-30,993) ELSE FLYTTIL(0,993);
FLYTTIL(A,1023);
(* ENHEDER TEGNES *)
STED:=B;WHILE STED>0 DO STED:=STED-BENHED;
IF A<1013 THEN STREG:=10 ELSE STREG:=-10;
WHILE STED<1023-BENHED DO
BEGIN
STED:=STED+BENHED;
POSITION(A,STED);
FLYTTIL(A+STREG,STED);
END;
END;
END;
PROCEDURE TEGNGRAF(VAR DATA:REALARRAY;ANTAL:INTEGER;
XMIN,XMAX,YMIN,YMAX :REAL );
LABEL EXIT;
VAR I,K :INTEGER; VAERDI:REAL;Y:INTARRAY;CH:CHAR;
XENHED,YENHED,XCENTRUM,YCENTRUM :REAL;
BEGIN
WRITELN;WRITELN('*GRAFTEGNING ... ');WRITELN('*');
WRITE('* SKAL KOORDINATSYSTEMET INDTEGNES? (J/N) : ');
REPEAT READ(KBD,CH) UNTIL CH IN (.'J','j','n','N'.);WRITELN(CH);
IF CH IN (.'J','j'.) THEN
BEGIN
WRITELN('HVORDAN SKAL AKSERNE INDELES ? ');
WRITELN('X-AKSEN DÆKKER FRA ',XMIN:10:2,' TIL ',XMAX:10:2);
WRITELN('Y-AKSEN DÆKKER FRA ',YMIN:10:2,' TIL ',YMAX:10:2);
WRITE('HVOR LANGT SKAL DER VÆRE MELLEM MÆRKERNE PÅ X-AKSEN ?');
READLN(XENHED);
WRITE('HVOR LANGT SKAL DER VÆRE MELLEM MÆRKERNE PÅ Y-AKSEN ?');
READLN(YENHED);
XENHED:=XENHED/(XMAX-XMIN)*(1024 DIV ANTAL)*(ANTAL-1);
YENHED:=YENHED/(YMAX-YMIN)*1023;
XCENTRUM:=-XMIN/(XMAX-XMIN)*(1024 DIV ANTAL)*(ANTAL-1);
YCENTRUM:=-YMIN/(YMAX-YMIN)*1023;
AKSER(ROUND(XCENTRUM),ROUND(YCENTRUM),ROUND(XENHED),ROUND(YENHED));
END;
K:=1024 DIV ANTAL; (*SKALAFAKTOR *)
FOR I:=0 TO ANTAL-1 DO
BEGIN
VAERDI:=1023/(YMAX-YMIN)*(DATA(.I.)-YMIN);
IF (VAERDI<=-0.5) OR (VAERDI>=1023.5) THEN Y(.I.):=-1
ELSE Y(.I.):=ROUND(VAERDI)
END;
I:=0;
REPEAT
WHILE Y(.I.) <0 DO (* UDENFOR PAPIRET *)
BEGIN I:=I+1; IF I>=ANTAL THEN GOTO EXIT END;
POSITION(K*I,Y(.I.));
WHILE Y(.I.)>=0 DO (* INDEN FOR PAPIRET *)
BEGIN MOVETO(K*I,Y(.I.));
I:=I+1; IF I>=ANTAL THEN GOTO EXIT
END;
PENPAUSE
UNTIL I>=ANTAL;
EXIT:
END;
PROCEDURE TEGNKURVE(VAR DATAX,DATAY:REALARRAY;ANTAL :INTEGER;
XMIN,XMAX,YMIN,YMAX :REAL );
LABEL EXIT;
VAR I:INTEGER; VAERDI:REAL;X,Y:INTARRAY;CH:CHAR;
XENHED,YENHED,XCENTRUM,YCENTRUM : REAL;
BEGIN
WRITELN;WRITELN('* KURVETEGNING...');WRITELN('*');
WRITE(' SKAL KOORDINATSYSTEMET TEGNES ? (J/N) : ');
REPEAT READ(KBD,CH) UNTIL CH IN (.'J','j','n','N'.); WRITELN(CH);
IF CH IN (.'J','j'.) THEN
BEGIN
WRITELN('HVORDAN SKAL AKSERNE INDELES ? ');
WRITELN('X-AKSEN DÆKKER FRA ',XMIN:10:2,' TIL ',XMAX:10:2);
WRITELN('Y-AKSEN DÆKKER FRA ',YMIN:10:2,' TIL ',YMAX:10:2);
WRITE('HVOR LANGT SKAL DER VÆRE MELLEM MÆRKERNE PÅ X-AKSEN ?');
READLN(XENHED);
WRITE('HVOR LANGT SKAL DER VÆRE MELLEM MÆRKERNE PÅ Y-AKSEN ?');
READLN(YENHED);
XENHED:=XENHED/(XMAX-XMIN)*1023;
YENHED:=YENHED/(YMAX-YMIN)*1023;
XCENTRUM:=-XMIN/(XMAX-XMIN)*1023;
YCENTRUM:=-YMIN/(YMAX-YMIN)*1023;
AKSER(ROUND(XCENTRUM),ROUND(YCENTRUM),ROUND(XENHED),ROUND(YENHED));
END;
FOR I:=0 TO ANTAL-1 DO
BEGIN
VAERDI:=1023/(XMAX-XMIN)*(DATAX(.I.)-XMIN);
IF (VAERDI<=-0.5) OR (VAERDI>=1023.5) THEN X(.I.):=-1
ELSE X(.I.):=ROUND(VAERDI);
VAERDI:=1023/(YMAX-YMIN)*(DATAY(.I.)-YMIN);
IF (VAERDI<=-0.5) OR (VAERDI>=1023.5) THEN Y(.I.):=-1
ELSE Y(.I.):=ROUND(VAERDI);
END;
I:=0;
REPEAT
WHILE (X(.I.)<0) OR (Y(.I.)<0) DO (* UNDENFOR PAPIRET *)
BEGIN I:=I+1; IF I>=ANTAL THEN GOTO EXIT END;
POSITION(X(.I.),Y(.I.));
WHILE (X(.I.)>=0) AND (Y(.I.)>=0) DO (* INDENFOR PAPIRET *)
BEGIN MOVETO(X(.I.),Y(.I.));I:=I+1; IF I>=ANTAL THEN GOTO EXIT END;
PENPAUSE;
UNTIL I>=ANTAL;
EXIT:
END;
«eof»