summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-12-06 06:14:20 -0500
committerSøren Sandmann Pedersen <ssp@l3000.localdomain>2010-12-20 10:48:51 -0500
commitdb4f36c2a6279de219520d063c1d643d150fcfa5 (patch)
tree5e301377738695114a6282aef504faa1c6423a72
parent8766c7268a4bba4d35d16a4ce94938e187052b68 (diff)
Convert yi to be a sample number
-rw-r--r--dda.c58
1 files changed, 45 insertions, 13 deletions
diff --git a/dda.c b/dda.c
index 354a59d..25dbd6c 100644
--- a/dda.c
+++ b/dda.c
@@ -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++;
+ }
}
}