home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / libs / plotlib.lha / Plot_1.lzh / Source / DispL2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-21  |  48.1 KB  |  1,318 lines

  1. /****************************************************************
  2. *                                                                                                                                *
  3. *     Filename : DispL2.c                                                                                    *
  4. *                                                                                                                                *
  5. *****************************************************************
  6. *                                                                                                                                *
  7. *        Comment : Dieses File unterstützt alle Level 2 welche für        *
  8. *                            die 2 dimensionale Darstellung benötigt werden.        *
  9. *                                                                                                                                *
  10. *                                Funktionen                                                        *
  11. *                            ==========                                                        *
  12. *                                                                                                                                *
  13. *            DispL2()                        Level 2 der Display Funktion                    *
  14. *            DispScreen()                Bildschirmausgabe                                            *
  15. *            Draw2D()                        2D und NIV Funktion                                        *
  16. *            DrawGrid()                    Zeichnet das komplette Gitter                    *
  17. *            Draw2DCurves()            Zeichnet alle 2D Kurven                                *
  18. *            DrawGLine()                    Eine normale Gitterlinie                            *
  19. *            DrawSLine()                    Eine Gitterzwischenlinie                            *
  20. *            Trans2D()                        Translationsfunktion                                    *
  21. *            CheckClipp()                Hilfsfunktion für Clipping                        *
  22. *            DoClipp()                        Clippfunktion                                                    *
  23. *            InitGraphics()            initialisiert die Plotstruktur                *
  24. *            GetXSize2D()                berechnet verfügbare X Bildgrösse            *
  25. *            GetYSize2D()                berechnet verfügbare Y Bildgrösse            *
  26. *            CalcStep()                    berechnet die Steps der Graphik.            *
  27. *            CalcScale()                    Berechnet die Skalierung                            *
  28. *            InitFunction()            Initialisiert die Translationsfkt.        *
  29. *                                                                                                                                *
  30. *                Rev : V1.0                                                                                            *
  31. *                                                                                                                                *
  32. *        History : V1.0 erstellen dieses Files                            06/12/89    *
  33. *                                                                                                                                *
  34. *                Doc : Plotlibrary User's Guide                                                    *
  35. *                                                                                                                                *
  36. *             Bugs : keine bekannten                                                                        *
  37. *                                                                                                                                *
  38. *            Autor : Oesch Silvano                                                                            *
  39. *                                                                                                                                *
  40. *            Datum : 06/12/89                                                                                    *
  41. *                                                                                                                                *
  42. ****************************************************************/
  43.  
  44. /****************************************************************
  45. *                                                                                                                                *
  46. *    allgemeine Includedateien                                                                            *
  47. *                                                                                                                                *
  48. ****************************************************************/
  49.  
  50. #include <math.h>
  51.  
  52. /****************************************************************
  53. *                                                                                                                                *
  54. *    Plotlibrary Includedateien                                                                        *
  55. *                                                                                                                                *
  56. ****************************************************************/
  57.  
  58. #include "Plot.h"
  59. #include "PlotL2.h"
  60. #include "SuppL2.h"
  61. #include "NivL2.h"
  62. #include "D3L2.h"
  63. #include "DispL2.h"
  64.  
  65. /****************************************************************
  66. *                                                                                                                                *
  67. *    Globale statische Variablen                                                                        *
  68. *                                                                                                                                *
  69. ****************************************************************/
  70.  
  71. extern DATA    (*xexpfct)(),                        /* 10^ oder e^ bzw. ln oder    */
  72.                         (*xlogfct)(),                        /* log Funktion für X-Achse    */
  73.                         (*yexpfct)(),                        /* 10^ oder e^ bzw. ln oder    */
  74.                         (*ylogfct)(),                        /* log Funktion für Y-Achse    */
  75.                         (*zexpfct)(),                        /* 10^ oder e^ bzw. ln oder    */
  76.                         (*zlogfct)();                        /* log Funktion für Z-Achse    */
  77.  
  78. DATA    xscale,                                                /* Skalierung aller Achsen    */
  79.             yscale,
  80.             zscale;
  81.  
  82. DATA    xoffset,                                            /* Verschiebung aller                */
  83.             yoffset,                                            /* Achsen                                        */
  84.             zoffset;
  85.  
  86. /****************************************************************
  87. *                                                                                                                                *
  88. *    externe Variablen                                                                                            *
  89. *                                                                                                                                *
  90. ****************************************************************/
  91.  
  92. extern struct Plot *plot;
  93. extern int plerr;
  94.  
  95. /****************************************************************
  96. *                                                                                                                                *
  97. *    Function : displ2()                                                                                        *
  98. *                                                                                                                                *
  99. *****************************************************************
  100. *                                                                                                                                *
  101. *         Input : typ,para                                                                                        *
  102. *                            int typ                Ausgabemodus                                                *
  103. *                            int para            Graphikparameter                                        *
  104. *                                                                                                                                *
  105. *        Output : int returnset    allg Rückgabewert                                        *
  106. *                            != FALSE        alles klar                                                    *
  107. *                            == FALSE            Fehler                                                            *
  108. *                                                                                                                                *
  109. *****************************************************************
  110. *                                                                                                                                *
  111. *     Comment : Diese Funktion ist Level 2 der Displayroutine. Die    *
  112. *                         Aufgabe ist die entsprechenden Ausgabefunktionen        *
  113. *                         mit den notwendigen Parametern aufzurufen.                    *
  114. *                                                                                                                                *
  115. ****************************************************************/
  116.  
  117. int displ2(typ,para)
  118. int typ;
  119. int para;
  120. {
  121.  
  122.     int returnset,                                        /* allg Rückgabewert                */
  123.             disppara;
  124.  
  125.     plot->col = STARTCOL+1;                        /* Farbenzähler setzen            */
  126.     if (plot->style != NOSTYLE)
  127.         plot->style = NULL;                            /* Stylezähler setzen                */
  128.  
  129.     switch(typ)                                                /* welche Ausgabe                        */
  130.     {
  131.         case SCREENOUT:                                    /* Bildschirm                                */
  132.             if (( para < GRAPHNOTSET) or    /* kontrolliere Parameter        */
  133.                     ( para > GRAPHSET))
  134.             {                                                            /* nicht in den Grenzen            */
  135.                 seterror(INVDISPARA);                /* Fehler                                        */
  136.                 setreturn(FALSE);
  137.             }
  138.             else                                                    /* ok                                             */
  139.             {
  140.                 initscfunction();
  141.                 setreturn(dispscreen(para));
  142.             }
  143.             break;
  144.  
  145.         case SCREENCLOSE:                                /* Graphik verlassen                */
  146.             if (plot->disp == NULL)                /* Graphik offen ?                    */
  147.             {                                                            /* Nein Fehler                            */
  148.                 seterror(GRAPHNOTOP);
  149.                 setreturn(FALSE);
  150.             }
  151.             else                                                    /* Ja                                                */    
  152.             {
  153.                 initscfunction();
  154.                 CloseGraphics();                        /* Graphik schliessen                */
  155.                 setreturn(TRUE);
  156.             }
  157.             break;
  158.  
  159.         case PRINTOUT:                                    /* Matrixdrucker                        */
  160.             seterror(NOTIMP);                            /* Leider nicht vorhanden        */
  161.             setreturn(FALSE);
  162.             break;
  163.  
  164.         case PLOTOUT:                                        /* Plotter                                    */
  165.             if (plot->pldisp & PLDATASET)    /* Plotterdaten vorhanden        */
  166.             {                                                            /* ja                                                */
  167.                 initplfunction();                        /* Plotterausgabe                        */
  168.                 disppara = plot->disp;            /* speichern von disp                */
  169.                 plot->disp = NULL;                    /* und auf 0 setzten                */
  170.                 setreturn(dispscreen(GRAPHNOTSET));
  171.                 if (returnset == TRUE)
  172.                     CloseGraphics();                    /* schliessen                                */
  173.                 plot->disp = disppara;            /* disp zurücksetzen                */
  174.             }
  175.             else
  176.             {                                                            /* keine Daten                            */
  177.                 seterror(NOPLDATA);                    /* Fehler                                        */
  178.                 setreturn(FALSE);
  179.             }
  180.             break;
  181.     }
  182.     return(returnset);                                /* und zurück mit Rückgabe    */
  183. }
  184.  
  185. /****************************************************************
  186. *                                                                                                                                *
  187. *    Function : dispscreen()                                                                                *
  188. *                                                                                                                                *
  189. *****************************************************************
  190. *                                                                                                                                *
  191. *         Input : para                                                                                                *
  192. *                                                                                                                                *
  193. *        Output : int returnset    allg Rückgabewert                                        *
  194. *                            != FALSE        alles klar                                                    *
  195. *                            == FALSE            Fehler                                                            *
  196. *                                                                                                                                *
  197. *****************************************************************
  198. *                                                                                                                                *
  199. *     Comment : DispScreen() initialisiert die Graphik und setzt        *
  200. *                         die benötigten Werte für die Darstellung. Danach        *
  201. *                         werden die verschiedenen Routinen für 2D, NIV oder    *
  202. *                         3D aufgerufen. Wenn die Ausgabe beendigt ist,            *
  203. *                         werden die alten Werte der Graphikdarstellung            *
  204. *                         wieder gesetzt.                                                                        *
  205. *                                                                                                                                *
  206. ****************************************************************/
  207.  
  208. static int dispscreen(para)
  209. int para;
  210. {
  211.  
  212.     int returnset = TRUE;                            /* allg Rückgabewert                */
  213.  
  214.     if (plot->disp == NULL)                        /* Graphik schon geöffnet ?    */
  215.     {                                                                    /* Nein                                            */
  216.         if (para == GRAPHNOTSET)                /* Graphiktyp init.                    */
  217.             plot->disp |= GRAPHNOTSET;
  218.         else
  219.             plot->disp |= GRAPHSET;
  220.         setreturn(OpenGraphics());            /* Graphik öffnen                        */
  221.     }
  222.     else if (!(plot->disp & para))        /* alte Graphik gleich wie    */
  223.     {                                                                    /* gewünschte. Nein                    */
  224.         seterror(GRAPHNOTEQ);                        /* Fehler                                        */
  225.         return(FALSE);
  226.     }
  227.     if (returnset == FALSE)                        /* Wenn Fehler, dann alles    */
  228.         CloseGraphics();                                /* schliessen                                */
  229.     else
  230.     {                                                                    /* und sonst weiter im Code    */
  231.         getgraphics();                                    /* alte Werte speichern            */
  232.         initgraphics();                                    /* neue Werte setzten                */
  233.  
  234. /****************************************************************
  235. *                                                                                                                                *
  236. *    Zu diesem Zeitpunkt sind alle Graphikwerte initialisiert, die    *
  237. *    von allen drei Routinen benötigt werden. Mit dem unteren            *
  238. *    switch() werden die verschiedenen Stammfunktionen für die            *
  239. *    drei Darstellungsarten aufgerufen.                                                        *
  240. *                                                                                                                                *
  241. ****************************************************************/
  242.  
  243.         switch(plot->typ)
  244.         {
  245.             case D2:                                            /* 2D Darstellung                        */
  246.             case NIV:                                            /* Niveau Darstellung                */
  247.                 setreturn(draw2d());
  248.                 break;
  249.             case D3:                                            /* 3D Darstellung                        */
  250.                 setreturn(draw3d());
  251.                 break;
  252.         }
  253.         resetgraphics();                                /* alte Werte setzten                */
  254.     }
  255.     return(returnset);
  256. }
  257.  
  258. /****************************************************************
  259. *                                                                                                                                *
  260. *    Function : draw2d()                                                                                        *
  261. *                                                                                                                                *
  262. *****************************************************************
  263. *                                                                                                                                *
  264. *         Input : void                                                                                                *
  265. *                                                                                                                                *
  266. *        Output : int returnset    allg Rückgabewert                                        *
  267. *                            != FALSE        alles klar                                                    *
  268. *                            == FALSE            Fehler                                                            *
  269. *                                                                                                                                *
  270. *****************************************************************
  271. *                                                                                                                                *
  272. *     Comment : Das ist die Hauptfunktion der 2D Darstellung. Sie    *
  273. *                         ruft die spez. 2D Funktionen auf. Die Niveaukurven    *
  274. *                         werden auch hier behandelt. Einzig das zeichnen        *
  275. *                         der Kurven und die Kurvenbeschriftung ist anders        *
  276. *                         als jene der 2D Darstellung.                                                *
  277. *                                                                                                                                *
  278. ****************************************************************/
  279.  
  280. static int draw2d()
  281. {
  282.     int returnset;                                        /* all. Rückgabewert                */
  283.  
  284.     getxsize2d();                                            /* verfügbare Zeichengrösse    */
  285.     getysize2d();                                            /* verfügbare Zeichengrösse    */
  286.     initfunction();                                        /* log Funktionen init.            */
  287.     calcstep(&plot->xmin,plot->xmes);    /* X-Step berechnen                    */
  288.     calcstep(&plot->ymin,plot->ymes);    /* Y-Step berechnen                    */
  289.     calcscale();                                            /* Skalierung berechen            */
  290.     drawgrid();                                                /* Gitter zeichnen                    */
  291.     if (plot->typ == D2)                            /* Wenn 2D                                    */
  292.         setreturn(draw2dcurves());            /* 2D Kurven zeichnen                */
  293.     else                                                            /* sonst                                        */
  294.         setreturn(drawnivcurves());            /* Niveau Kurven zeichenen    */
  295.     return(returnset);
  296. }
  297.  
  298. /****************************************************************
  299. *                                                                                                                                *
  300. *    Function : drawgrid()                                                                                    *
  301. *                                                                                                                                *
  302. *****************************************************************
  303. *                                                                                                                                *
  304. *         Input : void                                                                                                *
  305. *                                                                                                                                *
  306. *        Output : void                                                                                                *
  307. *                                                                                                                                *
  308. *****************************************************************
  309. *                                                                                                                                *
  310. *     Comment : DrawGrid() zeichnet das Gitter auf den Bildschirm    *
  311. *                         für die 2 dimensionale Darstellung.                                *
  312. *                                                                                                                                *
  313. ****************************************************************/
  314.  
  315. void drawgrid()
  316. {
  317.     int i,j,k,slen,len,htsize;
  318.  
  319.     char sbuf[] = " ";
  320.  
  321.     ClearGraphics();                                    /* Bildschirm löschen                */
  322.  
  323. /****************************************************************
  324. *                                                                                                                                *
  325. *    Konvertiere die Gittergrenzen neu, es kann einen Fehler von        *
  326. *    +- 1 Pixel geben.                                                                                            *
  327. *                                                                                                                                *
  328. ****************************************************************/
  329.  
  330.     trans2d(&plot->xgridmin,&plot->ygridmax,
  331.                     &plot->xpic1,&plot->ypic1);
  332.     trans2d(&plot->xgridmax,&plot->ygridmin,
  333.                     &plot->xpic2,&plot->ypic2);
  334.  
  335.     drawxaxis();
  336.     len = drawyaxis();
  337.  
  338. /****************************************************************
  339. *                                                                                                                                *
  340. *    Und jetzt noch der Rahmen um das Gitter.                                            *
  341. *                                                                                                                                *
  342. ****************************************************************/
  343.  
  344.     SetLineStyle(SOL_LINE);
  345.     DrawRectangle(plot->xpic1,plot->ypic1,plot->xpic2,plot->ypic2);
  346.  
  347. /****************************************************************
  348. *                                                                                                                                *
  349. *    Und nun die Beschriftung welche gegeben wurde. Gleichzeitig        *
  350. *    wird die globale Variable plot->cpt für den Start der                    *
  351. *    Kurvenbeschriftung initialisiert.                                                            *
  352. *                                                                                                                                *
  353. ****************************************************************/
  354.  
  355.     plot->cpt = plot->ypic2+plot->xle;
  356.                                                                         /* Start Namen oder Einheit    */
  357.  
  358.     if (plot->titel)                                    /* Titel der Graphik                */
  359.         printtextabs(plot->titel,
  360.                                  (plot->xpic1+plot->xpic2)/2,
  361.                                     plot->ypic1-plot->yle,T_CX|T_B);
  362.  
  363.     if (plot->xname)                                    /* X-Achsenname                            */
  364.         printtextabs(plot->xname,
  365.                                 (plot->xpic2+plot->xpic1)/2,
  366.                                 plot->cpt,T_CX|T_T);
  367.  
  368.     if (plot->xunit)                                    /* X-Achseneinheit                    */
  369.         printtextabs(plot->xunit,
  370.                                  plot->xpic2,
  371.                                  plot->cpt,T_L|T_T);
  372.  
  373.     if ((plot->xname) or                            /* Wenn Name oder Einheit        */
  374.             (plot->xunit))
  375.         plot->cpt += plot->ylt;                    /* 1 Zeile tiefer                        */
  376.  
  377.     if (plot->yname)                                    /* Y-Achsenname                            */
  378.     {
  379.         slen = strlen(plot->yname);            /* Länge des Namens                    */
  380.         len ++;                                                    /* Abstand zur Y-Achse            */
  381.         htsize = 5*plot->ytext/4;
  382.         j = (plot->ypic2+plot->ypic1-(slen-1)*htsize)/2;
  383.         k = plot->xpic1-len*plot->xtext;
  384.         for (i=0;i<slen;i++)                        /* jedes Zeichen ausgeben        */
  385.         {
  386.             sbuf[0] = plot->yname[i];
  387.             printtextabs(    sbuf,
  388.                                         k,
  389.                                         j+i*htsize,
  390.                                         T_L|T_CY);
  391.         }
  392.     }
  393.  
  394.     if (plot->yunit)                                    /* Y-Achseneinheit                    */
  395.         printtextabs(plot->yunit,
  396.                                  plot->xpic1,
  397.                                  plot->ypic1-plot->yle,
  398.                                  T_L|T_B);
  399.  
  400.     if (plot->typ == NIV)                            /* Nur für Niveau                        */
  401.     {
  402.         if (plot->zname)                                /* Z-Achsenname                            */
  403.             printtextabs(plot->zname,
  404.                                     (plot->xpic2+plot->xpic1)/2,
  405.                                      plot->ysize-plot->yht,T_CX|T_B);
  406.  
  407.         if (plot->zunit)                                /* Z-Achseneinheit                    */
  408.             printtextabs(plot->zunit,
  409.                                      plot->xpic2,
  410.                                      plot->ysize-plot->yht,T_L|T_B);
  411.  
  412.     }
  413. }
  414.  
  415. /****************************************************************
  416. *                                                                                                                                *
  417. *    Function : draw2dcurves()                                                                            *
  418. *                                                                                                                                *
  419. *****************************************************************
  420. *                                                                                                                                *
  421. *         Input : void                                                                                                *
  422. *                                                                                                                                *
  423. *        Output : int returnset    allg Rückgabewert                                        *
  424. *                            != FALSE        alles klar                                                    *
  425. *                            == FALSE            Fehler                                                            *
  426. *                                                                                                                                *
  427. *****************************************************************
  428. *                                                                                                                                *
  429. *     Comment : Draw2DCurves() zeichnet und beschriftet alle                *
  430. *                         geladenen 2D Kurven. Die Farbwahl welche für jede    *
  431. *                         Kurve gegeben werden konnte, übersteuert den                *
  432. *                         automatischen Farbenzähler.                                                *
  433. *                         Wenn die Daten geclippt werden müssen, so wird            *
  434. *                         dies ebenfalls gemacht. Boola ist in Indikator-        *
  435. *                         array für die Zuweisung des Startpunktes.                     *
  436. *                                                                                                                                *
  437. ****************************************************************/
  438.  
  439. static int draw2dcurves()
  440. {
  441.     register GPT *iarray,*iarray2;        /* Integerarray                            */
  442.  
  443.     GPT *iarray1;                                            /* Speicher                                    */
  444.  
  445.     int xs,ys,                                                /* Startkoordinaten                    */
  446.             xe,ye,                                                /* Endkoordinaten                        */
  447.             xe1,ye1,                                            /* Endkoordinaten                        */
  448.             count,                                                /* Schleifenzähler                    */
  449.             ptc,                                                    /* Punktezähler                            */
  450.             tris2,                                                /* Translation Rückgabe            */
  451.             center,                                                /* X-Achsen Zentrum                    */
  452.             returnset = TRUE,                            /* allg Rückgabewert                */
  453.             boola,                                                /* Booleanarray                            */
  454.             bool = FALSE;                                    /* Ind. für Kurvenbeschr.        */
  455.  
  456.     struct Curve *curve;                            /* Kurvenzeiger                            */
  457.  
  458.     DATA    *array,                                            /* Datenzeiger                            */
  459.                 *x2,*y2;
  460.  
  461.     center = (plot->xpic2-plot->xpic1)/2;
  462.                                                                         /* Berechne Mittelpunkt            */
  463.     curve = plot->first;                            /* erste Kurve holen                */
  464.     while (curve != NULL)                            /* solange Daten vorhanden    */
  465.     {
  466.         calccolor(curve->color);                /* welche Farbe ist dran ?    */
  467.         array = curve->val;                            /* init. Datenpointer                */
  468.         iarray = malloc((curve->count+2)*valsize()*sizeof(GPT));
  469.         if (iarray == NULL)                            /* speicher bekommen                */
  470.         {                                                                /* Nein                                            */
  471.             seterror(GRAPHMEM);                        /* Fehler setzten und                */
  472.             setreturn(FALSE);                            /* zurück    nächste                        */
  473.             break;                                                /* Kurve zeichnen                        */
  474.         }
  475.         iarray1 = iarray;                                /* Startwerte zuweisen            */
  476.         iarray2 = iarray;
  477.         boola = FALSE;                                    /* zuweisen des ersten            */
  478.         for (count = 0;count<curve->count;count++)
  479.         {                                                                /* alle Daten nehmen                */
  480.             x2 = array++;                                    /* Endpunkt zuweisen                */
  481.             y2 = array++;                                    /* und transformieren                */
  482.             tris2 = trans2d(x2,y2,&xe,&ye);
  483.             if (tris2 == TRUE)                        /* Fehler beim trans.                */
  484.             {                                                            /* Nein alles klar                    */
  485.                 if (boola & PTCSET)                    /* Startpunkt schon gesetzt */
  486.                     if (plot->clipp == CLIPP)    /* müssen wir clippen                */
  487.                     {                                                    /* Ja                                                */
  488.  
  489. /****************************************************************
  490. *                                                                                                                                *
  491. *    Die Clipping Routine liefert nur dann einen Status von NULL,    *
  492. *    wenn die Linie gezeichnet werden muss. Ansonsten ist dieser        *
  493. *    ungleich NULL.                                                                                                *
  494. *                                                                                                                                *
  495. ****************************************************************/
  496.  
  497.                         xe1 = xe;                                /* Für clippen                            */
  498.                         ye1 = ye;
  499.                         if (!(doclipp(&xs,&ys,&xe1,&ye1)))
  500.                         {
  501.                             if ((iarray2[0] == xs) and (iarray2[1] == ys))
  502.                             {
  503.                                 if (!(boola & PTCINS))
  504.                                 {                                        /* Startwert setzten                */
  505.                                     *iarray++ = xs;        /* Koordinate einsetzten        */
  506.                                     *iarray++ = ys;
  507.                                     boola |= PTCINS;    /* Flag setzten                            */
  508.                                 }
  509.                                 *iarray++ = xe1;        /* Endpunkt setzten                    */
  510.                                 *iarray++ = ye1;
  511.                                 iarray2 += 2;                /* Zeiger erhöhen                        */
  512.                             }
  513.                             else
  514.                             {
  515.                                 if (boola & PTCINS)    /* Nur wenn Daten                        */
  516.                                 {                                        /* Kurve zeichnen                        */
  517.                                     ptc = (iarray - iarray1)/valsize();
  518.                                     DrawPolyLine(ptc,iarray1);
  519.                                 }
  520.                                 iarray = iarray1;        /* alle Pointer zurück-            */
  521.                                 *iarray++ = xs;            /* setzten und die erste        */
  522.                                 *iarray++ = ys;            /* Linie einsetzten                    */
  523.                                 *iarray++ = xe1;
  524.                                 *iarray++ = ye1;
  525.                                 iarray2 = iarray1+2;
  526.                                 xe = xe1;                        /* Für clipp                                */
  527.                                 ye = ye1;                        /* Flag setzten                            */
  528.                                 boola = PTCINS|PTCSET;
  529.                             }
  530.                         }
  531.                     }
  532.                     else                                            /* kein Clipping, Punkte        */
  533.                     {                                                    /* setzten                                    */
  534.                         if (!(boola & PTCINS))    /* Start schon gesetzt ?        */
  535.                         {                                                /* Nein                                            */
  536.                             *iarray++ = xs;                /* Startkoordinaten setzten    */
  537.                             *iarray++ = ys;
  538.                             boola |= PTCINS;            /* Flag setzten                            */
  539.                         }
  540.                         *iarray++ = xe;                    /* nächster Punkt setzen        */
  541.                         *iarray++ = ye;
  542.                     }
  543.                 xs = xe;                                        /* Endpunkt wird zum Start-    */
  544.                 ys = ye;                                        /* punkt. Zeige das gemacht    */
  545.                 boola |= PTCSET;                        /* mit PTCSET                                */
  546.             }
  547.             else                                                    /* Ja Fehler                                */
  548.             {
  549.                 if (boola & PTCINS)                    /* Startwert gesetzt ?            */
  550.                 {                                                        /* Ja, dann zeichne Kurve        */
  551.                     ptc = (iarray - iarray1)/valsize();
  552.                     DrawPolyLine(ptc,iarray1);
  553.                 }
  554.                 iarray = iarray1;                        /* Startarray zuweisen            */
  555.                 boola = FALSE;                            /* und neue Kurve beginnen    */
  556.             }
  557.         }                                                                /* alle Daten berechnet            */
  558.  
  559.         if (boola & PTCINS)                            /* noch Kurven vorhanden        */
  560.         {                                                                /* Ja                                                */
  561.             ptc = (iarray - iarray1)/valsize();
  562.             DrawPolyLine(ptc,iarray1);        /* zeichnen                                    */
  563.         }
  564.         free(iarray1);                                    /* Speicher zurückgeben            */
  565.  
  566.         if (curve->titel)                                /* Hat die Kurve einen            */
  567.         {                                                                /* Namen ?                                    */
  568.                                                                         /* Zeichne Linie vor Name        */
  569.             DrawLine(    plot->xpic1+bool*center,
  570.                                 plot->cpt+plot->ytext,
  571.                                 plot->xpic1+CURLSIZE+bool*center,
  572.                                 plot->cpt+plot->ytext);
  573.             SetFgColor(TEXTCOL);                    /* für Text                                    */
  574.             printtextabs(    curve->titel,        /* und schreibe Namen                */
  575.                                         plot->xpic1+CURLSIZE+bool*center,
  576.                                         plot->cpt,
  577.                                         T_R|T_T);
  578.             bool ^= 1;                                        /* nächste andere Stelle        */
  579.             if (!(bool))                                    /* Wenn Bool NULL, dann         */
  580.                 plot->cpt += plot->ylt;            /* haben wir 2 Kurven                */
  581.         }                                                                /* beschriftet                            */
  582.         curve = curve->next;                        /* neuer Kurvenzeiger                */
  583.     }
  584.     return(returnset);
  585. }
  586.  
  587. /****************************************************************
  588. *                                                                                                                                *
  589. *    Function : drawgline()                                                                                *
  590. *                                                                                                                                *
  591. *****************************************************************
  592. *                                                                                                                                *
  593. *         Input : void                                                                                                *
  594. *                                                                                                                                *
  595. *        Output : void                                                                                                *
  596. *                                                                                                                                *
  597. *****************************************************************
  598. *                                                                                                                                *
  599. *     Comment : DrawGridline zeichnet eine Gerade anhand des                *
  600. *                         eingestellten Gitterwertes. Wenn dieser                         *
  601. *                         GRID ist, so wird eine lange punktierte                        *
  602. *                         Linie gezeichnet. Wenn er NOGRID ist,                            *
  603. *                         dann werden zwei kurze volle Geraden gezeichnet.        *
  604. *                                                                                                                                *
  605. ****************************************************************/
  606.  
  607. void drawgline(xs,ys,xe,ye)
  608. DATA *xs,*ys,*xe,*ye;
  609. {
  610.     int xsn,ysn,xen,yen,                            /* trans. Werte                            */
  611.             step;                                                    /* Länge der kurzen Geraden    */
  612.  
  613.     trans2d(xs,ys,&xsn,&ysn);                    /* Werte transformieren            */
  614.     trans2d(xe,ye,&xen,¥);
  615.  
  616.     if (plot->grid == GRID)                        /* Gitter zeichnen ?                */
  617.     {                                                                    /* Ja                                                */
  618.         SetLineStyle(DOT_LINE);                    /* Punktierte Linie                    */
  619.         DrawLine(xsn,ysn,xen,yen);            /* und zeichnen                            */
  620.     }
  621.     else                                                            /* keine Gitter                            */
  622.     {
  623.         SetLineStyle(SOL_LINE);                    /* volle Linie                            */
  624.         if (xsn == xen)                                    /* X-Achse ?                                */
  625.         {                                                                /* Ja                                                */
  626.             step = (yen-ysn)/GRIDLSIZE;        /* Länge der Linien                    */
  627.                                                                         /* und zeichnen                            */
  628.             DrawLine(xsn,ysn,xen,ysn+step);
  629.             DrawLine(xsn,yen-step,xen,yen);
  630.         }
  631.         else                                                        /* also Y-Achse                            */
  632.         {
  633.             step = (xen-xsn)/GRIDLSIZE;        /* Länge der Linien                    */
  634.                                                                         /* und zeichnen                            */
  635.             DrawLine(xsn,ysn,xsn+step,yen);
  636.             DrawLine(xen-step,ysn,xen,yen);
  637.         }
  638.     }
  639. }
  640.  
  641. /****************************************************************
  642. *                                                                                                                                *
  643. *    Function : drawsline()                                                                                *
  644. *                                                                                                                                *
  645. *****************************************************************
  646. *                                                                                                                                *
  647. *         Input : void                                                                                                *
  648. *                                                                                                                                *
  649. *        Output : void                                                                                                *
  650. *                                                                                                                                *
  651. *****************************************************************
  652. *                                                                                                                                *
  653. *     Comment : Diese Funktion zeichnet die Linien zwischen zwei        *
  654. *                         Steps. Es wurde bewusst auf die Integration dieser    *
  655. *                         Funktion in die von DrawGridLine() verzichtet, da    *
  656. *                         sonst zuviele Parameter übergeben werden müssten        *
  657. *                         und die Funktion zu langsam wird.                                    *
  658. *                                                                                                                                *
  659. ****************************************************************/
  660.  
  661. void drawsline(xs,ys,xe,ye)
  662. DATA *xs,*ys,*xe,*ye;
  663. {
  664.     int xsn,ysn,xen,yen,step;
  665.  
  666.     trans2d(xs,ys,&xsn,&ysn);                    /* Werte transformieren            */
  667.     trans2d(xe,ye,&xen,¥);
  668.  
  669.     SetLineStyle(SOL_LINE);                        /* volle Linie                            */
  670.     if (xsn == xen)                                        /* X-Achse ?                                */
  671.     {
  672.         step = (yen-ysn)/STEPLSIZE;            /* Länge der Linien                    */
  673.         DrawLine(xsn,ysn,xen,ysn+step);    /* und zeichnen                            */
  674.         DrawLine(xsn,yen-step,xen,yen);
  675.     }
  676.     else                                                            /* also Y-Achse                            */
  677.     {
  678.         step = (xen-xsn)/STEPLSIZE;            /* Länge der Linien                    */
  679.         DrawLine(xsn,ysn,xsn+step,yen);    /* und zeichen                            */
  680.         DrawLine(xen-step,ysn,xen,yen);
  681.     }
  682. }
  683.  
  684. /****************************************************************
  685. *                                                                                                                                *
  686. *    Function : trans2d()                                                                                    *
  687. *                                                                                                                                *
  688. *****************************************************************
  689. *                                                                                                                                *
  690. *         Input : xo,yo,xn,yn                                                                                *
  691. *                            DATA *xo            transformierender X-Wert                        *
  692. *                                     *yo            transformierender Y-Wert                        *
  693. *                            int     *xn            transformierter X-Wert                            *
  694. *                                     *yn            transformierter Y-Wert                            *
  695. *                                                                                                                                *
  696. *        Output : returnset            Rüchgabewert                                                *
  697. *                            int returnset                                                                            *
  698. *                                == TRUE            gültige Transformation                            *
  699. *                                 & XTRANS        ungültige X Transformation                    *
  700. *                                 & YTRANS        ungültige Y Transformation                    *
  701. *                                                                                                                                *
  702. *****************************************************************
  703. *                                                                                                                                *
  704. *     Comment : Diese Funktion transformiert ein Koordinatenpaar        *
  705. *                         auf die Bildschirmkoordinaten.    Die math.                        *
  706. *                         Beschreibung dieser Funktion ist in der Diplom-        *
  707. *                         arbeit zu finden.                                                                    *
  708. *                                                                                                                                *
  709. ****************************************************************/
  710.  
  711. int trans2d(xo,yo,xn,yn)
  712. DATA *xo,
  713.          *yo;
  714. int     *xn,
  715.          *yn;
  716. {
  717.     int returnset = TRUE;                            /* allg Rückgabewert                */
  718.  
  719.     if (plot->xmes == LIN)                        /* lineare Transformation        */
  720.         *xn = (int)(xscale*((*xo)-xoffset))+plot->xpic1;
  721.     else                                                            /* log. Transformation            */
  722.         if (*xo > 0.0)                                    /* bereichscheck                        */
  723.             *xn = (int)(xscale*(xlogfct(*xo)-xoffset))+plot->xpic1;
  724.         else
  725.             returnset |=XTRANS;
  726.  
  727.     if (plot->ymes == LIN)                        /* lineare Transformation        */
  728.         *yn = (int)(yscale*(*yo-yoffset))+plot->ypic2;
  729.     else                                                            /* log. Transformation            */
  730.         if (*yo > 0.0)                                    /* bereichscheck                        */
  731.             *yn = (int)(yscale*(ylogfct(*yo)-yoffset))+plot->ypic2;
  732.         else
  733.             returnset |= YTRANS;
  734.  
  735.     return(returnset);                                /* und zurück                                */
  736. }
  737.  
  738. /****************************************************************
  739. *                                                                                                                                *
  740. *    Function : checkclipp()                                                                                *
  741. *                                                                                                                                *
  742. *****************************************************************
  743. *                                                                                                                                *
  744. *         Input : x,y,c                                                                                            *
  745. *                            int x                            x Koordinate                                        *
  746. *                            int y                            y Koordinate                                        *
  747. *                            char *c                        Status                                                    *
  748. *                                                                                                                                *
  749. *        Output : void                                                                                                *
  750. *                                                                                                                                *
  751. *****************************************************************
  752. *                                                                                                                                *
  753. *     Comment : Diese Funktion kontrolliert die Koordinaten                 *
  754. *                         mittels der Bildgrenzen auf ihre Lage. Der                    *
  755. *                         Status wird mit den folgenden defines gesetzt.            *
  756. *                                                                                                                                *
  757. *                            C_L    ->    Lage links von Bildgrenze                                    *
  758. *                            C_R    ->    Lage rechts von Bildgrenze                                *
  759. *                            C_T    ->    Lage über von Bildgrenze                                    *
  760. *                            C_B    ->    Lage unter von Bildgrenze                                    *
  761. *                                                                                                                                *
  762. *                        Wenn das Clipping eingeschaltet ist, wird                        *
  763. *                        mindestens diese Funktion aufgerufen und durch-            *
  764. *                        geführt.                                                                                        *
  765. *                                                                                                                                *
  766. ****************************************************************/
  767.  
  768. static void checkclipp(x,y,c)
  769. int    x;
  770. int    y;
  771. char    *c;
  772. {
  773.   *c=0;                                                            /* status initialisieren        */
  774.   if (x<plot->xpic1)                                /* links von min ?                    */
  775.     *c |= C_L;                                            /* Ja                                                */
  776.   else if (x>plot->xpic2)                        /* Nein, rechts von max            */
  777.     *c |= C_R;                                            /* Ja                                                */
  778.  
  779.   if (y<plot->ypic1)                                /* unterhalb von min ?            */
  780.     *c |= C_T;                                            /* Ja                                                */
  781.   else if (y>plot->ypic2)                        /* Nein, oberhalb von max        */
  782.     *c |= C_B;                                            /* Ja                                                */
  783. }
  784.  
  785. /****************************************************************
  786. *                                                                                                                                *
  787. *    Function : doclipp()                                                                                    *
  788. *                                                                                                                                *
  789. *****************************************************************
  790. *                                                                                                                                *
  791. *         Input : x1,y1,x2,y2                                                                                *
  792. *                            int *x1                x Start                                                            *
  793. *                            int    *y1                y    Start                                                            *
  794. *                            int *x2                x Ende                                                            *
  795. *                            int *y2                y Ende                                                            *
  796. *                                                                                                                                *
  797. *        Output : char                        Status                                                            *
  798. *                            != 0                    trivial reject                                            *
  799. *                            == 0                    Draw                                                                *
  800. *                                                                                                                                *
  801. *****************************************************************
  802. *                                                                                                                                *
  803. *     Comment : Der Cohen-Sutherland Clipping Algorithmus welcher    *
  804. *                         hier verwendet wird, liefert einen Status über            *
  805. *                         das Zeichnen der Linie. Wenn dieser Status == 0        *
  806. *                         ist, kann die Linie gezeichnet werden.                            *
  807. *                         Eine nähere Beschreibung dieses Algorithums                *
  808. *                         befindet sich in der Diplomarbeit.                                    *
  809. *                                                                                                                                *
  810. ****************************************************************/
  811.  
  812. char doclipp(x1,y1,x2,y2)
  813. int    *x1;
  814. int    *y1;
  815. int    *x2;
  816. int    *y2;
  817. {
  818.     int    x,y,                                                    /* geclippte Koordinaten        */
  819.             h;                                                        /* Höhe                                            */
  820.     char    c1,c2,c;                                        /* Status Variablen                    */
  821.  
  822.     checkclipp(*x1,*y1,&c1);                    /* Kontrolliere Startpunkt    */
  823.     checkclipp(*x2,*y2,&c2);                    /* kontrolliere Endpunkt        */
  824.  
  825. /****************************************************************
  826. *                                                                                                                                *
  827. *    Der folgende Vergleich bestimmt das Clipping.                                    *
  828. *                                                                                                                                *
  829. *    ((c1!=0) || (c2!=0)) Wenn c1 == 0 und c2 == 0 dann trivial        *
  830. *    accept also die Linie liegt vollständig im Fenster.                        *
  831. *                                                                                                                                *
  832. *    ((c1 & c2)!=0) Wenn beide Statusvariablen gleich sind spricht    *
  833. *    man von trivial reject.                                                                                *
  834. *                                                                                                                                *
  835. *    Wenn eine dieser Bedingungen erfüllt ist, dann muss keine            *
  836. *    Berechnung durchgeführt werden. Der Status wird entsprechend    *
  837. *    gesetzt.                                                                                                            *
  838. *                                                                                                                                *
  839. ****************************************************************/
  840.  
  841.     while(((c1!=0) || (c2!=0)) && ((c1 & c2)==0))
  842.   {
  843.         if (c1)                                                    /* Startpunkt clippen                */
  844.             c=c1;                                                    /* dann Status zuweisen            */
  845.         else                                                        /* sonst                                        */
  846.             c=c2;                                                    /* Endpunkt zuweisen                */
  847.  
  848.         if (c & C_L)                                        /* Punkt links ?                        */
  849.         {                                                                /* Ja                                                */
  850.             x=plot->xpic1;                                /* x gleich minpic                    */
  851.             h=(int)(1.0*(*y2-*y1)*(x-*x1)/(*x2-*x1));
  852.             y= *y1+h;                                            /* berechnete höhe + y1            */
  853.         }
  854.         else if (c & C_R)                                /* Punkt rechts ?                        */
  855.         {                                                                /* Ja                                                */
  856.             x=plot->xpic2;                                /* x gleich maxpic                    */
  857.             h=(int)(1.0*(*y2-*y1)*(x-*x1)/(*x2-*x1));
  858.             y= *y1+h;                                            /* berechnete höhe + y1            */
  859.         }
  860.         else if (c & C_T)                                /* Punkt oben ?                            */
  861.         {                                                                /* Ja                                                */
  862.             y=plot->ypic1;                                /* y gleich minpic                    */
  863.             h=(int)(1.0*(*x2-*x1)*(y- *y1)/(*y2- *y1));
  864.             x= *x1+h;                                            /* berechnete höhe + x1            */
  865.         }
  866.         else if (c & C_B)                                /* Punkt unten ?                        */
  867.         {                                                                /* Ja                                                */
  868.             y=plot->ypic2;                                /* y gleich maxpic                    */
  869.             h=(int)(1.0*(*x2-*x1)*(y- *y1)/(*y2- *y1));
  870.             x= *x1+h;                                            /* berechnete höhe + x1            */
  871.         }
  872.  
  873.         if (c==c1)                                            /* Startpunkt bearbeitet ?    */
  874.         {                                                                /* Ja                                                */
  875.             *x1=x;                                                /* geclippte Werte zu-            */
  876.             *y1=y;                                                /* weisen                                        */
  877.             checkclipp(x,y,&c1);                    /* und kontrollieren                */
  878.         }
  879.         else                                                        /* also Endpunkt                        */
  880.         {
  881.             *x2=x;                                                /* geclippte Werte zu-            */
  882.             *y2=y;                                                /* weisen                                        */
  883.             checkclipp(x,y,&c2);                    /* und kontrollieren                */
  884.         }
  885.     }
  886.     return(c1);                                                /* zurück mit Status                */
  887. }
  888.  
  889. /****************************************************************
  890. *                                                                                                                                *
  891. *    Function : initgraphics()                                                                            *
  892. *                                                                                                                                *
  893. *****************************************************************
  894. *                                                                                                                                *
  895. *         Input : void                                                                                                *
  896. *                                                                                                                                *
  897. *        Output : void                                                                                                *
  898. *                                                                                                                                *
  899. *****************************************************************
  900. *                                                                                                                                *
  901. *     Comment : Diese Funktion initialisiert die Plotstruktur mit    *
  902. *                         den verfügbaren Graphikwerten.                                            *
  903. *                         Die folgenden Werte werden gestzt:                                    *
  904. *                                                                                                                                *
  905. *                                xsize        ->    max. horizontale beschreibbare            *
  906. *                                                        Bildkoordinate                                            *
  907. *                                ysize        ->    max. vertikale beschreibbare                *
  908. *                                                        Bildkoordinate                                            *
  909. *                                maxcol    ->    max. setztbares Farbregister                *
  910. *                                xtext        ->    Breite einse Zeichens                                *
  911. *                                ytext        ->    Höhe eines Zeichens                                    *
  912. *                                                                                                                                *
  913. *                                xht            ->    Halbe Zeichenlänge                                    *
  914. *                                xlt            ->    1 vertikale Zeile                                        *
  915. *                                                                                                                                *
  916. *                         Diese Werte sind die Grundlage für die späteren        *
  917. *                         berechnungen. Dies Routine muss vor jedem Bild-        *
  918. *                         schirmaufbau aufgerufen werden.                                        *
  919. *                                                                                                                                *
  920. ****************************************************************/
  921.  
  922. static void initgraphics()
  923. {
  924.     SetTextSize();                                        /* setzte Text                            */
  925.  
  926.     plot->xsize = GetMaxX();                     /* max horix. Bildgrösse        */
  927.     plot->ysize = GetMaxY();                     /* max vert. Bildgrösse            */
  928.  
  929.     plot->maxcol = GetMaxColor();            /* max Farbenanzahl                    */
  930.     plot->xtext = GetTextSize(XSIZE);    /* Textgrösse holen                    */
  931.     plot->ytext = GetTextSize(YSIZE);
  932.  
  933.     plot->xht = plot->xtext/2;                /* Halber Text                            */
  934.     plot->xlt = 3*plot->xtext/2;            /* Eine Zeile                                */
  935.  
  936.  
  937.     plot->yht = plot->ytext/2;                /* halbe Texthöhe                        */
  938.     plot->ylt = 3*plot->ytext/2;            /* mormale Zeilenhöhe                */
  939.  
  940.     if (plot->xmes == LIN)
  941.         plot->xle = plot->ylt;                    /* exp. Zeilenhöhe                    */
  942.     else
  943.         plot->xle = 2*plot->ytext;            /* exp. Zeilenhöhe                    */
  944.  
  945.     if (plot->ymes == LIN)
  946.         plot->yle = plot->ylt;                    /* exp. Zeilenhöhe                    */
  947.     else
  948.         plot->yle = 2*plot->ytext;            /* exp. Zeilenhöhe                    */
  949.  
  950.     SetFgColor(TEXTCOL);                            /* setzte Stift                            */
  951.     SetBackColor(BACKCOL);                        /* setzte Hintergrund                */
  952. }
  953.  
  954. /****************************************************************
  955. *                                                                                                                                *
  956. *    Function : getxsize2d()                                                                                *
  957. *                                                                                                                                *
  958. *****************************************************************
  959. *                                                                                                                                *
  960. *         Input : void                                                                                                *
  961. *                                                                                                                                *
  962. *        Output : void                                                                                                *
  963. *                                                                                                                                *
  964. *****************************************************************
  965. *                                                                                                                                *
  966. *     Comment : Berechnet die verfügbare Bildgrösse für die                *
  967. *                         X Bildkoordinatenachse.                                                        *
  968. *                         Die einzelnen Abstände zwichen den verschiedenen        *
  969. *                         Zeichen ist immer 1/2*xtext.                                                *
  970. *                         Für die Berechnung werden die Variablen                        *
  971. *                         plot->xht und plot->xlt verwendet, welche in                *
  972. *                         der Routine InitGrahpics initialisiert werden.            *
  973. *                                                                                                                                *
  974. ****************************************************************/
  975.  
  976. void getxsize2d()
  977. {
  978.  
  979.     plot->xpic1 = plot->xht;                    /* Startwert                                */
  980.     plot->xpic2 = plot->xsize-plot->xht;
  981.                                                                         /* Endwert                                    */
  982.     if (plot->yname)                                    /* Nur wenn Name gegeben        */
  983.         plot->xpic1 += plot->xlt;                /* Bild verkleinern                    */
  984.  
  985. /****************************************************************
  986. *                                                                                                                                *
  987. *    Für die Beschriftung der X-Achse                                                            *
  988. *                                                                                                                                *
  989. ****************************************************************/
  990.  
  991.     plot->xpic1 += VALSIZE*plot->xtext+plot->xht;
  992.     if (plot->typ != D3)
  993.         plot->xpic2 -= VALSIZE/2*plot->xtext;
  994.     else
  995.         plot->xpic2 -= VALSIZE*plot->xtext;
  996.  
  997. }
  998.  
  999. /****************************************************************
  1000. *                                                                                                                                *
  1001. *    Function : getysize2d()                                                                                *
  1002. *                                                                                                                                *
  1003. *****************************************************************
  1004. *                                                                                                                                *
  1005. *         Input : void                                                                                                *
  1006. *                                                                                                                                *
  1007. *        Output : void                                                                                                *
  1008. *                                                                                                                                *
  1009. *****************************************************************
  1010. *                                                                                                                                *
  1011. *     Comment : Berechnet die verfügbare Bildgrösse für die                *
  1012. *                         Y Bildkoordinatenachse.                                                        *
  1013. *                         Die einzelnen Abstände zwichen den verschiedenen        *
  1014. *                         Zeichen ist immer 1/2*xtext.                                                *
  1015. *                         Für die Berechnung werden die Variablen                        *
  1016. *                         plot->yht, plot->ylt und plot->yle verwendet,            *
  1017. *                         welche in der Routine InitGrahpics initialisiert        *
  1018. *                         werden.                                                                                        *
  1019. *                                                                                                                                *
  1020. ****************************************************************/
  1021.  
  1022. void getysize2d()
  1023. {
  1024.  
  1025.     int titelcount = NULL,                        /* Anzahl Kurvennamen                */
  1026.             niveau,                                                /* Anzahl verschiedener            */
  1027.                                                                         /* Niveaus                                    */
  1028.             lines,                                                /* Zeilengrösse                            */
  1029.             line;                                                    /* Anzahl benötigte Zeilen    */
  1030.  
  1031.     struct Curve *curve;                            /* Kurvenzeiger                            */
  1032.  
  1033.     plot->ypic1 = NULL;                                /* Startwert                                */
  1034.     plot->ypic2 = plot->ysize-plot->yht;
  1035.                                                                         /* Endwert                                    */
  1036.  
  1037.     if ((plot->titel) or                            /* Titel oder Einheit             */
  1038.             (plot->yunit))                                /* gesetzt eine Zeile                */
  1039.         plot->ypic1 += plot->ylt;                /* weniger                                    */
  1040.  
  1041.         plot->ypic2 -= plot->xle;                /* Beschriftung X-Achse            */
  1042.  
  1043.         plot->ypic1 += plot->yle;                /* Beschriftung Y-Achse            */
  1044.  
  1045.     if (plot->typ != D3)
  1046.     {
  1047.         if ((plot->xname) or                        /* Name oder Einheit                */
  1048.                 (plot->xunit))                            /* gesetzt eine Zeile                */
  1049.             plot->ypic2 -= plot->ylt;            /* weniger                                    */
  1050.     }
  1051.  
  1052.     if (plot->typ != NIV)                            /* Wenn 2D dann alle Namen    */
  1053.     {                                                                    /* der Kurven zählen                */
  1054.         curve = plot->first;
  1055.         while (curve != NULL)
  1056.         {
  1057.             if (curve->titel)
  1058.                 titelcount ++;
  1059.             curve = curve->next;
  1060.         }                                                                /* 2 Titel auf 1 Zeile            */
  1061.         plot->ypic2 -= ++titelcount/2*plot->ylt;
  1062.     }
  1063.     else
  1064.     {                                                                    /* Ja                                                */
  1065.         niveau = checkniv();                        /* hole verschiedene Werte    */
  1066.         lines = (plot->xpic2-plot->xpic1)/(plot->xtext*(RECTSIZE));
  1067.         line = niveau/lines;                        /* Anzahl Zeilen                        */
  1068.         if (niveau%lines != NULL)                /* Nur wenn Rest eine mehr    */
  1069.             line++;
  1070.         plot->ypic2 -= line*2*plot->ytext;
  1071.                                                                         /* Für jede Linie 2 Zeilen    */
  1072.         if ((plot->zname) or                        /* Name oder Einheit                */
  1073.                 (plot->zunit))                            /* gesetzt eine Zeile                */
  1074.             plot->ypic2 -= plot->ylt;            /* weniger                                    */
  1075.     }
  1076. }
  1077.  
  1078. /****************************************************************
  1079. *                                                                                                                                *
  1080. *    Function : calcstep()                                                                                    *
  1081. *                                                                                                                                *
  1082. *****************************************************************
  1083. *                                                                                                                                *
  1084. *         Input : min,mes                                                                                        *
  1085. *                            DATA *min                Adr. der Daten                                        *
  1086. *                            int  mes                Masstab                                                        *
  1087. *                                                                                                                                *
  1088. *        Output : void                                                                                                *
  1089. *                                                                                                                                *
  1090. *****************************************************************
  1091. *                                                                                                                                *
  1092. *     Comment : Berechnet die Schrittweite der Graphik für alle        *
  1093. *                         Masstäbe. Die verschiedenen Berechnungen werden        *
  1094. *                         nachfolgend erklärt.                                                                *
  1095. *                                                                                                                                *
  1096. *                         LIN :    Die Schrittweite wird berechnet mit der            *
  1097. *                                        max. Schritten. Damit es jedoch nicht                *
  1098. *                                        willkürliche Schritte sind, wird aus einer    *
  1099. *                                        Tabelle der nächste Schritt gesucht.                *
  1100. *                                        Mit diesem neuen Schritt werden die Grenz-    *
  1101. *                                        werte der Graphik gesetzt. Als kleines            *
  1102. *                                        Detail ist der Ursprung. Wenn dieser in den    *
  1103. *                                        Grenzen enthalten ist, muss dieser auf             *
  1104. *                                        Schritt fallen.                                                            *
  1105. *                                                                                                                                *
  1106. *                         LOG :    Bei der logarithmischen Darstellung werden    *
  1107. *                                        nur ganze Dekaden gezeichnet und                         *
  1108. *                                        beschriftet. Da die Beschriftung wesentlich    *
  1109. *                                        kürzer ist als jene der linearen                        *
  1110. *                                        Darstellung, wird hier ohne max. Schritt        *
  1111. *                                        gerechnet.                                                                    *
  1112. *                                                                                                                                *
  1113. *                         LN  :    Bei dieser Darstellung gelten die gleichen    *
  1114. *                                        Voraussetzungen wie bei der LOG.                        *
  1115. *                                                                                                                                *
  1116. ****************************************************************/
  1117.  
  1118. void calcstep(min,mes)
  1119. DATA    *min;
  1120. int mes;
  1121. {
  1122.  
  1123.     DATA steptable[STEPVAL] =                    /* definierte Schritte bei    */
  1124.     {                                                                    /* der linearen Darstellung    */
  1125.         1.0,1.25,1.5,2.0,2.5,3.0,
  1126.         4.0,5.0,6.0,7.5,8.0,10.0
  1127.     };
  1128.  
  1129.     DATA     *max,                                                /* maximaler Wert                        */
  1130.                 *plotstep,                                    /* Graphikstep                            */
  1131.                 *gridmin,                                        /* min. Graphikwert                    */
  1132.                 *gridmax,                                        /* max. Graphikwert                    */
  1133.                 step,                                                /* prov. step                                */
  1134.                 valexp;                                            /* Exponent                                    */
  1135.  
  1136.     int i;                                                        /* Schleifenzähler                    */
  1137.  
  1138.     max = min+1;                                            /* Zuweisen der Adressen        */
  1139.     plotstep = min+2;
  1140.     gridmin = min+3;
  1141.     gridmax = min+4;
  1142.  
  1143.     switch(mes)                                                /* Je nach Masstab                    */
  1144.     {
  1145.         case LIN:                                                /* Linear                                        */
  1146.             step = (*max-*min)/STEPNBR;        /* prov. Step    berechnen            */
  1147.             valexp = pow(10.0,getexp(step));
  1148.                                                                         /* berechen Dekadenwert            */
  1149.  
  1150. /****************************************************************
  1151. *                                                                                                                                *
  1152. *    Suche den Schrittwert welcher grösser als der prov.                        *
  1153. *    berechnete ist. Mit dieser Methode unterscheiden sind die            *
  1154. * Anzahl der Schritte nur um +-1 von STEPNBR.                                        *
  1155. *                                                                                                                                *
  1156. ****************************************************************/
  1157.  
  1158.             for (i=0;i<=STEPVAL;i++)
  1159.                 if (step <= steptable[i]*valexp)
  1160.                 {
  1161.                     step = steptable[i]*valexp;
  1162.                     break;
  1163.                 }
  1164.             *plotstep = step;                            /* Zuweisen der Werte                */
  1165.             *gridmin = floor((*min)/step)*step;
  1166.             *gridmax = ceil((*max)/step)*step;
  1167.             break;
  1168.  
  1169.         case LOG:
  1170.             valexp = getexp(*min);                /* mit welcher Dekade    min        */
  1171.             *gridmin = pow(10.0,valexp);    /* min Wert zuweisen                */
  1172.             valexp = getexp(*max);                /* in welcher Dekade max        */
  1173.             *gridmax = pow(10.0,valexp);    /* max Wert zuweisen                */
  1174.             if (*gridmax < *max)                    /* evt. 1 Dekade höher            */
  1175.                 *gridmax = pow(10.0,valexp+1);
  1176.             break;
  1177.  
  1178.         case LN:
  1179.             valexp = getexpe(*min);                /* mit welcher Dekade    min        */
  1180.             *gridmin = exp(valexp);                /* min Wert zuweisen                */
  1181.             valexp = getexpe(*max);                /* in welcher Dekade max        */
  1182.             *gridmax = exp(valexp);                /* max Wert zuweisen                */
  1183.             if (*gridmax < *max)                    /* evt. 1 Dekade höher            */
  1184.                 *gridmax = exp(valexp+1);
  1185.             break;
  1186.     }
  1187. }
  1188.  
  1189. /****************************************************************
  1190. *                                                                                                                                *
  1191. *    Function : initfunction()                                                                            *
  1192. *                                                                                                                                *
  1193. *****************************************************************
  1194. *                                                                                                                                *
  1195. *         Input : void                                                                                                *
  1196. *                                                                                                                                *
  1197. *        Output : void                                                                                                *
  1198. *                                                                                                                                *
  1199. *****************************************************************
  1200. *                                                                                                                                *
  1201. *     Comment : Diese Funktion initialisiert die nicht linearen        *
  1202. *                         Skalierungsfunktionen. Die globalen Funktions-            *
  1203. *                         zeiger können dann jederzeit aufgerufen werden.        *
  1204. *                                                                                                                                *
  1205. *                            xlogfct    -> Skalierungsfunktion für X-Achse                *
  1206. *                            xexpfct    -> Umkehrung der Skalierung                                *
  1207. *                            ylogfct    -> Skalierungsfunktion für Y-Achse                *
  1208. *                            yexpfct    -> Umkehrung der Skalierung                                *
  1209. *                            zlogfct    -> Skalierungsfunktion für Z-Achse                *
  1210. *                            zexpfct    -> Umkehrung der Skalierung                                *
  1211. *                                                                                                                                *
  1212. *                         Diese Funktionen erleichtern das Skalieren der            *
  1213. *                         einzelnen Werte sehr stark.                                                *
  1214. *                                                                                                                                *
  1215. ****************************************************************/
  1216.  
  1217. void initfunction()
  1218. {
  1219.     if (plot->xmes != LIN)                        /* lineare X-Achse ?                */
  1220.         if (plot->xmes == LOG)                    /* Nein, ev. log ?                    */
  1221.         {                                                                /* Ja                                                */
  1222.             xlogfct = log10;                            /* Also log Funktionen            */
  1223.             xexpfct = exp10;                            /* zuweisen                                    */
  1224.         }
  1225.         else                                                        /* kann nur ln sein                    */
  1226.         {
  1227.             xlogfct = log;                                /* Dann halt diese Funktion    */
  1228.             xexpfct = exp;                                /* zuweisen                                    */
  1229.         }
  1230.  
  1231.     if (plot->ymes != LIN)                        /* lineare Y-Achse ?                */
  1232.         if (plot->ymes == LOG)                    /* Nein, ev. log ?                    */
  1233.         {                                                                /* Ja                                                */
  1234.             ylogfct = log10;                            /* Also log Funktionen            */
  1235.             yexpfct = exp10;                            /* zuweisen                                    */
  1236.         }
  1237.         else                                                        /* kann nur ln sein                    */
  1238.         {
  1239.             ylogfct = log;                                /* Dann halt diese Funktion    */
  1240.             yexpfct = exp;                                /* zuweisen                                    */
  1241.         }
  1242.  
  1243.     if ((plot->typ == D3) and                    /* Nur wenn 3d und nicht        */
  1244.             (plot->zmes != LIN))                    /* lineare Z-Achse ?                */
  1245.         if (plot->zmes == LOG)                    /* Nein, ev. log ?                    */
  1246.         {                                                                /* Ja                                                */
  1247.             zlogfct = log10;                            /* Also log Funktionen            */
  1248.             zexpfct = exp10;                            /* zuweisen                                    */
  1249.         }
  1250.         else                                                        /* kann nur ln sein                    */
  1251.         {
  1252.             zlogfct = log;                                /* Dann halt diese Funktion    */
  1253.             zexpfct = exp;                                /* zuweisen                                    */
  1254.         }
  1255. }
  1256.  
  1257. /****************************************************************
  1258. *                                                                                                                                *
  1259. *    Function : calcscale()                                                                                *
  1260. *                                                                                                                                *
  1261. *****************************************************************
  1262. *                                                                                                                                *
  1263. *         Input : void                                                                                                *
  1264. *                                                                                                                                *
  1265. *        Output : void                                                                                                *
  1266. *                                                                                                                                *
  1267. *****************************************************************
  1268. *                                                                                                                                *
  1269. *     Comment : CalcScale berechnet die automatische Skalierung        *
  1270. *                         für alle 2D und Niveau Darstellungen auf dem             *
  1271. *                         Bildschirm. Diese Funktion ist nicht mit der                *
  1272. *                         CalcStep Funktion zu verwechseln welche die                 *
  1273. *                         virtuelle Grösse des Bildschirmes berechnet.                *
  1274. *                         Diese Funktion berechnet nun die Werte für die            *
  1275. *                         Transformationsmatrix. Es wird der max. verfügbare    *
  1276. *                         Pixelbereich dividiert durch die Grösse des                *
  1277. *                         Gitters. Dadurch erhalten wir für jeden Pixel            *
  1278. *                         einen bestimmten virtuellen Wert.                                    *
  1279. *                                                                                                                                *
  1280. ****************************************************************/
  1281.  
  1282. void calcscale()
  1283. {
  1284.     int picrange;                                            /* verfügbarer Bildschirm        */
  1285.  
  1286.     picrange = plot->xpic2-plot->xpic1;
  1287.                                                                         /* x Range                                    */
  1288.     if (plot->xmes == LIN)                        /* LIN anders berechnen            */
  1289.     {
  1290.         xoffset = plot->xgridmin;                /* Start init. für trans2d    */
  1291.         xscale = picrange/(plot->xgridmax-xoffset);
  1292.                                                                         /* Skalierung berechnen            */
  1293.     }
  1294.     else                                                            /* LOG oder LN                            */
  1295.     {                                                                    /* dieselbe Berechnung aber    */
  1296.                                                                         /* über LOG() oder LN()            */
  1297.             xoffset = xlogfct(plot->xgridmin);
  1298.             xscale = picrange/(xlogfct(plot->xgridmax)-xoffset);
  1299.     }
  1300.  
  1301.     picrange = plot->ypic2-plot->ypic1;
  1302.                                                                         /* y Range                                    */
  1303.     if (plot->ymes == LIN)                        /* LIN anders berechnen            */
  1304.     {
  1305.         yoffset = plot->ygridmin;                /* Start init. für trans2d    */
  1306.         yscale = -picrange/(plot->ygridmax-yoffset);
  1307.                                                                         /* Skalierung berechnen            */
  1308.     }
  1309.     else
  1310.     {                                                                    /* LOG oder LN                            */
  1311.                                                                         /* dieselbe Berechnung aber    */
  1312.                                                                         /* über LOG() oder LN()            */
  1313.         yoffset = ylogfct(plot->ygridmin);
  1314.         yscale = -picrange/(ylogfct(plot->ygridmax)-yoffset);
  1315.     }
  1316. }
  1317.  
  1318.