program gitter; uses dos ,graph,crt; const xmin=30;xmax=450;c2=0.00004;maabst=0.6;maxsteck=12;grad=3;c3=0.0001; maxcol=20;fy=350/480; var graphdriver,graphmode:integer; i,i1,i2,i3,anz,xp,yp,b1,b6,b9,fi,ri,icol,bildtyp,inumber,ibp,anzd:integer; x1,y1,z1,x2,y2,z2,xo,yo,zo,xn,yn,zn,sx,sy,sz,xb,yb,zb,bo,rii,bdf:real; almax,alpz,alsz,gah,gah2,gav,gav2,c1,ax,ay,az:real; wa,wb,wc,dax,db,dc,dbx,dby,dcx,dcy,dcz,dr,c4:real; name,ubers,zeile1,zeile2,zeile3,zeile4,zeile5,zeile6:string; tex:text; farbe,xasp,yasp,c5:word; b2,b3,b4,b5,b7,b8,b19,key:char; sa2i:real; MausX, MausY: Integer; regs: Registers; x,y,z,r,sqrabst,sa2,xs,ys,rs:array [1..400] of real; f,folge,sort:array [1..400] of word; col:array [1..maxcol] of word; steck:array[1..400,1..maxsteck] of word; var c: array[1..grad] of real; de: array[1..grad] of extended; b:array[1..grad,1..grad] of extended; stelle:array [1..grad] of integer; eax,ebx,ecx,eay,eby,ecy,norx,nory,norz:real; xneux,xneuy,xneuz,yneux,yneuy,yneuz,zneux,zneuy,zneuz:real; zsneux,zsneuy,zsneuz:real; apsx,apsy,apsz,assx,assy,assz,firot,anonorm:real; procedure ig; begin graphdriver:=VGA;graphmode:=VGAMed; initgraph(graphdriver,graphmode,'c:\sprachen\tp\bgi'); SetActivePage(0); end; procedure colorinit; begin for i:=1 to maxcol do col[i]:=i; end; function color(ii:word):word; begin if ((00; if i11 then begin write('Dateiname : ');readln(name); assign(tex,name);reset(tex); write('Alle Sorten darstellen ? (j/n) ');readln(b4); if b4='j' then begin i:=0; repeat inc(i); readln(tex,f[i]);readln(tex,r[i]); readln(tex,x[i]);readln(tex,y[i]);readln(tex,z[i]); until eof(tex); anz:=i; end; if b4<>'j' then begin for i:=1 to 20 do sort[i]:=0; writeln('Geben Sie die Sortennummern ein, die nicht dargestellt werden sollen!'); writeln('Als letzte Zahl "0" eingeben!'); i:=0; repeat inc(i); readln(sort[i]); until sort[i]=0; i:=0; repeat inc(i); readln(tex,fi); i1:=0;i2:=0; repeat inc(i1); if fi=sort[i1] then inc(i2); until sort[i1]=0; if i2=0 then begin f[i]:=fi; readln(tex,r[i]); readln(tex,x[i]);readln(tex,y[i]);readln(tex,z[i]); end else begin dec(i); readln(tex,rii);readln(tex,rii);readln(tex,rii);readln(tex,rii);end; until eof(tex); anz:=i; end; close(tex); end; end; procedure Eingabe1k5; begin write('Standardisiertes Orthogonales Koordinatensystem ? (j/n) '); readln(b5); if b5='n' then begin write('Winkel zwischen X"- und Y"-Achse in ø : ');readln(wc); write('Winkel zwischen X"- und Z"-Achse in ø : ');readln(wb); write('Winkel zwischen Y"- und Z"-Achse in ø : ');readln(wa); write('Dehnungsfaktor in X"-Richtung : ');readln(dax); write('Dehnungsfaktor in Y"-Richtung : ');readln(db); write('Dehnungsfaktor in Z"-Richtung : ');readln(dc); write('Radiendehnungsfaktor : ');readln(dr); wc:=wc*pi/180;wb:=wb*pi/180;wa:=wa*pi/180; dbx:=db*cos(wc);dby:=db*sin(wc); dcx:=dc*cos(wb);dcy:=(db*dc*cos(wa)-dbx*dcx)/dby; dcz:=sqrt(sqr(dc)-sqr(dcx)-sqr(dcy)); for i:=1 to anz do begin x[i]:=dax*x[i]+dbx*y[i]+dcx*z[i]; y[i]:=dby*y[i]+dcy*z[i]; z[i]:=dcz*z[i]; r[i]:=r[i]*dr;end; end; end; procedure Eingabe1k7; var jn1,jn2:char; begin write('Beschriftung der Grafik (j/n) ');readln(jn1); if jn1='n' then begin ubers:='';zeile1:='';zeile2:='';zeile3:='';zeile4:='';zeile5:='';zeile6:=''; end else begin repeat write('Eingabe der šberschrift : ');readln(ubers); write('Eingabe Randzeile 1 : ');readln(zeile1); write('Eingabe Randzeile 2 : ');readln(zeile2); write('Eingabe Randzeile 3 : ');readln(zeile3); write('Eingabe Randzeile 4 : ');readln(zeile4); write('Eingabe Randzeile 5 : ');readln(zeile5); write('Eingabe Randzeile 6 : ');readln(zeile6); write('Alle Eingaben richtig (j/n) ? ');readln(jn2); until jn2='j'; clrscr; end; end; procedure eingabe1k8; var jn1:char; begin write('Steckermodus „ndern? (j/n) ');readln(jn1); if jn1='j' then begin writeln('Der aktuelle Modus ist'); if b8<>'j' then writeln('Stecker nicht mitzeichnen') else begin if b9=1 then writeln('Stecker mitzeichnen / absolut / Amax= ',c1:0:3) else writeln('Stecker mitzeichnen / relativ / c= ',c1:0:3); end; write('Stecker mitzeichnen? (j/n) ');readln(b8); if b8='j' then begin write('Steckermodus absolut (1) / relativ (2) ');readln(b9); if b9=1 then begin writeln('Es werden Stecker zwischen allen Atomen gezeichnet, die bis zu einem'); writeln('Maximalabstand Amax voneinander entfernt sind.'); write('Amax: ');readln(c1); end else begin writeln('Es werden Stecker zu allen Atomen gezeichnet deren Abstand nicht gr”áer'); writeln('als der c-fache Abstand zum n„chsten Nachbarn ist.'); write('c: ');readln(c1); end; end;end;end; procedure Eingabe2; var xbt,ybt,zbt,norm:real; begin writeln; writeln('Betrachterposition : '); if b5='n' then begin writeln('Eingabe im aktuellen Koordinatensystem (1) / Standardisierten Orthogonalen'); write('Koordinatensystem (2) ');readln(b6); if b6=1 then begin write('X"-Koordinate : ');readln(xbt); write('Y"-Koordinate : ');readln(ybt); write('Z"-Koordinate : ');readln(zbt); xb:=dax*xbt+dbx*ybt+dcx*zbt; yb:=dby*ybt+dcy*zbt; zb:=dcz*zbt; end;end; if ((b5<>'n') or (b6<>1)) then begin write('X-Koordinate : ');readln(xb); write('Y-Koordinate : ');readln(yb); write('Z-Koordinate : ');readln(zb); end; ax:=xn-xb;ay:=yn-yb;az:=zn-zb; norm:=sqrt(sqr(ax)+sqr(ay)+sqr(az)); anonorm:=norm; ax:=ax/norm;ay:=ay/norm;az:=az/norm; write('Bilddehnungsfaktor : ');readln(bdf);bdf:=1/abs(bdf); repeat write('Bildtyp (1,2) : ');readln(bildtyp); until((bildtyp=1) or (bildtyp=2)); end; procedure Eingabe2k2; var xst,yst,zst,norm:real; bed:boolean; begin writeln('Geben Sie einen Vektor ein, der die senkrechte Achse auf dem'); writeln('Bildschirm festlegt!'); repeat if b5='n' then begin writeln('Eingabe im aktuellen Koordinatensystem (1) / Standardisierten Orthogonalen'); write('Koordinatensystem (2) ');readln(b6); if b6=1 then begin write('X"-Koordinate : ');readln(xst); write('Y"-Koordinate : ');readln(yst); write('Z"-Koordinate : ');readln(zst); sx:=dax*xst+dbx*yst+dcx*zst; sy:=dby*yst+dcy*zst; sz:=dcz*zst; end;end; if ((b5<>'n') or (b6<>1)) then begin write('X-Koordinate : ');readln(sx); write('Y-Koordinate : ');readln(sy); write('Z-Koordinate : ');readln(sz); end; if (sqr(ax*sx+ay*sy+az*sz)<0.99*(sqr(ax)+sqr(ay)+sqr(az))* (sqr(sx)+sqr(sy)+sqr(sz))) then bed:=true else begin bed:=false; writeln('Dieser Vektor kann nicht senkrecht senkrecht auf dem Bildschirm'); writeln('dargestellt werden. Geben Sie einen anderen Vektor ein!');end; until bed=true; norm:=sqrt(sqr(sx)+sqr(sy)+sqr(sz)); sx:=sx/norm;sy:=sy/norm;sz:=sz/norm; repeat write('Drehwinkel (0c3 then begin fzx:=zneux/(sqr(zneux)+sqr(zneuy)); fzy:=zneuy/(sqr(zneux)+sqr(zneuy)); xneux:=fzx*zneux*zneuz+fzy*zneuy; xneuy:=fzx*zneuy*zneuz-fzy*zneux; xneuz:=-fzx*(sqr(zneux)+sqr(zneuy)); yneux:=fzy*zneux*zneuz-fzx*zneuy; yneuy:=fzy*zneuy*zneuz+fzx*zneux; yneuz:=-fzy*(sqr(zneux)+sqr(zneuy)); end else begin if zneuz>0 then begin xneux:=1;xneuy:=0;xneuz:=0; yneux:=0;yneuy:=1;yneuz:=0; end else begin xneux:=0;xneuy:=-1;xneuz:=0; yneux:=-1;yneuy:=0;yneuz:=0; end; end; end; procedure kotrafo; begin b[1,1]:=xneux; b[1,2]:=yneux; b[1,3]:=zneux; b[2,1]:=xneuy; b[2,2]:=yneuy; b[2,3]:=zneuy; b[3,1]:=xneuz; b[3,2]:=yneuz; b[3,3]:=zneuz; de[1]:=x1; de[2]:=y1; de[3]:=z1; koeff;koeff2; x1:=c[1];y1:=c[2];z1:=c[3]; end; procedure Ordnen; var j,folgei:integer; sa2i:real; begin for i:=1 to anz do begin sqrabst[i]:=sqr(xb-x[i])+sqr(yb-y[i])+sqr(zb-z[i]); sa2[i]:=sqrabst[i];folge[i]:=i;end; repeat j:=0; for i:=1 to anz-1 do begin if sa2[i] 0; MausX := regs.cx; MausY := regs.dx; delay(500); end; procedure Info; var sx,sy,sz,sfi:string; yi:integer; begin settextstyle(1,horizdir,2); settextjustify(centertext,centertext); outtextxy(220,round(fy*15),ubers); settextstyle(0,horizdir,0); outtextxy(550,round(fy*15),'Beobachterposition :'); outtextxy(550,round(fy*90),'Blickposition :'); outtextxy(550,round(fy*165),'Blickwinkel :'); str(xb:8:2,sx); str(yb:8:2,sy); str(zb:8:2,sz); outtextxy(500,round(fy*30),'X :'); outtextxy(500,round(fy*45),'Y :'); outtextxy(500,round(fy*60),'Z :'); outtextxy(580,round(fy*30),sx); outtextxy(580,round(fy*45),sy); outtextxy(580,round(fy*60),sz); str(xn:8:2,sx); str(yn:8:2,sy); str(zn:8:2,sz); outtextxy(500,round(fy*105),'X :'); outtextxy(500,round(fy*120),'Y :'); outtextxy(500,round(fy*135),'Z :'); outtextxy(580,round(fy*105),sx); outtextxy(580,round(fy*120),sy); outtextxy(580,round(fy*135),sz); str(almax*180/pi:8:2,sfi); outtextxy(500,round(fy*180),'Fi/ø :'); outtextxy(580,round(fy*180),sfi); settextjustify(lefttext,centertext); outtextxy(461,round(fy*240),zeile1); outtextxy(461,round(fy*255),zeile2); outtextxy(461,round(fy*270),zeile3); outtextxy(461,round(fy*285),zeile4); outtextxy(461,round(fy*300),zeile5); outtextxy(461,round(fy*315),zeile6); readln; setcolor(0); for yi:=0 to 30 do line(0,round(fy*yi),640,round(fy*yi)); for yi:=31 to 480 do line(460,round(fy*yi),640,round(fy*yi)); setcolor(15); end; procedure Beschriftung0; begin settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(60,round(fy*15),'ENDE'); outtextxy(260,round(fy*15),'Andere Beobachterposition'); outtextxy(450,round(fy*15),'Maus'); setcolor(10); outtextxy(60,round(fy*15),'E '); outtextxy(260,round(fy*15),'A '); outtextxy(450,round(fy*15),'M '); setcolor(15); repeat key:=readkey; until((key='e')or(key='a')or(key='m')); end; procedure Beschriftung; begin setcolor(0); outtextxy(450,round(fy*15),'Maus'); setcolor(15); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(60,round(fy*15),'ENDE'); outtextxy(260,round(fy*15),'Andere Beobachterposition'); outtextxy(550,round(fy*15),'Position'); outtextxy(550,round(fy*55),'Radius'); outtextxy(550,round(fy*95),'Abstand'); outtextxy(550,round(fy*135),'Winkel'); outtextxy(550,round(fy*175),'Sorte'); end; function Find2:integer; var ii,ifind:integer; afs,mfs:longint; begin mfs:=300000; for ii:=1 to anz do begin afs:=sqr(mausx-round(xs[ii]))+sqr(mausy-round(ys[ii]*fy)); if afsinvsabstmax then begin invsabstmax:=invsabst;ifind:=ii;end; end; end; if ifind=0 then ifind:=find2; find:=ifind; end; procedure Position; var ifind,xi,yi,farbe1:integer; sx,sy,sz,si:string; begin setcolor(0); for yi:=200 to 480 do line(460,round(fy*yi),640,round(fy*yi)); setcolor(15); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(550,round(fy*220),'POSITION'); mauseingabe; ifind:=find; str(x[ifind]:8:2,sx); str(y[ifind]:8:2,sy); str(z[ifind]:8:2,sz); str(ifind:2,si); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(500,round(fy*320),'X');outtextxy(520,round(fy*320),si); outtextxy(500,round(fy*360),'Y');outtextxy(520,round(fy*360),si); outtextxy(500,round(fy*400),'Z');outtextxy(520,round(fy*400),si); outtextxy(580,round(fy*320),sx); outtextxy(580,round(fy*360),sy); outtextxy(580,round(fy*400),sz); end; procedure Radius; var ifind,xi,yi,farbe1:integer; sr,si:string; begin setcolor(0); for yi:=200 to 480 do line(460,round(fy*yi),640,round(fy*yi)); setcolor(15); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(550,round(fy*220),'RADIUS'); mauseingabe; ifind:=find; str(r[ifind]:8:2,sr); str(ifind:2,si); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(500,round(fy*320),'R');outtextxy(520,round(fy*320),si); outtextxy(580,round(fy*320),sr); end; procedure Abstand; var ifind1,ifind2,xi,yi:integer; sr,si1,si2:string; rabst:real; begin setcolor(0); for yi:=200 to 480 do line(460,round(fy*yi),640,round(fy*yi)); setcolor(15); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(550,round(fy*220),'ABSTAND'); mauseingabe; ifind1:=find; mauseingabe; ifind2:=find; rabst:=sqr(x[ifind1]-x[ifind2])+sqr(y[ifind1]-y[ifind2])+sqr(z[ifind1]-z[ifind2]); rabst:=sqrt(rabst); str(rabst:8:2,sr); str(ifind1:2,si1);str(ifind2:2,si2); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(520,round(fy*320),'A'); outtextxy(550,round(fy*320),si1); outtextxy(580,round(fy*320),si2); outtextxy(540,round(fy*360),sr); end; procedure Kleinwinkel; var ifind1,ifind2,ifind3,xi,yi:integer; sr,si1,si2,si3:string; rabst:real; begin setcolor(0); for yi:=200 to 480 do line(460,round(fy*yi),640,round(fy*yi)); setcolor(15); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(550,round(fy*220),'WINKEL'); mauseingabe; ifind1:=find; mauseingabe; ifind2:=find; mauseingabe; ifind3:=find; rabst:=(x[ifind1]-x[ifind2])*(x[ifind3]-x[ifind2]); rabst:=rabst+(y[ifind1]-y[ifind2])*(y[ifind3]-y[ifind2]); rabst:=rabst+(z[ifind1]-z[ifind2])*(z[ifind3]-z[ifind2]); rabst:=rabst/sqrt(sqr(x[ifind1]-x[ifind2])+sqr(y[ifind1]-y[ifind2])+sqr(z[ifind1]-z[ifind2])); rabst:=rabst/sqrt(sqr(x[ifind3]-x[ifind2])+sqr(y[ifind3]-y[ifind2])+sqr(z[ifind3]-z[ifind2])); rabst:=arccos(rabst); rabst:=rabst*180/pi; str(rabst:8:2,sr); str(ifind1:2,si1);str(ifind2:2,si2);str(ifind3:2,si3); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(480,round(fy*320),'Fi');outtextxy(520,round(fy*320),si1); outtextxy(550,round(fy*320),si2);outtextxy(580,round(fy*320),si3); outtextxy(540,round(fy*360),sr); end; procedure Sorte; var ifind,xi,yi,farbe1:integer; ss,si:string; begin setcolor(0); for yi:=200 to 480 do line(460,round(fy*yi),640,round(fy*yi)); setcolor(15); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(550,round(fy*220),'SORTE'); mauseingabe; ifind:=find; str(f[ifind]:2,ss); str(ifind:2,si); settextstyle(0,horizdir,1); settextjustify(centertext,centertext); outtextxy(500,round(fy*320),'S');outtextxy(520,round(fy*320),si); outtextxy(580,round(fy*320),ss); end; procedure Koordinatensystem1; var spx,spy,spz,px,py,pz,ehax,ehbx,ehcx,ehay,ehby,ehcy:real; var jj:integer; begin px:=xb-xn;py:=yb-yn;pz:=zb-zn; spx:=sqr(px);spy:=sqr(py);spz:=sqr(pz); norx:=1/sqrt(spx+spy); nory:=1/sqrt(spx*spz+spy*spz+sqr(spx+spy)); norz:=1/sqrt(spx+spy+spz); for jj:=1 to 3 do begin b[1,1]:=zsneux; b[1,2]:=zneux; b[1,3]:=ax; b[2,1]:=zsneuy; b[2,2]:=zneuy; b[2,3]:=ay; b[3,1]:=zsneuz; b[3,2]:=zneuz; b[3,3]:=az; de[1]:=0;de[2]:=0;de[3]:=0; de[jj]:=1; koeff; koeff2; if jj=1 then begin ehax:=c[1];ehay:=c[2];end; if jj=2 then begin ehbx:=c[1];ehby:=c[2];end; if jj=3 then begin ehcx:=c[1];ehcy:=c[2];end; end; eax:=ehax;eay:=ehay;ebx:=ehbx;eby:=ehby;ecx:=ehcx;ecy:=ehcy; end; procedure Koordinatensystem2; var xursp,yursp:integer; acol:word; sibp:string; begin xursp:=550;yursp:=400; if xb-xn>0 then acol:=15 else acol:=7; setcolor(acol); moveto(xursp,round(fy*yursp)); lineto(xursp+round(40*eax),round(fy*(yursp-40*eay))); if yb-yn>0 then acol:=15 else acol:=7; setcolor(acol); moveto(xursp,round(fy*yursp)); lineto(xursp+round(40*ebx),round(fy*(yursp-40*eby))); if zb-zn>0 then acol:=15 else acol:=7; setcolor(acol); moveto(xursp,round(fy*yursp)); lineto(xursp+round(40*ecx),round(fy*(yursp-40*ecy))); setcolor(15); putpixel(xursp,round(fy*yursp),15); settextstyle(0,horizdir,0); settextjustify(centertext,centertext); outtextxy(xursp+round(60*eax),round(fy*(yursp-60*eay)),'x'); outtextxy(xursp+round(60*ebx),round(fy*(yursp-60*eby)),'y'); outtextxy(xursp+round(60*ecx),round(fy*(yursp-60*ecy)),'z'); {inc(ibp);str(ibp,sibp);outtextxy(15,round(fy*15),sibp);} end; procedure changepage; begin setvisualpage(c5); if c5=0 then c5:=1 else if c5=1 then c5:=0; setactivepage(c5); setcolor(0); setfillstyle(0,0); bar(0,0,640,round(480*fy)); end; begin {Hauptprogramm} clrscr; c4:=1.06;c5:=0; colorinit; eingabe1; eingabe1k5; eingabe1k7; blickposition; b8:='n';b9:=2;c1:=1.23; repeat b19:='w';ibp:=0; eingabe2; eingabe2k2; eingabe2k5; ig; GetAspectRatio(Xasp,Yasp); setaspectratio(xasp,round(c4*yasp)); anzd:=0; repeat inc(anzd); changepage; xyzinit; xyzneu; if anzd=1 then maxwinkel; ordnen; setlinestyle(0,0,1); x1:=xb;y1:=yb;z1:=zb;kotrafo;x2:=x1;y2:=y1;z2:=z1; x1:=xn;y1:=yn;z1:=zn;kotrafo; winkel; gav2:=alpz;gah2:=alsz; for i1:=1 to anz do begin i2:=folge[i1]; x1:=x[i2];y1:=y[i2];z1:=z[i2];kotrafo; winkel; gav:=alpz-gav2; gah:=alsz-gah2; if gah>pi then gah:=gah-2*pi else if gah<(-pi) then gah:=gah+2*pi; rs[i2]:=(xmax-xmin)/almax*arcsin(r[i2]/bo); xs[i2]:=(xmin+xmax)/2+(xmax-xmin)*gah/almax; ys[i2]:=(xmin+xmax)/2-(xmax-xmin)*gav/almax; setlinestyle(0,0,3); if (bildtyp=2) then begin setcolor(0);setfillstyle(1,0);end else begin setcolor(color(f[i2])); setfillstyle(1,color(f[i2]));end; ri:=round(rs[i2]);xp:=round(xs[i2]);yp:=round(ys[i2]); pieslice(xp,round(fy*yp),0,360,ri); setlinestyle(0,0,1); if (bildtyp=2) then begin setcolor(color(f[i2])); ellipse(xp,round(fy*yp),0,360,ri,round(fy*ri)); {circle(xp,round(fy*yp),ri);}end; if bildtyp=1 then begin setcolor(0); ellipse(xp,round(fy*yp),0,360,ri+1,round(fy*(ri+1))); {circle(xp,round(fy*yp),ri+1);}end; {if b8='j' then steckerpaint;} end; koordinatensystem1; koordinatensystem2; if keypressed then begin if b19<>'e' then b19:=readkey;end; if b19='s' then begin readln;b19:='w';end; until ((b19='e')and(c5=0)); setvisualpage(c5); info; b3:='j'; key:='w'; beschriftung0; if key='m' then begin beschriftung; regs.ax := $00; intr($33,Regs); repeat MausEingabe; if mausx>460 then begin if mausy'j'; writeln;writeln('Programmende.');readln; end.