diff options
author | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-12-06 06:14:20 -0500 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@l3000.localdomain> | 2010-12-20 10:48:51 -0500 |
commit | db4f36c2a6279de219520d063c1d643d150fcfa5 (patch) | |
tree | 5e301377738695114a6282aef504faa1c6423a72 | |
parent | 8766c7268a4bba4d35d16a4ce94938e187052b68 (diff) |
Convert yi to be a sample number
-rw-r--r-- | dda.c | 58 |
1 files changed, 45 insertions, 13 deletions
@@ -7,6 +7,12 @@ #define N_STEPS (4) #define STEP (1/((double)N_STEPS)) +#define N_GRID_X 3 +#define N_GRID_Y 3 + +#define BIG_STEP_Y 0.5 +#define SMALL_STEP_Y 0.25 +#define FIRST_STEP_Y 0.125 static double next_sample_x (double x) @@ -30,9 +36,30 @@ next_sample_x (double x) } static double +sample_to_pos (int y) +{ + return (((unsigned)y) >> 8) + (y & 0xff) * SMALL_STEP_Y + FIRST_STEP_Y; +} + +static int next_sample_y (double y) { - return next_sample_x (y); + int i = floor (y); + int sno = floor ((y - i - FIRST_STEP_Y) / SMALL_STEP_Y) + 1; + int r; + + if (sno == N_GRID_X) + sno++; + + if (sno > N_GRID_X) + { + sno -= (N_GRID_X + 1); + i++; + } + + r = (i << 8) | sno; + + return r; } static double @@ -53,12 +80,6 @@ sample_step_x_backward (double x) return 0.25; } -static double -sample_step_y (double y) -{ - return sample_step_x_forward (y); -} - static void dda (test_data_t *testdata) { @@ -70,9 +91,9 @@ dda (test_data_t *testdata) double dx = (x1 - x0); double dy = (y1 - y0); - double yi = next_sample_y (y0); + int yi = next_sample_y (y0); double xi = next_sample_x (x0); - double e = (xi - x0) * dy - (yi - y0) * dx; + double e = (xi - x0) * dy - (sample_to_pos (yi) - y0) * dx; #if 0 printf ("= = = = %f %f %f %f = = = = \n", x0, y0, x1, y1); @@ -104,14 +125,25 @@ dda (test_data_t *testdata) } if (testdata->points[i++] != xi || - testdata->points[i++] != yi) + testdata->points[i++] != sample_to_pos (yi)) { - printf ("error %f %f\n", testdata->points[i - 1], xi); + printf ("%d error %f %f\n", i, testdata->points[i - 1], sample_to_pos (yi)); exit (-1); } - e -= sample_step_y (yi) * dx; - yi += sample_step_y (yi); + if ((yi & 0xff) == (N_GRID_Y - 1)) + { + e -= BIG_STEP_Y * dx; + + yi += (1 << 8); + yi &= 0xffffff00; + } + else + { + e -= SMALL_STEP_Y * dx; + + yi++; + } } } |