IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 28, 2005, 8:27:19 AM (21 years ago)
Author:
eugene
Message:

added weight and type to lines, defined -noX option

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/kapa/graph/bDrawFuncs.c

    r5610 r5612  
    7171}
    7272
    73 // use the Bresenham line drawing technique
    74 void bDrawLine (double x1, double y1, double x2, double y2, int swapcoords) {
     73void bDrawTriOpen (double x1, double y1, double x2, double y2, double x3, double y3) {
     74
     75  bDrawLine (x1, y1, x2, y2);
     76  bDrawLine (x2, y2, x3, y3);
     77  bDrawLine (x3, y3, x1, y1);
     78
     79  return;
     80}
     81
     82void bDrawRectOpen (double x1, double y1, double x2, double y2) {
    7583
    7684  int X1, Y1, X2, Y2;
    77   int X, Y, dX, dY;
     85
     86  if (x1 > x2) SWAP (x1, x2);
     87  if (y1 > y2) SWAP (y1, y2);
     88
     89  X1 = MIN (MAX (ROUND (x1), 0), bBuffer[0].Nx - 1);
     90  X2 = MIN (MAX (ROUND (x2), 1), bBuffer[0].Nx);
     91
     92  Y1 = MIN (MAX (ROUND (y1), 0), bBuffer[0].Ny - 1);
     93  Y2 = MIN (MAX (ROUND (y2), 1), bBuffer[0].Ny);
     94
     95  bDrawLineHorizontal (X1, X2, Y1);
     96  bDrawLineHorizontal (X1, X2, Y2);
     97  bDrawLineVertical (X1, Y1, Y2);
     98  bDrawLineVertical (X2, Y1, Y2);
     99  return;
     100}
     101
     102void bDrawRectFill (double x1, double y1, double x2, double y2) {
     103
     104  int i;
     105  int X1, Y1, X2, Y2;
     106
     107  if (x1 > x2) SWAP (x1, x2);
     108  if (y1 > y2) SWAP (y1, y2);
     109
     110  X1 = MIN (MAX (ROUND (x1), 0), bBuffer[0].Nx - 1);
     111  X2 = MIN (MAX (ROUND (x2), 1), bBuffer[0].Nx);
     112
     113  Y1 = MIN (MAX (ROUND (y1), 0), bBuffer[0].Ny - 1);
     114  Y2 = MIN (MAX (ROUND (y2), 0), bBuffer[0].Ny);
     115
     116  for (i = Y1; i < Y2; i++) {
     117    bDrawLineHorizontal (X1, X2, i);
     118  }
     119  return;
     120}
     121
     122// identify the quadrant and draw the correct line
     123void bDrawLine (double x1, double y1, double x2, double y2) {
     124
     125  int FlipDirect, FlipCoords;
     126  int X1, Y1, X2, Y2, dX, dY;
    78127
    79128  /* rather than draw the line from float positions, we find the closest
     
    88137  dY = Y2 - Y1;
    89138
    90   // fprintf (stderr, "(%f,%f) - (%f,%f)\n", x1, y1, x2, y2);
    91   if (x1 > x2) {
    92     // fprintf (stderr, "flip direct\n");
    93     bDrawLine (x2, y2, x1, y1, swapcoords);
    94     return;
    95   }
    96   if (abs(dX) < abs(dY)) {
    97     // fprintf (stderr, "flip coords\n");
    98     bDrawLine (y1, x1, y2, x2, TRUE);
    99     return;
    100   }
    101 
    102   /* integer-only Bresenham line-draw version which is fast */
    103   {
    104     int e, e2;
    105 
    106     Y = Y1;
    107     e = 0;
    108     for (X = X1; X <= X2; X++) {
    109       if (swapcoords) {
    110         bDrawPoint (Y,X);
    111       } else {
    112         bDrawPoint (X,Y);
    113       }
    114       e += dY;
    115       e2 = 2 * e;
    116       if (e2 > dX) {
    117         Y++;
    118         e -= dX;
    119       }
    120       if (e2 < -dX) {
    121         Y--;
    122         e += dX;
    123       }
    124     }
    125   }
    126   return;
    127 }
    128 
    129 void bDrawRectOpen (int x1, int y1, int x2, int y2) {
    130 
    131   return;
    132 }
    133 
    134 void bDrawRectFill (int x1, int y1, int x2, int y2) {
    135 
    136   return;
    137 }
    138 
    139 void bDrawTriOpen (int x1, int y1, int x2, int y2, int x3, int y3) {
    140 
    141   return;
    142 }
    143 
    144 void bDrawTriFill (int x1, int y1, int x2, int y2, int x3, int y3) {
    145 
     139  FlipCoords = (abs(dX) < abs(dY));
     140  FlipDirect = FlipCoords ? (y1 > y2) : (x1 > x2);
     141
     142  if (!FlipDirect && !FlipCoords) bDrawLineWeight (X1, Y1, X2, Y2, FALSE);
     143  if ( FlipDirect && !FlipCoords) bDrawLineWeight (X2, Y2, X1, Y1, FALSE);
     144  if (!FlipDirect &&  FlipCoords) bDrawLineWeight (Y1, X1, Y2, X2, TRUE);
     145  if ( FlipDirect &&  FlipCoords) bDrawLineWeight (Y2, X2, Y1, X1, TRUE);
     146
     147  return;
     148}
     149
     150// draw a series of lines to give the line weight
     151void bDrawLineWeight (int X1, int Y1, int X2, int Y2, int swapcoords) {
     152
     153  int dN, dNs, dNe;
     154
     155  dNs = -0.5*(bWeight - 1);
     156  /* 0, 0, 0, -1, -1, -2, -2 */
     157
     158  dNe = +0.5*bWeight + 1;
     159  /* 1, 1, 2, 2, 2, 3, 3 */
     160
     161  for (dN = dNs; dN < dNe; dN++) {
     162    bDrawLineBresen (X1, Y1 + dN, X2, Y2 + dN, swapcoords);
     163  }
     164  return;
     165}
     166
     167// use the Bresenham line drawing technique
     168// integer-only Bresenham line-draw version which is fast
     169void bDrawLineBresen (int X1, int Y1, int X2, int Y2, int swapcoords) {
     170
     171  int X, Y, dX, dY;
     172  int e, e2;
     173  int N, DashOn;
     174
     175  dX = X2 - X1;
     176  dY = Y2 - Y1;
     177
     178  DashOn = TRUE;
     179
     180  Y = Y1;
     181  e = 0;
     182  for (X = X1, N = 0; X <= X2; X++, N++) {
     183    if (bType == 1) { DashOn = (N % 10) < 5; }
     184    if (bType == 2) { DashOn = (N % 6) < 3; }
     185    if (swapcoords) {
     186      if (DashOn) bDrawPoint (Y,X);
     187    } else {
     188      if (DashOn) bDrawPoint (X,Y);
     189    }
     190    e += dY;
     191    e2 = 2 * e;
     192    if (e2 > dX) {
     193      Y++;
     194      e -= dX;
     195    }
     196    if (e2 < -dX) {
     197      Y--;
     198      e += dX;
     199    }
     200  }
     201  return;
     202}
     203
     204void bDrawLineHorizontal (int X1, int X2, int Y) {
     205 
     206  int i;
     207
     208  for (i = X1; i < X2; i++) {
     209    bBuffer[0].pixels[Y][i] = bColor;
     210  }
     211  return;
     212}
     213
     214void bDrawLineVertical (int X, int Y1, int Y2) {
     215 
     216  int i;
     217
     218  for (i = Y1; i < Y2; i++) {
     219    bBuffer[0].pixels[i][X] = bColor;
     220  }
     221  return;
     222}
     223
     224void bDrawTriFill (double x1, double y1, double x2, double y2, double x3, double y3) {
     225
     226  bDrawTriOpen (x1, y1, x2, y2, x3, y3);
    146227  return;
    147228}
     
    181262}
    182263
     264// draw a series of circles to give line weight
     265void bDrawCircle (double xc, double yc, double radius) {
     266
     267  int dN, dNs, dNe;
     268
     269  dNs = -0.5*(bWeight - 1);
     270  /* 0, 0, 0, -1, -1, -2, -2 */
     271
     272  dNe = +0.5*bWeight + 1;
     273  /* 1, 1, 2, 2, 2, 3, 3 */
     274
     275  for (dN = dNs; dN < dNe; dN++) {
     276    bDrawCircle (xc, yc, radius + dN);
     277  }
     278  return;
     279}
     280
    183281// draw a pure circle 
    184 void bDrawCircle (double xc, double yc, double radius) {
     282void bDrawCircleSingle (double xc, double yc, double radius) {
    185283
    186284  int Xc, Yc, Radius;
     
    206304    bDrawPoint (Xc-y, Yc+x);
    207305    bDrawPoint (Xc-y, Yc-x);
     306
     307    if (d < 0) {
     308      // d = d + 4*x + 6;
     309      d = d + 8*x + 4;
     310    } else {
     311      // d = d + 4*(x-y) + 10;
     312      d = d + 8*(x-y) + 8;
     313      y--;
     314    }
     315    x++;
     316  }
     317}
     318
     319// draw a pure circle 
     320void bDrawCircleFill (double xc, double yc, double radius) {
     321
     322  int Xc, Yc, Radius;
     323  int x, y, d;
     324
     325  Xc = ROUND(xc);
     326  Yc = ROUND(yc);
     327  Radius = ROUND(radius);
     328
     329  x = 0;
     330  y = Radius;
     331
     332  // d = 3 - 2*Radius;
     333  d = 5 - 4*radius;
     334
     335  while (x <= y) {
     336    bDrawLineHorizontal (Xc-x, Xc+x, Yc+y);
     337    bDrawLineHorizontal (Xc-x, Xc+x, Yc-y);
     338    bDrawLineHorizontal (Xc-y, Xc+y, Yc+x);
     339    bDrawLineHorizontal (Xc-y, Xc+y, Yc-x);
    208340
    209341    if (d < 0) {
Note: See TracChangeset for help on using the changeset viewer.