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 / NivL2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-15  |  23.5 KB  |  605 lines

  1. /****************************************************************
  2. *                                                                                                                                *
  3. *     Filename : NivL2.c                                                                                        *
  4. *                                                                                                                                *
  5. *****************************************************************
  6. *                                                                                                                                *
  7. *        Comment : Diese Datei beinhaltet die verschiedenen                    *
  8. *                            Funktionen für die Darstellung der Niveaukurven.    *
  9. *                                                                                                                                *
  10. *                                Funktionen                                                        *
  11. *                            ==========                                                        *
  12. *                                                                                                                                *
  13. *            DrawNivCurves()            zeichnet Niveaukurven                                    *
  14. *            CalcRect()                    berechnet ein Rechteck                                *
  15. *            CheckCorner()                kontrolliert zugehörige Ecke                    *
  16. *            CheckNiv()                    zählt verschiedene Niveaus                        *
  17. *            CalcStyle()                    berechnet nächstes Muster                            *
  18. *                                                                                                                                *
  19. *                Rev : V1.0                                                                                            *
  20. *                                                                                                                                *
  21. *        History : V1.0 erstellen dieses Files                            01/01/90    *
  22. *                                                                                                                                *
  23. *                Doc : Plotlibrary User's Guide                                                    *
  24. *                                                                                                                                *
  25. *             Bugs : keine bekannten                                                                        *
  26. *                                                                                                                                *
  27. *            Autor : Oesch Silvano                                                                            *
  28. *                                                                                                                                *
  29. *            Datum : 01/01/90                                                                                    *
  30. *                                                                                                                                *
  31. ****************************************************************/
  32.  
  33. /****************************************************************
  34. *                                                                                                                                *
  35. *    allgemeine Includedateien                                                                            *
  36. *                                                                                                                                *
  37. ****************************************************************/
  38.  
  39. #include <math.h>
  40.  
  41. /****************************************************************
  42. *                                                                                                                                *
  43. *    Plotlibrary Includedateien                                                                        *
  44. *                                                                                                                                *
  45. ****************************************************************/
  46.  
  47. #include "Plot.h"
  48. #include "PlotL2.h"
  49. #include "SuppL2.h"
  50. #include "DispL2.h"
  51. #include "NivL2.h"
  52.  
  53. /****************************************************************
  54. *                                                                                                                                *
  55. *    Globale statische Variablen                                                                        *
  56. *                                                                                                                                *
  57. ****************************************************************/
  58.  
  59. static int    xpicmin,                                /* Grenzwerte für xmin,xmax    */
  60.                         xpicmax,                                /* ymin,ymax                                */
  61.                         ypicmin,
  62.                         ypicmax;
  63.  
  64. static int    bxs,                                        /* Rechteckdim. für die            */
  65.                         bys;                                        /* Beschriftung                            */
  66.  
  67. /****************************************************************
  68. *                                                                                                                                *
  69. *    externe Variablen                                                                                            *
  70. *                                                                                                                                *
  71. ****************************************************************/
  72.  
  73. extern struct Plot *plot;
  74. extern int plerr;
  75.  
  76. /****************************************************************
  77. *                                                                                                                                *
  78. *    Function : drawnivcurves()                                                                        *
  79. *                                                                                                                                *
  80. *****************************************************************
  81. *                                                                                                                                *
  82. *         Input : void                                                                                                *
  83. *                                                                                                                                *
  84. *        Output : int returnset    allg Rückgabewert                                        *
  85. *                            != FALSE        alles klar                                                    *
  86. *                            == FALSE            Fehler                                                            *
  87. *                                                                                                                                *
  88. *****************************************************************
  89. *                                                                                                                                *
  90. *     Comment : Diese Funktion zeichnet und beschriftet alle                *
  91. *                         Niveaukurven. Das Vorgehen dieser komplexen                *
  92. *                         Funktion ist vereinfacht in dem nachfolgenden            *
  93. *                         Ablauf erklärt. Da diese Funktion ein Flächen-            *
  94. *                         clipping durchführen muss, sollte eigentlich                *
  95. *                         der Sutherland-Hodgman Algorithmus verwendet                *
  96. *                         werden. Dieser Algorithmus ist jedoch sehr rechen-    *
  97. *                         intensiv und nicht einfach zu programmieren. Aus        *
  98. *                         Zeitgründen wurde auf den Cohen-Sutherland                    *
  99. *                         Algorithmus zurückgegriffen. Mithilfe des Rück-        *
  100. *                         gabewertes könnte so ein einfaches und schnelles        *
  101. *                         Flächenclipping durchgeführt werden. Für eine            *
  102. *                         nähere Beschreibung des Clippings wird auf die            *
  103. *                         Diplomarbeit verwiesen.                                                        *
  104. *                                                                                                                                *
  105. ****************************************************************/
  106.  
  107. int drawnivcurves()
  108. {
  109.  
  110.     register GPT    *iarray1,                            /* aktueller Punkt                */
  111.                                 *iarray2;                            /* vorhergehender Punkt        */
  112.  
  113.     GPT     *iarray;                                            /* Speicher Arraystart        */
  114.  
  115.     int        set,set1,                                            /* Startwertflags                    */
  116.                 count,                                                /* Schleifenzähler                */
  117.                 ptc,                                                    /* Anzahl Punkte Polygon    */
  118.                 tris,                                                    /* Translation Status            */
  119.                 xs,xe,xe1,                                        /* X-Koordinaten                    */
  120.                 ys,ye,ye1,                                        /* Y-Koordinaten                    */
  121.                 returnset=TRUE,                                /* allg. Rückgabewert            */
  122.                 fill,                                                    /* Polygon Rückgabewert        */
  123.                 beschx,                                                /* horiz. Beschriftung        */
  124.                 len,                                                    /* länge des Niveautextes    */
  125.                 oldcol=NULL;                                    /* Farbenspeicher                    */
  126.  
  127.     char     cstat,                                                /* Clipping Status                */
  128.                 cstat1,                                                /* Clipp Status Speicher    */
  129.                 buffer[20];                                        /* für Niveautext                    */
  130.  
  131.     DATA     *x,*y,                                                /* X und Y Wert                        */
  132.                 *array,                                                /* Zeiger auf Daten                */
  133.                 value;                                                /* Niveauwert                            */
  134.  
  135.     struct Curve *curve;                                /* Kurvenzeiger                        */
  136.  
  137. /****************************************************************
  138. *                                                                                                                                *
  139. *    Das zeichnen der Niveaukurven ist nicht mehr so einfach wie        *
  140. *    dass der 2d-Kurven. Der Hauptunterschied liegt darin, das            *
  141. *    für jedes Niveau eine Fläche und keine Linie gezeichnet wird.    *
  142. *    Das nachfolgende Ablaufdiagramm zeigt vereinfacht die                    *
  143. *    verschiedenen Abschnitte auf, welche für eine Niveau-                    *
  144. *    Darstellung benötigt werden.                                                                    *
  145. *                                                                                                                                *
  146. *    Bis alle Niveaus gezeichnet                                                                        *
  147. *        hole Integerarray                                                                                        *
  148. *        Bis alle Werte dieses Niveau gezeichnet                                            *
  149. *            Konvertieren des Punktes                                                                    *
  150. *            Wenn Startwert berechnet                                                                    *
  151. *                Wenn clipping                                                                                        *
  152. *                    clippen                                                                                                *
  153. *                    status Flächenclippen                                                                    *
  154. *                        Ecke zuweisen                                                                                *
  155. *                    status line                                                                                        *
  156. *                        Wenn Startwert nicht vorhanden diesen setzen                *
  157. *                      Evt doch noch Flächenclippen                                                *
  158. *                        Punkt addieren                                                                            *
  159. *                else                                                                                                        *
  160. *                    Wenn Startwert nicht vorhanden diesen setzen                    *
  161. *                    Neuer Punkt addieren                                                                    *
  162. *            Startwert auf Endwert setzen                                                            *
  163. *        Berechne evt letzten Punkt des Polygones                                        *
  164. *        Zeichne Polygon                                                                                            *
  165. *        Beschrifte Niveau wenn noch nicht vorhanden                                    *
  166. *    zurück mit dem Status dieser Funktion                                                    *
  167. *                                                                                                                                *
  168. ****************************************************************/
  169.  
  170.     trans2d(&plot->xmin,&plot->ymin,&xpicmin,&ypicmin);
  171.     trans2d(&plot->xmax,&plot->ymax,&xpicmax,&ypicmax);
  172.                                                                             /* init. der Grenzwerte        */
  173.     bxs = (RECTSIZE)*plot->xtext;                /* Länge des Rechteckes        */
  174.     bys = 3*plot->ytext/2;                            /* Höhe des Rechteckes        */
  175.     beschx = plot->xpic1;                                /* Start der Beschriftung    */
  176.     curve = plot->first;                                /* erste Kurve                        */
  177.     value = curve->zmin+1;                            /* Value sicher ungleich    */
  178.                                                                             /* erstem Niveau                    */
  179.     while (curve != NULL)                                /* Für alle Kurven                */
  180.     {
  181.         set = FALSE;                                            /* Für jede Kurve neu            */
  182.         set1 = FALSE;                                            /* setzten                                */
  183.         cstat1 = 0x00;
  184.  
  185.         ptc = curve->count+2;                            /* Grösse des Feldes            */
  186.         if (plot->clipp == CLIPP)                    /* berechnen, auch für        */
  187.             ptc = 5*ptc/3;                                    /* clipping                                */
  188.         iarray = malloc(ptc*valsize()*sizeof(GPT));
  189.         if (iarray == NULL)                                /* speicher bekommen            */
  190.         {                                                                    /* Nein                                        */
  191.             seterror(GRAPHMEM);                            /* Fehler setzten und            */
  192.             return(FALSE);                                    /* zurück                                    */
  193.         }
  194.  
  195.         iarray1 = iarray;                                    /* Arraypointer init.            */
  196.         iarray2 = iarray;
  197.         if (value != curve->zmin)                    /* Farbe und Muster für        */
  198.         {                                                                    /* neues Niveau berechnen    */
  199.             calccolor(curve->color);
  200.             calcstyle();
  201.         }
  202.         else
  203.             SetFgColor(oldcol);                            /* Farbe rücksetzten            */
  204.  
  205.  
  206.         array = curve->val;                                /* Datenzeiger init.            */
  207.         for (count = 0;count<curve->count;count++)
  208.         {                                                                    /* für alle Datenpaare        */
  209.             x = array++;                                        /* x und y zuweisen                */
  210.             y = array++;                                        /* immer noch DATA                */
  211.  
  212.             tris = trans2d(x,y,&xe,&ye);        /* und konvertieren                */
  213.             if (tris != TRUE)                                /* Fehler                                    */
  214.             {                                                                /* Ja,dann neue Grenz-        */
  215.                 if ( tris & XTRANS)                        /* koordinaten zuweisen        */
  216.                     xe = plot->xpic1;                        /* ACHTUNG! Darstellung        */
  217.                 if ( tris & YTRANS)                        /* stimmt nicht 100%            */
  218.                     ye = plot->ypic2;
  219.             }
  220.  
  221.             if (set == TRUE)                                /* Startwert gesetzt            */
  222.             {                                                                /* Ja                                            */
  223.                 if (plot->clipp == CLIPP)            /* nur bei clippen                */
  224.                 {                                                            /* der komplexe Prozess        */
  225.                     xe1 = xe;                                        /* speichern der orginal-    */
  226.                     ye1 = ye;                                        /* endkoordinaten                    */
  227.                     cstat = doclipp(&xs,&ys,&xe1,&ye1);
  228.  
  229. /****************************************************************
  230. *                                                                                                                                *
  231. *    Die Clipping Routine liefert nur dann einen Status von NULL,    *
  232. *    wenn die Linie gezeichnet werden muss. Ansonsten ist dieser        *
  233. *    ungleich NULL. Dieser Status wird nun mit dem vorhergehenden    *
  234. *    Status auf gleichheit kontrolliert. Nur wenn dieser Vergleich    *
  235. *    negativ ausfällt, d.h. die Seite wurde gewechselt, muss die        *
  236. *    dazwischenliegende Ecke gezeichnet werden.                                        *
  237. *                                                                                                                                *
  238. ****************************************************************/
  239.  
  240.                     if (cstat)                                    /* Status gegeben                    */
  241.                     {                                                        /* also clippen                        */
  242.                         if ((cstat1) and                    /* vorhergehender gesetzt    */
  243.                                 (cstat != cstat1))        /* und ungleich                        */
  244.                         {                                                    /* dann Ecke zeichnen            */
  245.                             switch (cstat | cstat1)    /* welcher Seitenwechsel    */
  246.                             {
  247.                                 case (C_L | C_B):            /* unten links                        */
  248.                                     *iarray1++ = plot->xpic1;
  249.                                     *iarray1++ = plot->ypic2;
  250.                                     break;
  251.                                 case (C_L | C_T):            /* oben links                            */
  252.                                     *iarray1++ = plot->xpic1;
  253.                                     *iarray1++ = plot->ypic1;
  254.                                     break;
  255.                                 case (C_R | C_B):            /* unten rechts                        */
  256.                                     *iarray1++ = plot->xpic2;
  257.                                     *iarray1++ = plot->ypic2;
  258.                                     break;
  259.                                 case (C_R | C_T):            /* oben rechts                        */
  260.                                     *iarray1++ = plot->xpic2;
  261.                                     *iarray1++ = plot->ypic1;
  262.                                     break;
  263.                             }
  264.                             iarray2 +=2;
  265.                         }
  266.                         cstat1 = cstat;                        /* Status speichern                */
  267.                     }
  268.                     else                                                /* also kein spez. clipp.    */
  269.                     {
  270.                         cstat1 = 0x00;                        /* löschen alter Status        */
  271.                         if (set1 == FALSE)                /* Start schon gesetzt ?    */
  272.                         {                                                    /* Nein, dann schreibe        */
  273.                             *iarray1++ = xs;                /* diese Werte in das            */
  274.                             *iarray1++ = ys;                /* Array                                    */
  275.                             set1 = TRUE;                        /* Startwert gesetzt            */
  276.                         }
  277.  
  278. /****************************************************************
  279. *                                                                                                                                *
  280. *    Wenn die gespeicherten Startwerte ungleich den eff.                        *
  281. *    Startwerten sind, müssen diese die Startwerte in das Array        *
  282. *    eingefügt werden. Dies ist dann der Fall, wenn xs1 bzw. ys1        *
  283. *    geclippt wurden und xs und ys auch. Wenn nun der Unterschied    *
  284. *    zwischen diesen Werten grösser gleich ein Punkt ist, dann            *
  285. *    muss dieser Punkt zusätzlich eingefügt werden.                                *
  286. *                                                                                                                                *
  287. ****************************************************************/
  288.  
  289.                         if ((iarray2[0] != xs) or (iarray2[1] != ys))
  290.                         {                                                    /* Punkte ungleich                */
  291.                             *iarray1++ = xs;                /* dann speichern dieser    */
  292.                             *iarray1++ = ys;                /* Werte                                    */
  293.                             iarray2 +=2;
  294.                         }
  295.  
  296.                         *iarray1++ = xe1;                    /* Endwerte in das Array    */
  297.                         *iarray1++ = ye1;                    /* eintragen                            */
  298.                         iarray2 +=2;
  299.                     }
  300.                 }
  301.                 else                                                    /* kein Clipping                    */
  302.                 {
  303.                     if (set1==FALSE)                        /* Startwert gesetzt            */
  304.                     {                                                        /* Nein                                        */
  305.                         *iarray1++ = xs;                    /* Also Startwerte                */
  306.                         *iarray1++ = ys;                    /* speichern und Flag            */
  307.                         set1 = TRUE;                            /* setzten                                */
  308.                     }
  309.                     *iarray1++ = xe;                        /* Endwerte speichern            */
  310.                     *iarray1++ = ye;
  311.                 }
  312.             }
  313.             xs = xe;                                                /* Startwerte auf orginal    */
  314.             ys = ye;                                                /* Endwerte setzen                */
  315.             set = TRUE;                                            /* und Flag setzen                */
  316.         }
  317.  
  318. /****************************************************************
  319. *                                                                                                                                *
  320. *    Ab dieser Stelle ist das Polygon mit den vorhandenen Daten        *
  321. *    berechnet worden. Es geht jetzt darum, ein evt. nicht                    *
  322. *    geschlossenes Polygon über den dazugehörigen Ecken oder             *
  323. *    Kante zu schliessen. Der Zustand eines offenen Polygones ist    *
  324. * normalerweise nicht legal. Es kann jedoch vorkommen, wenn            *
  325. *    ein Niveau abgetastet wird, dass dies nur in einem Bereich        *
  326. *    erfolgt. Danach ist ein offener Zustand möglich und dieser        *
  327. *    wird hier beseitigt.                                                                                    *
  328. *                                                                                                                                *
  329. ****************************************************************/
  330.  
  331.         xs = iarray[0];                                        /* hole 1. Koordinate            */
  332.         ys = iarray[1];
  333.  
  334.         if (plot->clipp == CLIPP)                    /* Wenn geclippt, hole        */
  335.         {                                                                    /* letzte Koordinate            */
  336.             xe = iarray2[0];
  337.             ye = iarray2[1];
  338.         }
  339.  
  340.         if ((xs != xe) or (ys != ye))            /* sind die Punkte gleich    */
  341.         {                                                                    /* Nein, es ist offen            */
  342.             if ((xs != xe) and                            /* sind x-werte und             */
  343.                     (ys != ye))                                    /* y-werte ungleich                */
  344.             {                                                                /* dann muss es Ecke sein */
  345.                 switch(checkcorner(xs,ys,xe,ye))
  346.                 {                                                            /* welche ist es denn            */
  347.                     case TOP_LEFT:                            /* die entsprechenden            */
  348.                         *iarray1++ = xpicmin;            /* min- bzw. max-werte        */
  349.                         *iarray1++ = ypicmax;            /* werden in das Array        */
  350.                         break;                                        /* hinzugefügt.                        */
  351.                     case BOT_LEFT:                            /* Am Ende kommt noch die    */
  352.                         *iarray1++ = xpicmin;            /* Startkoordinate für        */
  353.                         *iarray1++ = ypicmin;            /* alle dre Fälle hinzu.    */
  354.                         break;
  355.                     case TOP_RIGHT:
  356.                         *iarray1++ = xpicmax;
  357.                         *iarray1++ = ypicmax;
  358.                         break;
  359.                     case BOT_RIGHT:
  360.                         *iarray1++ = xpicmax;
  361.                         *iarray1++ = ypicmin;
  362.                         break;
  363.                 }
  364.                 *iarray1++ = xs;                            /* auch für die Kanten-        */
  365.                 *iarray1++ = ys;                            /* fälle                                    */
  366.             }
  367.         }
  368.  
  369. /****************************************************************
  370. *                                                                                                                                *
  371. *    Nun ist alles berechnet und gespeichert in einem Array.                *
  372. *    Bevor nun das Polygon gezeichnet werden kann, muss die                *
  373. *    Anzahl der Koordinaten bestimmt werden. Danach wird es                *
  374. *    gezeichnet und beschriftet. Für jedes Niveau wird am unteren    *
  375. *    Bildrand ein kleines Rechteck mit dem entsprechenden Muster        *
  376. *    gezeichnet. In der mitte diese Rechteckes steht dann der            *
  377. *    Niveauwert.    Die Beschriftung erfolgt jedoch nur dann, wenn        *
  378. *    der alte Niveauwert nicht mit den aktuellen übereinstimmt.        *
  379. *                                                                                                                                *
  380. ****************************************************************/
  381.  
  382.         ptc = (iarray1 - iarray)/valsize();
  383.                                                                             /* Berechne Anzahl Punkte    */
  384.         fill = FillPolyLine(ptc,iarray);    /* und zeichne es                    */
  385.         if (fill == FALSE)                                /* hat es funktioniert        */
  386.         {                                                                    /* Nein                                        */
  387.             seterror(GRAPHFILL);                        /* Fehler                                    */
  388.             setreturn(FALSE);
  389.             free(iarray);                                        /* speicher freigeben            */
  390.             break;                                                    /* und WHILE verlassen        */
  391.         }
  392.  
  393.         if (value != curve->zmin)                    /* beschriften ?                    */
  394.         {                                                                    /* Ja                                            */
  395.             value = curve->zmin;                        /* akt. Wert speichern        */
  396.             len = sprintf(buffer,"%.4lg",value);
  397.                                                                             /* Niveauwert konv.                */
  398.             calcrect(beschx,plot->cpt+plot->yht,len);
  399.                                                                             /* und Rechteck zeichnen    */
  400.             oldcol = GetFgColor();                    /* speichern von color        */
  401.             SetFgColor(TEXTCOL);                        /* und für Text setzten        */
  402.             printtextabs(    buffer,                        /* Wert schreiben                    */
  403.                                         beschx+bxs/2,
  404.                                         plot->cpt+plot->yht/2,
  405.                                         T_CX|T_T);
  406.             beschx += bxs;                                    /* Beschriftungswert            */
  407.             if (beschx > plot->xpic2-bxs)        /* am Ende einer Teile        */
  408.             {                                                                /* Ja                                            */
  409.                 beschx = plot->xpic1;                    /* dann nächste Zeile            */
  410.                 plot->cpt += bys+plot->yht;        /* nehmen                                    */
  411.             }
  412.         }
  413.         free(iarray);                                            /* Array freigeben                */
  414.         curve = curve->next;                            /* und nächste Kurve            */
  415.     }                                                                        /* Ende von WHILE                    */
  416.     return(returnset);                                    /* endlich fertig                    */
  417. }
  418.  
  419. /****************************************************************
  420. *                                                                                                                                *
  421. *    Function : calcrect()                                                                                    *
  422. *                                                                                                                                *
  423. *****************************************************************
  424. *                                                                                                                                *
  425. *         Input : x,y                                                                                                *
  426. *                            int x                                obere                                                    *
  427. *                            int y                                    linke Ecke                                    *
  428. *                                                                                                                                *
  429. *        Output : void                                                                                                *
  430. *                                                                                                                                *
  431. *****************************************************************
  432. *                                                                                                                                *
  433. *     Comment : CalcRect berechnet die Koordinaten der                            *
  434. *                         Beschriftungsrechtecke und schreibt diese in das        *
  435. *                         Koordinatenarray Rect. Danach wird das Rechteck        *
  436. *                         mit der gleichen Farbe und dem gleichen Muster            *
  437. *                         gezeichnet.                                                                                *
  438. *                                                                                                                                *
  439. ****************************************************************/
  440.  
  441. static void calcrect(x,y,len)
  442. int    x,
  443.         y,
  444.         len;
  445. {
  446.  
  447.     int transa[] =                                        /* Koordinatenpunkte                */
  448.             {
  449.                 0,0,1,0,1,1,0,1,0,0
  450.             },
  451.             i,j,                                                    /* Schleifenzähler                    */
  452.             size,
  453.             rsize;
  454.     GPT    rect[10];                                            /* Koordinatenarray                    */
  455.  
  456.     size = (len+2)*plot->xtext;
  457.     rsize = (bxs-size)/2;
  458.  
  459.     for (j=0;j<2;j++)
  460.     {
  461.         for (i=0;i<10;i+=2)                                /* 4+Startpunkt                            */
  462.         {
  463.             rect[i] = x+transa[i]*rsize+j*(rsize+size);
  464.                                                                             /* X-Koordinate                            */
  465.             rect[i+1] = y+transa[i+1]*bys;    /* Y-Koordinate                            */
  466.         }
  467.         FillPolyLine(5,rect);                            /* und zeichnen                            */
  468.     }
  469.     DrawRectangle(x+rsize,y,x+rsize+size,y+bys);
  470. }
  471.  
  472. /****************************************************************
  473. *                                                                                                                                *
  474. *    Function : CheckCorner()                                                                            *
  475. *                                                                                                                                *
  476. *****************************************************************
  477. *                                                                                                                                *
  478. *         Input : xs,ys,xe,ye                                                                                *
  479. *                            int xs                        X Startkoordinate                                *
  480. *                            int ys                        Y Startkoordinate                                *
  481. *                            int xe                        X Endkoordinate                                    *
  482. *                            int ye                        Y Endkoordinate                                    *
  483. *                                                                                                                                *
  484. *        Output : int corner                    zugehörige Ecke                                    *
  485. *                                                                                                                                *
  486. *****************************************************************
  487. *                                                                                                                                *
  488. *     Comment : Diese Funktion berechnet die zugehörige Ecke einer    *
  489. *                         Niveaukurve wenn diese nicht geschlossen vorhanden    *
  490. *                         ist. Normalerweise muss eine geschlossen Kurve            *
  491. *                         vorhanden sein. Wenn jedoch eine Kurve bei den            *
  492. *                         min- oder maxwerten beginnt oder aufhört, kann            *
  493. *                         diese Kurve nicht geschlossen sein. Es wird hier        *
  494. *                         dann die entsprechende Flächenecke gesucht.                *
  495. *                         Danach kann diese diese Ecke in die Fläche ein-        *
  496. *                         gefügt werden. Es ist also zu beachten, dass nicht    *
  497. *                         geschlossene Kurven immer über eine Ecke verbunden    *
  498. *                         werden. Dadurch kann es zu einer nicht korrekten        *
  499. *                         Darstellung kommen.                                                                *
  500. *                         Weiter muss das Integerarray für diese                         *
  501. *                         zusätzlichen Punkte ( 2 ) vorbereitet sein.                *
  502. *                                                                                                                                *
  503. ****************************************************************/
  504.  
  505. static int checkcorner(xs,ys,xe,ye)
  506. int xs,ys,xe,ye;
  507. {
  508.     int temp,                                                    /* Zwischenspeicher                    */
  509.             returnset;                                        /* all. Rückgabewert                */
  510.  
  511.     if (xs > xe)                                            /* Von einer Seite her            */
  512.     {                                                                    /* betrachten                                */
  513.         swap(xs,xe,temp);                                /* tausche die Koordinaten    */
  514.         swap(ys,ye,temp);
  515.     }
  516.  
  517.     if (xs <= xpicmin)                                /* linke Seite ?                        */
  518.         if (ye >= ypicmin)                            /* untere Seite ?                        */
  519.             setreturn(BOT_LEFT);                    /* setzte Ecke                            */
  520.         else                                                        /* sonst                                        */
  521.             setreturn(TOP_LEFT);                    /* obere Ecke                                */
  522.     else                                                            /* also rechte Seite                */
  523.         if (ys >= ypicmin)                            /* untere Seite                            */
  524.             setreturn(BOT_RIGHT);                    /* setzte Ecke                            */
  525.         else                                                        /* sonst                                        */
  526.             setreturn(TOP_RIGHT);                    /* obere Ecke                                */
  527.     return(returnset);                                /* und zurück                                */
  528. }
  529.  
  530. /****************************************************************
  531. *                                                                                                                                *
  532. *    Function : checkniv()                                                                                    *
  533. *                                                                                                                                *
  534. *****************************************************************
  535. *                                                                                                                                *
  536. *         Input : void                                                                                                *
  537. *                                                                                                                                *
  538. *        Output : int niveaus            Anzahl verschiedener Niveaus            *
  539. *                                                                                                                                *
  540. *****************************************************************
  541. *                                                                                                                                *
  542. *     Comment : Diese Funktion zählt die verschiedenen Niveau            *
  543. *                         welche im Speicher geladen sind. Der Niveauwert        *
  544. *                         wird beim Laden der Daten in den zmin Wert                    *
  545. *                         geschrieben.                                                                                *
  546. *                                                                                                                                *
  547. ****************************************************************/
  548.  
  549. int checkniv()
  550. {
  551.     DATA value;                                                /* Niveauwert                                */
  552.     int count = 1;                                        /* Niveaucount                            */
  553.     struct Curve *curve;                            /* Kurvenzeiger                            */
  554.  
  555.     curve = plot->first;                            /* Erste Kurve                            */
  556.     value = curve->zmin;                            /* Wert der ersten Kurve        */
  557.     while (curve != NULL)                            /* solange Kurven vorhanden    */
  558.     {
  559.         if (curve->zmin != value)                /* neuer Wert ?                            */
  560.         {                                                                /* Ja                                                */
  561.             value = curve->zmin;                    /* Neuer Wert zuweisen            */
  562.             count++;                                            /* und Zähler erhöhen                */
  563.         }
  564.         curve = curve->next;                        /* nächste Kurve                        */
  565.     }
  566.     return(count);                                        /* zurück mit Zähler                */
  567. }
  568.  
  569. /****************************************************************
  570. *                                                                                                                                *
  571. *    Function : calcstyle()                                                                                *
  572. *                                                                                                                                *
  573. *****************************************************************
  574. *                                                                                                                                *
  575. *         Input : void                                                                                                *
  576. *                                                                                                                                *
  577. *        Output : void                                                                                                *
  578. *                                                                                                                                *
  579. *****************************************************************
  580. *                                                                                                                                *
  581. *     Comment : Diese Funktion berechnet das nächste verfügbare        *
  582. *                         Füllmuster. In der Styletab sind die gewünschten        *
  583. *                         Muster aufgeführt welche angewählt werden können.    *
  584. *                         Wenn kein Muster mehr vorhanden ist, dann wird            *
  585. *                         wieder bei dem ersten Muster begonnen.                            *
  586. *                                                                                                                                *
  587. ****************************************************************/
  588.  
  589. static void calcstyle()
  590. {
  591.  
  592.     int styletab[5] =                                    /* Mustertabelle                        */
  593.     {    4,5,7,8,10 };
  594.  
  595.     if (plot->style == NOSTYLE)                /* keine füllen erwünscht        */
  596.         SetFillStyle(0);                                /* setzte NOFILL                        */
  597.     else                                                            /* sonst berechne neues            */
  598.     {                                                                    /* Muster                                        */
  599.         if (plot->style > 4)                        /* letztes Muster erreicht    */
  600.             plot->style = 0;                            /* Ja, dann von neuem                */
  601.         SetFillStyle(styletab[plot->style++]);
  602.     }                                                                    /* setzte Muster                        */
  603. }
  604.  
  605.