r5704 - developers/werner/cncmap/zmap

werner at docs.openmoko.org werner at docs.openmoko.org
Fri Oct 23 01:27:55 CEST 2009


Author: werner
Date: 2009-10-23 01:27:55 +0200 (Fri, 23 Oct 2009)
New Revision: 5704

Modified:
   developers/werner/cncmap/zmap/zline.c
   developers/werner/cncmap/zmap/zmap.c
Log:
More algorithm fixes. We should now be good, except for some corner cases.

- zmap/zmap.c (zmap_point): treat this as a linear equation with two unknowns.
  The previous algorithm only worked if the points formed a triangle with a
  right angle and the first point was at that angle.
- zmap/zline.c (zline): we still have to consider "old" points, as they may 
  replace different points as we crawl the line



Modified: developers/werner/cncmap/zmap/zline.c
===================================================================
--- developers/werner/cncmap/zmap/zline.c	2009-10-22 21:23:05 UTC (rev 5703)
+++ developers/werner/cncmap/zmap/zline.c	2009-10-22 23:27:55 UTC (rev 5704)
@@ -123,7 +123,6 @@
     void (*point)(void *user, double x, double y, double z), void *user)
 {
 	double t;
-	int n;
 	double best_t, tmp_t;
 	int best_next, best_old;
 	int i, tmp_i;
@@ -135,13 +134,13 @@
 	point(user, xa, ya, zmap_point(map[0], map[1], map[2], xa, ya));
 
 	t = 0;
-	n = map_n;
-	while (n > 3) {
+	while (1) {
 		best_t = 1;
 		best_next = best_old = -1;
 		for (i = 0; i != 3; i++) {
 			tmp_t = t;
-			tmp_i = next_closest(xa, ya, xb, yb, i, 3, n, &tmp_t);
+			tmp_i = next_closest(xa, ya, xb, yb, i, 3, map_n,
+			    &tmp_t);
 			DEBUG("%d: i = %d t = %g (@%g)\n", i, tmp_i, tmp_t, t);
 			if (tmp_t < best_t) {
 				best_t = tmp_t;
@@ -151,11 +150,8 @@
 		}
 		if (best_next == -1)
 			break;
-		DEBUG("swap %d vs. %d of %d\n", best_old, best_next, n);
-		swap(best_old, n-1);
-		if (best_next != n-1)
-			swap(best_old, best_next);
-		n--;
+		DEBUG("swap %d vs. %d\n", best_old, best_next);
+		swap(best_old, best_next);
 		t = best_t;
 		x = xa+(xb-xa)*t;
 		y = ya+(yb-ya)*t;

Modified: developers/werner/cncmap/zmap/zmap.c
===================================================================
--- developers/werner/cncmap/zmap/zmap.c	2009-10-22 21:23:05 UTC (rev 5703)
+++ developers/werner/cncmap/zmap/zmap.c	2009-10-22 23:27:55 UTC (rev 5704)
@@ -120,9 +120,9 @@
 double zmap_point(struct xyz a, struct xyz b, struct xyz c, double x, double y)
 {
 	double xp, yp;
-	double xu, yu, zu, u;
-	double xv, yv, zv, v;
-	double s, t;
+	double xu, yu, zu;
+	double xv, yv, zv;
+	double det, s, t;
 
 	DEBUG("point (%g, %g) -> (%g, %g) (%g, %g) (%g, %g)\n",
 	    x, y, a.x, a.y, b.x, b.y, c.x, c.y);
@@ -132,15 +132,14 @@
 	xu = b.x-a.x;
 	yu = b.y-a.y;
 	zu = b.z-a.z;
-	u = hypot(xu, yu);
 
 	xv = c.x-a.x;
 	yv = c.y-a.y;
 	zv = c.z-a.z;
-	v = hypot(xv, yv);
 
-	s = (xp*xu+yp*yu)/u/u;
-	t = (xp*xv+yp*yv)/v/v;
+	det = xu*yv-yu*xv;
+	s = (xp*yv-yp*xv)/det;
+	t = (xu*yp-yu*xp)/det;
 
 	return a.z+s*zu+t*zv;
 }




More information about the commitlog mailing list