Changeset 5612 for trunk/Ohana/src/kapa/graph/bDrawFuncs.c
- Timestamp:
- Nov 28, 2005, 8:27:19 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/kapa/graph/bDrawFuncs.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/kapa/graph/bDrawFuncs.c
r5610 r5612 71 71 } 72 72 73 // use the Bresenham line drawing technique 74 void bDrawLine (double x1, double y1, double x2, double y2, int swapcoords) { 73 void 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 82 void bDrawRectOpen (double x1, double y1, double x2, double y2) { 75 83 76 84 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 102 void 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 123 void bDrawLine (double x1, double y1, double x2, double y2) { 124 125 int FlipDirect, FlipCoords; 126 int X1, Y1, X2, Y2, dX, dY; 78 127 79 128 /* rather than draw the line from float positions, we find the closest … … 88 137 dY = Y2 - Y1; 89 138 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 151 void 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 169 void 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 204 void 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 214 void 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 224 void bDrawTriFill (double x1, double y1, double x2, double y2, double x3, double y3) { 225 226 bDrawTriOpen (x1, y1, x2, y2, x3, y3); 146 227 return; 147 228 } … … 181 262 } 182 263 264 // draw a series of circles to give line weight 265 void 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 183 281 // draw a pure circle 184 void bDrawCircle (double xc, double yc, double radius) {282 void bDrawCircleSingle (double xc, double yc, double radius) { 185 283 186 284 int Xc, Yc, Radius; … … 206 304 bDrawPoint (Xc-y, Yc+x); 207 305 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 320 void 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); 208 340 209 341 if (d < 0) {
Note:
See TracChangeset
for help on using the changeset viewer.
