Back to index

wims  3.65+svn20090927
output.c
Go to the documentation of this file.
00001 
00002 /*** OUTPUT.C ***/
00003 
00004 
00005 #include <stdio.h>
00006 
00007 #include "vdefs.h"
00008 
00009 extern int triangulate, plot, debug ;
00010 extern float ymax, ymin, xmax, xmin ;
00011 
00012 float pxmin, pxmax, pymin, pymax, cradius;
00013 
00014 void
00015 openpl(void)
00016     {
00017     }
00018 
00019 #pragma argsused
00020 void
00021 line(float ax, float ay, float bx, float by)
00022     {
00023     }
00024 
00025 #pragma argsused
00026 void
00027 circle(float ax, float ay, float radius)
00028     {
00029     }
00030 
00031 #pragma argsused
00032 void
00033 range(float pxmin, float pxmax, float pymin, float pymax)
00034     {
00035     }
00036 
00037 void
00038 out_bisector(Edge * e)
00039     {
00040     if (triangulate && plot && !debug)
00041         {
00042         line(e->reg[0]->coord.x, e->reg[0]->coord.y,
00043              e->reg[1]->coord.x, e->reg[1]->coord.y) ;
00044         }
00045     if (!triangulate && !plot && !debug)
00046         {
00047         printf("l %f %f %f\n", e->a, e->b, e->c) ;
00048         }
00049     if (debug)
00050         {
00051         printf("line(%d) %gx+%gy=%g, bisecting %d %d\n", e->edgenbr,
00052         e->a, e->b, e->c, e->reg[le]->sitenbr, e->reg[re]->sitenbr) ;
00053         }
00054     }
00055 
00056 void
00057 out_ep(Edge * e)
00058     {
00059     if (!triangulate && plot)
00060         {
00061         clip_line(e) ;
00062         }
00063     if (!triangulate && !plot)
00064         {
00065         printf("e %d", e->edgenbr);
00066         printf(" %d ", e->ep[le] != (Site *)NULL ? e->ep[le]->sitenbr : -1) ;
00067         printf("%d\n", e->ep[re] != (Site *)NULL ? e->ep[re]->sitenbr : -1) ;
00068         }
00069     }
00070 
00071 void
00072 out_vertex(Site * v)
00073     {
00074     if (!triangulate && !plot && !debug)
00075         {
00076         printf ("v %f %f\n", v->coord.x, v->coord.y) ;
00077         }
00078     if (debug)
00079         {
00080         printf("vertex(%d) at %f %f\n", v->sitenbr, v->coord.x, v->coord.y) ;
00081         }
00082     }
00083 
00084 void
00085 out_site(Site * s)
00086     {
00087     if (!triangulate && plot && !debug)
00088         {
00089         circle (s->coord.x, s->coord.y, cradius) ;
00090         }
00091     if (!triangulate && !plot && !debug)
00092         {
00093         printf("s %f %f\n", s->coord.x, s->coord.y) ;
00094         }
00095     if (debug)
00096         {
00097         printf("site (%d) at %f %f\n", s->sitenbr, s->coord.x, s->coord.y) ;
00098         }
00099     }
00100 
00101 void
00102 out_triple(Site * s1, Site * s2, Site * s3)
00103     {
00104     if (triangulate && !plot && !debug)
00105         {
00106         printf("%d %d %d\n", s1->sitenbr, s2->sitenbr, s3->sitenbr) ;
00107         }
00108     if (debug)
00109         {
00110         printf("circle through left=%d right=%d bottom=%d\n",
00111         s1->sitenbr, s2->sitenbr, s3->sitenbr) ;
00112         }
00113     }
00114 
00115 void
00116 plotinit(void)
00117     {
00118     float dx, dy, d ;
00119 
00120     dy = ymax - ymin ;
00121     dx = xmax - xmin ;
00122     d = ( dx > dy ? dx : dy) * 1.1 ;
00123     pxmin = xmin - (d-dx) / 2.0 ;
00124     pxmax = xmax + (d-dx) / 2.0 ;
00125     pymin = ymin - (d-dy) / 2.0 ;
00126     pymax = ymax + (d-dy) / 2.0 ;
00127     cradius = (pxmax - pxmin) / 350.0 ;
00128     openpl() ;
00129     range(pxmin, pymin, pxmax, pymax) ;
00130     }
00131 
00132 void
00133 clip_line(Edge * e)
00134     {
00135     Site * s1, * s2 ;
00136     float x1, x2, y1, y2 ;
00137 
00138     if (e->a == 1.0 && e->b >= 0.0)
00139         {
00140         s1 = e->ep[1] ;
00141         s2 = e->ep[0] ;
00142         }
00143     else
00144         {
00145         s1 = e->ep[0] ;
00146         s2 = e->ep[1] ;
00147         }
00148     if (e->a == 1.0)
00149         {
00150         y1 = pymin ;
00151         if (s1 != (Site *)NULL && s1->coord.y > pymin)
00152             {
00153              y1 = s1->coord.y ;
00154              }
00155         if (y1 > pymax)
00156             {
00157             return ;
00158             }
00159         x1 = e->c - e->b * y1 ;
00160         y2 = pymax ;
00161         if (s2 != (Site *)NULL && s2->coord.y < pymax)
00162             {
00163             y2 = s2->coord.y ;
00164             }
00165         if (y2 < pymin)
00166             {
00167             return ;
00168             }
00169         x2 = e->c - e->b * y2 ;
00170         if (((x1 > pxmax) && (x2 > pxmax)) || ((x1 < pxmin) && (x2 < pxmin)))
00171             {
00172             return ;
00173             }
00174         if (x1 > pxmax)
00175             {
00176             x1 = pxmax ;
00177             y1 = (e->c - x1) / e->b ;
00178             }
00179         if (x1 < pxmin)
00180             {
00181             x1 = pxmin ;
00182             y1 = (e->c - x1) / e->b ;
00183             }
00184         if (x2 > pxmax)
00185             {
00186             x2 = pxmax ;
00187             y2 = (e->c - x2) / e->b ;
00188             }
00189         if (x2 < pxmin)
00190             {
00191             x2 = pxmin ;
00192             y2 = (e->c - x2) / e->b ;
00193             }
00194         }
00195     else
00196         {
00197         x1 = pxmin ;
00198         if (s1 != (Site *)NULL && s1->coord.x > pxmin)
00199             {
00200             x1 = s1->coord.x ;
00201             }
00202         if (x1 > pxmax)
00203             {
00204             return ;
00205             }
00206         y1 = e->c - e->a * x1 ;
00207         x2 = pxmax ;
00208         if (s2 != (Site *)NULL && s2->coord.x < pxmax)
00209             {
00210             x2 = s2->coord.x ;
00211             }
00212         if (x2 < pxmin)
00213             {
00214             return ;
00215             }
00216         y2 = e->c - e->a * x2 ;
00217         if (((y1 > pymax) && (y2 > pymax)) || ((y1 < pymin) && (y2 <pymin)))
00218             {
00219             return ;
00220             }
00221         if (y1> pymax)
00222             {
00223             y1 = pymax ;
00224             x1 = (e->c - y1) / e->a ;
00225             }
00226         if (y1 < pymin)
00227             {
00228             y1 = pymin ;
00229             x1 = (e->c - y1) / e->a ;
00230             }
00231         if (y2 > pymax)
00232             {
00233             y2 = pymax ;
00234             x2 = (e->c - y2) / e->a ;
00235             }
00236         if (y2 < pymin)
00237             {
00238             y2 = pymin ;
00239             x2 = (e->c - y2) / e->a ;
00240             }
00241         }
00242     line(x1,y1,x2,y2);
00243     }
00244