home *** CD-ROM | disk | FTP | other *** search
- /***************************************************************
- * *
- * Alles hier ist in Turbo C 1.0 für den ATARI ST geschrieben. *
- * Dieses C ist voll nach ANSI definiert, auf jede nichtkom- *
- * patible Erweiterung wurde bewußt verzichtet, ist aber auch *
- * unter Turbo C 1.1 getestet. *
- * *
- * Es wurden nur sehr wenige Grafikbefehle aus dem GEM-VDI *
- * benutzt: Linien ziehen, Beschriften, Schrifthöhe wählen, *
- * Linienart wählen, Farbe wählen. Diese Befehle lassen sich *
- * durch entsprechende Grafikbefehle anderer Computer oder *
- * Sprachen bzw. Compiler einfach ersetzen. *
- * *
- * Auf alle besonderen C-Tricks wurde verzichtet, inbesondere *
- * auf Seiteneffekte. Das Bitfeld 'malen' läßt sich problem- *
- * los durch ein array aus integer ersetzen, somit ist diese *
- * Routine auch in andere Programmiersprachen übersetzbar. *
- * *
- ***************************************************************/
-
- /******* Der ATARI ST und TURBO C brauchen so ihre Definitionen */
-
- #include <math.h>
- #include <stdio.h>
- #include <tos.h> /* Betriebssystem-include */
- #include <stdlib.h>
- #include <string.h>
-
- #include <aes.h> /* Nur für die Grafik nötig, nicht nach ANSI */
- #include <vdi.h>
-
- #define TRUE !0
- #define FALSE 0
- #define FAILURE !0
- #define SUCCESS 0
-
- #define PI 3.14159265358979323846
-
- /******** Typendefinitionen, Funktionsprototypen **************/
-
- typedef struct
- {
- double real;
- double imag;
- } COMPLEX;
-
- typedef struct
- {
- unsigned raster: 1;
- unsigned transp: 1;
- unsigned extrem: 1;
- unsigned nullin: 1;
- unsigned achsen: 1;
- unsigned verlin: 1;
- unsigned marker: 3;
- unsigned normen: 1;
- unsigned zahlen: 1;
- unsigned : 6;
- } MALFLAGS;
-
- double diabat(double x),frac(double x);
-
- int diagramm(int art, MALFLAGS malen, long xwerte, long ywerte,
- long n, char typ, int x, int y, int w, int h);
- void marker_malen(int b, int xmin, int xmax, int ymin, int ymax,
- int pixoff, double pixfak, double *step,
- double *stepsum, double *stepmk,
- char dir, MALFLAGS malen, int flag);
- void polmarker_malen(int xpixoff, int ypixoff,
- double pixfak, double *step, double *stepsum,
- double *stepmk, MALFLAGS malen);
-
- double diabat(double arg);
- double frac(double x);
-
- /*** Rest der Definitionen für's Demoprogramm ***/
-
- int handle, gem_handle, ap_id, dummy;
- int contrl[12], intin[128], intout[128], ptsin[128], ptsout[128];
- int work_in[11], work_out[57];
- void hauptprg(void);
- int prog_init(void);
- void prog_exit(int art);
-
- /*** Demoprogramm ***/
-
- int main(void)
- { int erfolg;
-
- erfolg = prog_init();
- if(erfolg==1) hauptprg();
- prog_exit(erfolg);
- return(0);
- }
-
- void hauptprg()
- { long i,n=256L; double *x,*y,yh; MALFLAGS wahl;
- int xw,yw,hw,ww,art,pxy[10];
-
- x = (double*)malloc((n+1)*sizeof(double));
- y = (double*)malloc((n+1)*sizeof(double));
-
- v_clrwk(handle);
- printf("Art des Diagramms (0 bis 6) : ");
- scanf("%d",&art); art %= 7;
- printf("X,Y der oberen linken Bildecke : ");
- scanf("%d,%d",&xw,&yw); xw %=640; yw %=400;
- printf("Weite und Höhe des Diagramms : ");
- scanf("%d,%d",&ww,&hw);
- if(ww+xw>639) ww = 639-xw;
- if(hw+yw>399) hw = 399-yw;
-
- for(i=0;i<n;i++)
- { *(x+i) = (double)(i+1)/(double)n*6.;
- yh = (double)i/(double)n*6.-3.;
- *(y+i) = exp(-yh*yh)*.995;
- }
- v_clrwk(handle);
- pxy[0] = xw; pxy[1] = yw; pxy[2] = xw+ww; pxy[3] = yw;
- pxy[4] = xw+ww; pxy[5] = yw+hw; pxy[6] = xw; pxy[7] = yw+hw;
- pxy[8] = xw; pxy[9] = yw;
- v_pline(handle,5,pxy);
-
- wahl.raster=1;
- diagramm(art,wahl,(long)x,(long)y,n,'d',xw,yw,ww,hw);
-
- Bconin(2);
- }
-
- int prog_init(void)
-
- { int i;
-
- ap_id = appl_init();
- if (ap_id == -1) return(3);
-
- for(i=0;i<10;work_in[i++]=1); work_in[10] = 2;
- gem_handle = graf_handle(&dummy,&dummy,&dummy,&dummy);
- handle = gem_handle;
- v_opnvwk(work_in,&handle,work_out);
- if (handle == FALSE) return(2);
- return(1);
- }
-
- void prog_exit(int art)
-
- {
- switch(art)
- {
- case 1 : v_clsvwk(handle);
- case 2 : appl_exit();
- case 3 : break;
- }
- }
-
- /****************************************************************
- * *
- * Universelle Diagrammroutine für beliebige Bildschirmmaße *
- * *
- * Version 1.2 vom 16.11.1989 geschrieben von DITTELSOFT *
- * *
- * Autor: Georg Ditti, Salierallee 37, 5100 Aachen *
- * Tel.: 0241 / 80 53 90 tags, 0241 / 60 24 87 privat *
- * *
- * art = 0 : lineare Darstellung (int) *
- * art = 1 : y-logarithmische Darstellung *
- * art = 2 : x-logarithmische Darstellung *
- * art = 3 : doppelt logarythmische Darstellung *
- * art = 4 : Polardiagramm *
- * art = 5 : diabatische Darstellung *
- * art = 6 : diabatisch-logarithmische Darstellung *
- * art = 7 : komplexe Ebene *
- * art = 8 : Darstellung komplexer Zahlen im Polardiagramm *
- * *
- * malen, Bit 0 : Raster(selbstskalierend) (MALFLAGS) *
- * malen, Bit 1 : neues Diagramm über altes zeichnen *
- * malen, Bit 2 : Extrema markieren *
- * malen, Bit 3 : Nullinien erzwingen *
- * malen, Bit 4 : keine Achsenmarkierungen *
- * malen, Bit 5 : keine Verbindungslinien *
- * malen, Bit 6,Bit 7 und Bit 8: Alle Punkte markieren *
- * malen, Bit 9 : Maximum auf 1 normieren *
- * malen, Bit 10 : Y-Werte werden numeriert (ohne X-Werte) *
- * malbits 6,7,8 : 0 => keine Punktmarkierung *
- * 1 => gerade Kreuzchen *
- * 2 => schräge Kreuzchen *
- * 3 => Quadrate *
- * 4 => Rauten *
- * 5 => Dreiecke nach oben *
- * 6 => Dreiecke nach unten *
- * *
- * xwerte ist Zeiger auf Feld mit X-Werten *
- * oder Anfang des COMPLEX-Arrays *
- * ywerte ist Zeiger auf Feld mit Y-werten *
- * *
- * n ist die Anzahl der darzustellenden Werte (long) *
- * *
- * typ (char) gibt datentyp an *
- * 'c' => char *
- * 'u' => unsigned char *
- * 's,i' => short und int *
- * 'l' => long *
- * 'f' => float *
- * 'd' => double *
- * 'x' => COMPLEX *
- * *
- * (geht auch mit Zeiger auf void, gibt's aber nicht in *
- * jedem C-Dialekt, erst recht nicht in anderen Sprachen) *
- * *
- * x,y,w,h sind die Maße des auszumalenden Fensters (int) *
- * (x,y = Position der oberen, linken Ecke in Pixeln * *
- * w,h = Breite und Höhe des Zeichenbereichs in Pixel) *
- * *
- ****************************************************************/
-
- int diagramm(int art, MALFLAGS malen, long xwerte, long ywerte,
- long n, char typ, int x, int y, int w, int h)
- {
- /* Allgemeine Betriebsvariablen */
-
- long i,s,ptrx,ptry;
- int pxy[10],mxy[10];
- double xmin,xmax,ymin,ymax,maxpos,minpos,xw,yw,xh,yh,nymax;
- double initxstepsum,initystepsum,initxstep,initystep,
- initxstepmk,initystepmk;
-
- /* Erklärung der einzelnen Variablen :
-
- long i,s = Zählvariablen
- long ptrx,ptry = Pointer auf die X- bzw. Y-Werte der Tabelle
- int pxy[10],mxy[10] = Felder, die Anfangs- und Endkoordinaten
- zum Zeichnen enthalten (m wie merk)
- int flag = Allgemeine Flagvariable, öfters gebraucht
- double xmin,xmax = Minimum und Maximum der X-Werte
- double ymin,ymax = Minimum und Maximum der Y-Werte
- double maxpos,minpos = Position der Extrema auf der X-Achse
- double xw,yw,xh,yh = Zwischenergebnisse
- double nymax = Maximum der Funktionswerte
- double initxstepsum,initystepsum = Anfang der Skalierung
- double initxstep,initystep = anfängliche Skalierungsweite
- double initxstepmk,initystepmk = anfängliche Markierungsweite
- */
-
- /* Statische Fenster- und Maßstabsparameter für mehrere Kurven */
-
- static double xskamin,xskamax,xpixfak,ypixfak,yskamin,yskamax;
- static double xstepsum,ystepsum,xstep,ystep,xstepmk,ystepmk;
- static int xpixoff,ypixoff,ix0,iy0,ixmin,iymin,ixmax,iymax;
-
- /* Erklärung der einzelnen Variablen :
- static double xskamin,xskamax = Skalenextrema > Extrema !
- static double xpixfak,ypixfak = Pixel pro Skaleneinheit
- static double yskamin,yskamax = siehe oben
- static double xstepsum,ystepsum = aktueller Skalenmarker
- static double xstep,ystep = aktuelle Schrittweite
- static double xstepmk,ystepmk = aktuelle Schriftweite
- static int xpixoff,ypixoff = Zeichenoffset in Pixeln
- static int ix0,iy0,ixmin,iymin,ixmax,iymax = Hilfsvariablen
- */
-
- /* Pointer initialisieren */
-
- ptrx = xwerte; ptry = ywerte; if(malen.zahlen==1) ptrx = ptry;
-
- /* Maximal 1000 Punkte zeichnen, sonst sieht man nix mehr */
-
- s = 1; while((n/s)>1000L) s*=2;
-
- switch(typ)
- {
- case 'c':
- xmin = (double)*((char*)ptrx);
- ymin = (double)*((char*)ptry); break;
- case 'u':
- xmin = (double)*((unsigned char*)ptrx);
- ymin = (double)*((unsigned char*)ptry); break;
- case 's': case 'i':
- xmin = (double)*((int*)ptrx);
- ymin = (double)*((int*)ptry); break;
- case 'l':
- xmin = (double)*((long*)ptrx);
- ymin = (double)*((long*)ptry); break;
- case 'f':
- xmin = (double)*((float*)ptrx);
- ymin = (double)*((float*)ptry); break;
- case 'd':
- xmin = *((double*)ptrx);
- ymin = *((double*)ptry); break;
- case 'x':
- xmin = ((COMPLEX*)ptrx)->real;
- ymin = ((COMPLEX*)ptrx)->imag; break;
- }
- if(malen.zahlen==1) xmin=0.;
- xmax = xmin; ymax = ymin;
- maxpos = xmin; minpos = xmin;
-
- /* Rasterlinien werden aus Folgen von 3 weißen Punkten
- und 1 schwarzem Punkt gezeichnet */
-
- vsl_udsty(handle,0x8888);
-
- /* Extrema finden */
-
- for(i=1;i<n;i+=s)
- { switch(typ)
- {
- case 'c':
- xw = (double)*((char*)ptrx+i);
- yw = (double)*((char*)ptry+i); break;
- case 'u':
- xw = (double)*((unsigned char*)ptrx+i);
- yw = (double)*((unsigned char*)ptry+i); break;
- case 's': case 'i':
- xw = (double)*((int*)ptrx+i);
- yw = (double)*((int*)ptry+i); break;
- case 'l':
- xw = (double)*((long*)ptrx+i);
- yw = (double)*((long*)ptry+i); break;
- case 'f':
- xw = (double)*((float*)ptrx+i);
- yw = (double)*((float*)ptry+i); break;
- case 'd':
- xw = *((double*)ptrx+i);
- yw = *((double*)ptry+i); break;
- case 'x':
- xw = ((COMPLEX*)ptrx+i)->real;
- yw = ((COMPLEX*)ptrx+i)->imag; break;
- }
- if(malen.zahlen==1) xw = (double)i;
- if(art==8)
- { xh = atan2(xw,yw);
- yh = sqrt(xw*xw+yw*yw);
- xw = xh; yw = yh;
- }
- if(xmin>=xw) {xmin=xw;}
- if(xw>=xmax) {xmax=xw;}
- if(ymin>=yw) {ymin=yw; minpos=xw;}
- if(yw>=ymax) {ymax=yw; maxpos=xw;}
- }
-
- if(malen.normen==1)
- { nymax = ymax; ymin /= nymax; ymax = 1.;}
-
- /* Diagrammparameter nur erstes mal bestimmen */
-
- if(malen.transp==0)
- {
- /* Wertebereichsprüfung, Skalierungsfaktor,
- Fensternullpunkt zum Zeichnen */
-
- /* Zuerst in X-Richtung */
-
- xpixfak = (double)(w-60);
- ypixfak = (double)(h-25);
-
- switch(art)
- {
- case 2: case 3: case 6:
- { if(malen.nullin&&xmin>=1.)
- xmin = 1.;
- if(malen.nullin&&xmax<=1.)
- xmax = 1.;
- if(0.>=xmin)
- return(FAILURE);
- xskamin = xmin*.8; xskamax = xmax*1.1;
- xpixfak /= (log10(xskamax)-log10(xskamin));
- xpixoff = x+60-(int)(log10(xskamin)*xpixfak);
- initxstepsum = 1.; initxstep = .1; initxstepmk = .5;
- if(xpixfak*initxstep>=100.)
- {initxstep = .02; initxstepmk = .1;}
- else if(xpixfak*initxstep<2.)
- {initxstep = .9; initxstepmk = 1.;}
- else if(xpixfak*initxstep<10.)
- {initxstep =.3; initxstepmk=1.;}
- } break;
- case 4: case 8:
- break;
- default:
- { if(malen.nullin&&xmin>=0.) xskamin = 0.;
- if(malen.nullin&&xmax<=0.) xskamax = 0.;
- xskamin = xmin-.05*fabs(xmax-xmin);
- xskamax = xmax+.05*fabs(xmax-xmin);
- xpixfak /= (xskamax-xskamin);
- xpixoff = x+60-(int)(xskamin*xpixfak);
- initxstepsum = 0.; initxstep = 1.; initxstepmk = 5.;
- while(xpixfak*initxstep>=100.)
- {initxstep /= 10.; initxstepmk /= 10.;}
- while(xpixfak*initxstep<10.)
- {initxstep *= 10.; initxstepmk *= 10.;}
- if(xpixfak*initxstep>=50.)
- {initxstep /= 5.; initxstepmk /= 5.;}
- else if(xpixfak*initxstep>=20.)
- {initxstep /= 2.; initxstepmk /= 2.;}
- } break;
- }
-
- /* Dann in Y-Richtung */
-
- switch(art)
- {
- case 1: case 3:
- { if(malen.nullin&&ymin>=1.) ymin = 1.;
- if(malen.nullin&&ymax<=1.) ymax = 1.;
- if(0.>=ymin) return(FAILURE);
- yskamin = ymin*.9; yskamax = ymax*1.1;
- ypixfak /= (log10(yskamax)-log10(yskamin));
- ypixoff = y+h-25+(int)(log10(yskamin)*ypixfak);
- initystepsum = 1.; initystep = .1; initystepmk = .5;
- if(ypixfak*initystep>=100.)
- {initystep = .02; initystepmk = .1;}
- else if(ypixfak*initystep<2.)
- {initystep = .9; initystepmk = 1.;}
- else if(ypixfak*initystep<10.)
- {initystep = .3; initystepmk = 1.;}
- } break;
- case 5: case 6:
- { if(0.>ymin||0.>ymax||ymin>1.||ymax>1.) return(FAILURE);
- yskamin = 1e-9; yskamax = 1.-(1.-ymax)/2.;
- if(yskamax>=1.-1e-10) yskamax=1.-1e-10;
- ypixfak /= (diabat(yskamax)-diabat(yskamin));
- ypixoff = y+h-25+(int)(diabat(1e-9)*ypixfak);
- initystepsum = .5; initystep = .1; initystepmk = .5;
- } break;
- case 4: case 8:
- { yskamax = fabs(ymax)*1.05; yskamin = -yskamax;
- xskamax = yskamax; xskamin = -xskamax;
- ypixfak /= (yskamax*2.); xpixfak /= (xskamax*2.);
- if(w<h) ypixfak = xpixfak; else xpixfak = ypixfak;
- ypixoff = y+h/2; xpixoff = x+w/2;
- initystepsum = 0.; initystep = .2; initystepmk = 1.;
- while(ypixfak*initystep>=100.)
- {initystep /= 10.; initystepmk /= 10.;}
- while(ypixfak*initystep<10.)
- {initystep *= 10.; initystepmk *= 10.;}
- if(ypixfak*initystep>=50.)
- {initystep /= 5.; initystepmk /= 5.;}
- if(ypixfak*initystep>=20.)
- {initystep /= 2.; initystepmk /= 2.;}
- } break;
- default:
- { if(malen.nullin&&ymin>=0.) ymin = 0.;
- if(malen.nullin&&ymax<=0.) ymax = 0.;
- yskamin = ymin-.05*fabs(ymax-ymin);
- yskamax = ymax+.05*fabs(ymax-ymin);
- ypixfak /= (yskamax-yskamin);
- ypixoff = y+h-25+(int)(yskamin*ypixfak);
- initystepsum = 0.; initystep = 1.; initystepmk = 5.;
- while(ypixfak*initystep>=100.)
- {initystep /= 10.; initystepmk /= 10.;}
- while(ypixfak*initystep<10.)
- {initystep *= 10.; initystepmk *= 10.;}
- if(ypixfak*initystep>=50.)
- {initystep /= 5.; initystepmk /= 5.;}
- else if(ypixfak*initystep>=20.)
- {initystep /= 2.; initystepmk /= 2.;}
- } break;
- }
-
- /* Diverse Einstellungen des GEM-VDI von Digital Research */
-
- vsl_color(handle,1); /* Linien schwarz auf weißem Grund */
- vswr_mode(handle,2); /* Durchsichtige Buchstaben */
- vsf_interior(handle,2); /* Alle Figuren durchsichtig */
- vsf_style(handle,4);
-
- /* Zeichnen der X-Achse */
-
- pxy[0] = x;
- pxy[1] = ypixoff;
- if(y+12>ypixoff||ypixoff>y+h-25)
- { switch(art)
- {
- case 1: case 3:
- pxy[1] = ypixoff-(int)(log10(yskamin)*ypixfak); break;
- default:
- pxy[1] = ypixoff-(int)(yskamin*ypixfak); break;
- }
- }
- pxy[2] = x+w;
- pxy[3] = pxy[1];
- ix0 = pxy[1]; ixmin = x; ixmax = x+w;
- v_pline(handle,2,pxy);
-
- /* Zeichnen der Y-Achse */
-
- pxy[0] = xpixoff;
- if(x>xpixoff+60||xpixoff>x+w-5)
- { switch(art)
- {
- case 2: case 3: case 6:
- pxy[0] = xpixoff+(int)(log10(xskamin)*xpixfak); break;
- default:
- pxy[0] = xpixoff+(int)(xskamin*xpixfak); break;
- }
- }
- pxy[1] = y;
- pxy[2] = pxy[0];
- pxy[3] = y+h;
- iy0 = pxy[0]; iymin = y; iymax = y+h;
- v_pline(handle,2,pxy);
-
- /* Zeichnen der X-Achsenmarkierer
- von einem 'runden' Startpunkt aus */
-
- switch(art)
- {
- case 2: case 3: case 6: /* Logarythmische Skalierung */
- { xstepsum = initxstepsum;
- xstep = initxstep;
- xstepmk = initxstepmk;
- while(xskamax>=xstepsum)
- { marker_malen(ix0,ixmin,ixmax,iymin,iymax,xpixoff,xpixfak,
- &xstep,&xstepsum,&xstepmk,'x',malen,2);
- }
- xstepsum = initxstepsum;
- xstep = initxstep;
- xstepmk = initxstepmk;
- while(xstepsum>=xskamin)
- { marker_malen(ix0,ixmin,ixmax,iymin,iymax,xpixoff,xpixfak,
- &xstep,&xstepsum,&xstepmk,'x',malen,-2);
- }
- } break;
- case 4: case 8:
- break;
- default: /* Lineare Skalierung */
- { xstepsum = initxstepsum;
- xstep = initxstep;
- xstepmk = initxstepmk;
- while(xskamax>=xstepsum)
- { marker_malen(ix0,ixmin,ixmax,iymin,iymax,xpixoff,xpixfak,
- &xstep,&xstepsum,&xstepmk,'x',malen,1);
- }
- xstepsum = initxstepsum;
- xstep = initxstep;
- xstepmk = initxstepmk;
- while(xstepsum>=xskamin)
- { marker_malen(ix0,ixmin,ixmax,iymin,iymax,xpixoff,xpixfak,
- &xstep,&xstepsum,&xstepmk,'x',malen,-1);
- }
- } break;
- } /* end of switch */
-
- /* Zeichnen der Y-Achsenmarkierer von
- einem definierten Startpunkt aus */
-
- switch(art)
- {
- case 1: case 3: /* Logarythmische Skalierung */
- { ystepsum = initystepsum;
- ystep = initystep;
- ystepmk = initystepmk;
- while(yskamax>=ystepsum)
- { marker_malen(iy0,ixmin,ixmax,iymin,iymax,ypixoff,ypixfak,
- &ystep,&ystepsum,&ystepmk,'y',malen,2);
- }
- ystepsum = initystepsum;
- ystep = initystep;
- ystepmk = initystepmk;
- while(ystepsum>=yskamin)
- { marker_malen(iy0,ixmin,ixmax,iymin,iymax,ypixoff,ypixfak,
- &ystep,&ystepsum,&ystepmk,'y',malen,-2);
- }
- } break;
- case 4: case 8: /* Polare Skalierung */
- { ystepsum = initystepsum;
- ystep = initystep;
- ystepmk = initystepmk;
- while(yskamax>=ystepsum+ystep)
- { polmarker_malen(xpixoff,ypixoff,ypixfak,&ystep,&ystepsum,
- &ystepmk,malen);
- }
- } break;
- case 5: case 6: /* Diabatische Skalierung */
- { ystepsum = initystepsum;
- ystep = initystep;
- ystepmk = initystepmk;
- while(yskamax>=ystepsum)
- { marker_malen(iy0,ixmin,ixmax,iymin,iymax,ypixoff,ypixfak,
- &ystep,&ystepsum,&ystepmk,'y',malen,3);
- }
- ystepsum = initystepsum;
- ystep = initystep;
- ystepmk = initystepmk;
- while(ystepsum>=yskamin)
- { marker_malen(iy0,ixmin,ixmax,iymin,iymax,ypixoff,ypixfak,
- &ystep,&ystepsum,&ystepmk,'y',malen,-3);
- }
- } break;
- default : /* Lineare Skalierung */
- { ystepsum = initystepsum;
- ystep = initystep;
- ystepmk = initystepmk;
- while(yskamax>=ystepsum)
- { marker_malen(iy0,ixmin,ixmax,iymin,iymax,ypixoff,ypixfak,
- &ystep,&ystepsum,&ystepmk,'y',malen,1);
- }
- ystepsum = initystepsum;
- ystep = initystep;
- ystepmk = initystepmk;
- while(ystepsum>=yskamin)
- { marker_malen(iy0,ixmin,ixmax,iymin,iymax,ypixoff,ypixfak,
- &ystep,&ystepsum,&ystepmk,'y',malen,-1);
- }
- } break;
- } /* end of switch */
- } /* end of 'neumalen'-if */
-
- /* Ab hier wird das Wertefeld in das Diagramm eingezeichnet */
-
- for(i=0;i<n;i+=s)
- { switch(typ)
- {
- case 'c':
- xw = (double)*((char*)ptrx+i);
- yw = (double)*((char*)ptry+i); break;
- case 'u':
- xw = (double)*((unsigned char*)ptrx+i);
- yw = (double)*((unsigned char*)ptry+i); break;
- case 's': case 'i':
- xw = (double)*((int*)ptrx+i);
- yw = (double)*((int*)ptry+i); break;
- case 'l':
- xw = (double)*((long*)ptrx+i);
- yw = (double)*((long*)ptry+i); break;
- case 'f':
- xw = (double)*((float*)ptrx+i);
- yw = (double)*((float*)ptry+i); break;
- case 'd':
- xw = *((double*)ptrx+i);
- yw = *((double*)ptry+i); break;
- case 'x':
- xw = ((COMPLEX*)ptrx+i)->real;
- yw = ((COMPLEX*)ptrx+i)->imag; break;
- }
- if(malen.zahlen==1) xw = (double)i;
- if(art==8)
- { xh = atan2(xw,yw);
- yh = sqrt(xw*xw+yw*yw);
- xw = xh; yw = yh;
- }
-
- if(malen.normen==1) yw /= nymax;
-
- switch(art)
- {
- case 2: case 3: case 6:
- pxy[2] = xpixoff+(int)(xpixfak*log10(xw)); break;
- case 4: case 8:
- pxy[2] = xpixoff+(int)(xpixfak*(cos(xw)*yw)); break;
- default:
- pxy[2] = xpixoff+(int)(xpixfak*xw); break;
- }
- switch(art)
- {
- case 1: case 3:
- pxy[3] = ypixoff-(int)(ypixfak*log10(yw)); break;
- case 4: case 8:
- pxy[3] = ypixoff-(int)(ypixfak*(sin(xw)*yw)); break;
- case 5: case 6:
- pxy[3] = ypixoff-(int)(ypixfak*diabat(yw)); break;
- default:
- pxy[3] = ypixoff-(int)(ypixfak*yw); break;
- }
-
- /* Verbindungslinien ziehen */
-
- if(i>0&&malen.verlin==0) v_pline(handle,2,pxy);
-
- /* großes Kreuz bei den Extrema */
-
- if(malen.extrem==1&&(xw==minpos||xw==maxpos))
- { mxy[0]=pxy[2]-20; mxy[1]=pxy[3];
- mxy[2]=pxy[2]+20; mxy[3]=pxy[3]; v_pline(handle,2,mxy);
- mxy[0]=pxy[2]; mxy[1]=pxy[3]-20;
- mxy[2]=pxy[2]; mxy[3]=pxy[3]+20; v_pline(handle,2,mxy);
- }
-
- switch(malen.marker)
- {
- case 1: /* gerade Kreuzchen */
- { mxy[0]=pxy[2]-3; mxy[1]=pxy[3];
- mxy[2]=pxy[2]+3; mxy[3]=pxy[3]; v_pline(handle,2,mxy);
- mxy[0]=pxy[2]; mxy[1]=pxy[3]-3;
- mxy[2]=pxy[2]; mxy[3]=pxy[3]+3; v_pline(handle,2,mxy);
- } break;
- case 2: /* schräge Kreuzchen */
- { mxy[0]=pxy[2]-3; mxy[1]=pxy[3]-3;
- mxy[2]=pxy[2]+3; mxy[3]=pxy[3]+3; v_pline(handle,2,mxy);
- mxy[0]=pxy[2]+3; mxy[1]=pxy[3]-3;
- mxy[2]=pxy[2]-3; mxy[3]=pxy[3]+3; v_pline(handle,2,mxy);
- } break;
- case 3: /* Kästchen */
- { mxy[0]=pxy[2]-3; mxy[1]=pxy[3]-3;
- mxy[2]=pxy[2]+3; mxy[3]=pxy[3]-3;
- mxy[4]=pxy[2]+3; mxy[5]=pxy[3]+3;
- mxy[6]=pxy[2]-3; mxy[7]=pxy[3]+3;
- mxy[8]=pxy[2]-3; mxy[9]=pxy[3]-3; v_pline(handle,5,mxy);
- } break;
- case 4: /* Rauten */
- { mxy[0]=pxy[2]-3; mxy[1]=pxy[3];
- mxy[2]=pxy[2]; mxy[3]=pxy[3]-3;
- mxy[4]=pxy[2]+3; mxy[5]=pxy[3];
- mxy[6]=pxy[2]; mxy[7]=pxy[3]+3;
- mxy[8]=pxy[2]-3; mxy[9]=pxy[3]; v_pline(handle,5,mxy);
- } break;
- case 5: /* Dreieck oben */
- { mxy[0]=pxy[2]-3; mxy[1]=pxy[3]-2;
- mxy[2]=pxy[2]; mxy[3]=pxy[3]+3;
- mxy[4]=pxy[2]+3; mxy[5]=pxy[3]-2;
- mxy[6]=pxy[2]-3; mxy[7]=pxy[3]-2; v_pline(handle,4,mxy);
- } break;
- case 6: /* Dreieck unten */
- { mxy[0]=pxy[2]-3; mxy[1]=pxy[3]+2;
- mxy[2]=pxy[2]; mxy[3]=pxy[3]-3;
- mxy[4]=pxy[2]+3; mxy[5]=pxy[3]+2;
- mxy[6]=pxy[2]-3; mxy[7]=pxy[3]+2; v_pline(handle,4,mxy);
- } break;
- }
- pxy[0] = pxy[2]; pxy[1] = pxy[3];
- }
- return(SUCCESS);
- }
-
- /* marker_malen zeichnet und beschriftet die Skalenachsen,
- wird für jeden einzelnen Schritt neu aufgerufen,
- schaltet bei nichtlinearen Diagrammen Schrittweite um
-
- ACHTUNG : Benutzer des Turbo C 1.1 müssen das Ausgabeformat
- für Beschriftung im Exponentiellen Modus vergrößern, da der
- neue Compiler den Exponenten dummerweise immer mit 4 Stellen
- ausgibt.
- */
-
- void marker_malen(int b, int xmin, int xmax, int ymin, int ymax,
- int pixoff, double pixfak, double *step,
- double *stepsum, double *stepmk,
- char dir, MALFLAGS malen, int flag)
-
- { int pxy[4],toff,dummy; double absstepsum; char mk[20];
- char mark[9];
-
- vst_height(handle,6,&dummy,&dummy,&dummy,&dummy);
- absstepsum = fabs(*stepsum);
-
- if(dir=='x') /* X-Achse markieren */
- { switch(flag)
- {
- case 2: case -2:
- pxy[0] = pixoff+(int)(pixfak*log10(*stepsum)); break;
- default:
- pxy[0] = pixoff+(int)(pixfak*(*stepsum)); break;
- }
-
- pxy[2] = pxy[0];
-
- if(.1>frac(absstepsum/(*stepmk)+.001))
- { pxy[1] = b; pxy[3] = b+8;
- strcpy(mark," ");
- if(absstepsum==0.||absstepsum<100000.&&absstepsum>=.001)
- { sprintf(mk,"%04.3lf\0",(*stepsum)); toff = 16;
- strncpy(mark,mk,5);
- }
- else
- { sprintf(mk,"%2.1e\0",(*stepsum));
- strncpy(mark,mk,8); toff=34;}
- /* strncpy(mark,mk,9); toff=34;} f. Turbo C 1.1 */
- if(malen.achsen==0)
- v_gtext(handle,(pxy[2]-toff),(pxy[3]+9),mark);
- }
- else
- { pxy[1] = b; pxy[3] = b+4;}
-
- if(pxy[0]>xmin&&xmax>pxy[0])
- { if(malen.achsen==0)
- { v_pline(handle,2,pxy);}
- if(malen.raster==1)
- { vsl_type(handle,7);
- pxy[1] = ymin; pxy[3] = ymax; v_pline(handle,2,pxy);
- vsl_type(handle,1);
- }
- }
- }
-
- else if(dir=='y') /* Y-Achse markieren */
- { switch(flag)
- {
- case 2: case -2:
- pxy[1] = pixoff-(int)(pixfak*log10(*stepsum)); break;
- case 3: case -3:
- pxy[1] = pixoff-(int)(pixfak*diabat(*stepsum)); break;
- default:
- pxy[1] = pixoff-(int)(pixfak*(*stepsum)); break;
- }
-
- pxy[3] = pxy[1];
-
- if(.1>frac(absstepsum/(*stepmk)+.001))
- { pxy[0] = b; pxy[2] = b-8;
- strcpy(mark," ");
- if(absstepsum==0.||absstepsum<100000.&&absstepsum>=.001)
- { sprintf(mk,"%04.3lf\0",(*stepsum)); toff = 42;
- strncpy(mark,mk,5);
- }
- else
- { sprintf(mk,"%2.1e\0",(*stepsum));
- strncpy(mark,mk,8); toff=66;}
- /* strncpy(mark,mk,9); toff=66;} f. Turbo C 1.1 */
- if(malen.achsen==0)
- v_gtext(handle,pxy[2]-toff,pxy[3]+3,mark);
- }
- else
- { pxy[0] = b; pxy[2] = b-4;}
-
- if(pxy[1]>ymin&&ymax>pxy[1])
- { if(malen.achsen==0)
- { v_pline(handle,2,pxy);}
- if(malen.raster==1)
- { vsl_type(handle,7);
- pxy[0] = xmin; pxy[2] = xmax; v_pline(handle,2,pxy);
- vsl_type(handle,1);
- }
- }
- }
- vst_height(handle,13,&dummy,&dummy,&dummy,&dummy);
-
- switch(flag) /* Schrittweite neu einstellen */
- {
- case 1: /* linear ab 0 aufwärts */
- *stepsum += *step; break;
- case -1: /* linear ab 0 abwärts */
- *stepsum -= *step; break;
- case 2: /* logarithmisch ab 1 aufwärts */
- { if(.01>=fabs(frac(log10(*stepsum)+.001)))
- { *step *= 10.; *stepmk *= 10.;}
- *stepsum += *step;
- } break;
- case -2: /* logarithmisch ab 1 abwärts */
- { *stepsum -= *step;
- if(.01>=fabs(frac(log10(*stepsum)-.001)))
- { *step /= 10.; *stepmk /= 10.;}
- } break;
- case 3: /* diabatisch ab 0.5 aufwärts */
- { *stepsum += *step;
- if(.01>=frac(fabs(log10(1.-*stepsum))+.001))
- { *step /= 10.; *stepmk /= 10.;}
- } break;
- case -3: /* diabatisch ab 0.5 abwärts */
- { *stepsum -= *step;
- if((*stepsum)<.1999&&(*stepsum)>.9e-3)
- { *stepmk /= 10.; *step = (*stepsum)*.9;}
- if((*stepsum)<.9e-3)
- { *stepmk /= 100.; *step = (*stepsum)*.99;}
- } break;
- }
- }
-
- /* polmarker_malen zeichnet und beschriftet die
- Skalenmarkierungen für das Polardiagramm,
- wird für jeden einzelnen Schritt neu aufgerufen
- */
-
- void polmarker_malen(int xpixoff, int ypixoff,
- double pixfak, double *step, double *stepsum,
- double *stepmk, MALFLAGS malen)
-
- { int pxy[6],i,h1,h2,dummy; double w; char mk[20]; char mark[7];
-
- *stepsum += *step;
- vst_height(handle,6,&dummy,&dummy,&dummy,&dummy);
-
- pxy[0] = xpixoff+(int)(*stepsum*pixfak); pxy[2] = pxy[0];
- if(.1>frac((*stepsum)/(*stepmk)+.001))
- { pxy[1] = ypixoff-6; pxy[3] = ypixoff+6;
- h1 = xpixoff-6; h2 = xpixoff+6;
- strcpy(mark," ");
- if((*stepsum)==0.||(*stepsum)<10000.&&(*stepsum)>.001)
- { sprintf(mk,"%04.3lf\0",(*stepsum));
- if(mk[4]!='0') strncpy(mark,mk,5); else strncpy(mark,mk,4);
- }
- else
- { sprintf(mk,"%2.1e\0",(*stepsum)); strncpy(mark,mk,6);}
- if(malen.achsen==0)v_gtext(handle,pxy[2]-12,pxy[3]+9,mark);
- }
- else
- { pxy[1] = ypixoff-3; pxy[3] = ypixoff+3;
- h1 = xpixoff-3; h2 = xpixoff+3;
- }
- if(malen.achsen==0)
- { v_pline(handle,2,pxy);
- pxy[0] = xpixoff-(int)(*stepsum*pixfak); pxy[2] = pxy[0];
- v_pline(handle,2,pxy);
- pxy[0] = h1; pxy[2] = h2;
- pxy[1] = ypixoff-(int)(*stepsum*pixfak); pxy[3] = pxy[1];
- v_pline(handle,2,pxy);
- pxy[1] = ypixoff+(int)(*stepsum*pixfak); pxy[3] = pxy[1];
- v_pline(handle,2,pxy);
- }
-
- if(malen.raster)
- { vsl_type(handle,7);
- for(w=0.,i=0;i<=36;w+=PI/18.,i++)
- { pxy[2] = xpixoff+(int)(pixfak*(*stepsum*cos(w)));
- pxy[3] = ypixoff+(int)(pixfak*(*stepsum*sin(w)));
- if(i!=0) v_pline(handle,2,pxy);
- pxy[0] = pxy[2]; pxy[1] = pxy[3];
- if(i%3==0&&*stepsum>*step)
- { pxy[4] = xpixoff+(int)(pixfak*((*stepsum-*step)*cos(w)));
- pxy[5] = ypixoff+(int)(pixfak*((*stepsum-*step)*sin(w)));
- v_pline(handle,2,pxy+2);
- }
- }
- vsl_type(handle,1);
- }
-
- vst_height(handle,13,&dummy,&dummy,&dummy,&dummy);
- }
-
- /* Diabatische Funktion, Quelle: SCHOTT-Glasfilterkatalog */
-
- double diabat(double arg)
-
- {
- if(arg>=1.-1e-10) arg = 1.-1e-10;
- if(arg<=1.e-10) arg = 1.e-10;
- return(1.-log10(log10(1./arg)));
- }
-
- /* Vorzeichenrichtiger Kommaanteil einer Zahl */
-
- double frac(double x)
- { long int i;
-
- if(x==0.) return(0.);
- i = (long int)x;
- return(x-(double)i);
- }
-