[Commit] tess ChangeLog,1.10,1.11 bentley.5c,1.11,1.12

Carl Worth commit at keithp.com
Thu Jul 8 19:04:41 PDT 2004


Committed by: cworth

Update of /local/src/CVS/tess
In directory home.keithp.com:/tmp/cvs-serv7172

Modified Files:
	ChangeLog bentley.5c 
Log Message:

        * bentley.5c (event_greater): Remove buggy code intended to handle
        (bentley_ottman): Add remove_degenerate function to just yank the
        degenerate edges out before beginning the algorithm.

        The random test works at least as far as 20 now.


Index: ChangeLog
===================================================================
RCS file: /local/src/CVS/tess/ChangeLog,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- ChangeLog	9 Jul 2004 00:51:10 -0000	1.10
+++ ChangeLog	9 Jul 2004 02:04:38 -0000	1.11
@@ -1,5 +1,14 @@
 2004-07-08  Carl Worth  <cworth at isi.edu>
 
+	* bentley.5c (event_greater): Remove buggy code intended to handle
+	degenerate edges (including duplicates!).
+	(bentley_ottman): Add remove_degenerate function to just yank the
+	degenerate edges out before beginning the algorithm.
+
+	The random test works at least as far as 20 now.
+	
+2004-07-08  Carl Worth  <cworth at isi.edu>
+
 	* bentley.5c (event_greater): Yet another rework of the
 	event_greater function. It's pretty close now. Horizontal and even
 	fully degnerate edges are handled better. And even partially

Index: bentley.5c
===================================================================
RCS file: /local/src/CVS/tess/bentley.5c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- bentley.5c	9 Jul 2004 00:51:10 -0000	1.11
+++ bentley.5c	9 Jul 2004 02:04:38 -0000	1.12
@@ -128,26 +128,19 @@
     if (a.point.x != b.point.x)
         return a.point.x > b.point.x;
 
+    /* At this point, degenerate edges cause problems, (stop events
+     * get scheduled before start events). I had tried adding code
+     * here to fix it, but decided instead to just remove those edges
+     * before the algorithm begine.
+     */
+
     /* Even with the same X-value, further horizontal discrimination
      * is determined by the event type for horizontal edges.  As
      * before, due to the shortening rule, stop events occur before
      * the current X value while start events occur after the current
      * value.
-     *
-     * However, if the start and stop events belong to the same edge
-     * then the start event must come first. The X comparison above
-     * catches every case except for a degenerate edge with top ==
-     * bottom.
      */
     if (a.type != b.type) {
-	if (a.e1.elt->top.x == a.e1.elt->bottom.x &&
-	    a.e1.elt->top.y == a.e1.elt->bottom.y &&
-	    a.e1.elt->top.x == b.e1.elt->top.x &&
-	    a.e1.elt->top.y == b.e1.elt->top.y &&
-	    b.e1.elt->top.x == b.e1.elt->bottom.x &&
-	    b.e1.elt->top.y == b.e1.elt->bottom.y)
-	    return a.type == EventType.Stop;
-
 	if (a.type == EventType.Stop)
 	    return false;
 	if (a.type == EventType.Start)
@@ -381,6 +374,16 @@
     EventPtr event_queue = Sortlist::List.nil;
     Edge[...] result = {};
 
+    Edge[*] remove_degenerate (Edge[*] edges) {
+	Edge[...] non_degenerate = {};
+	for (int i=0; i < dim(edges); i++)
+	    if (edges[i].top.x != edges[i].bottom.x ||
+		edges[i].top.y != edges[i].bottom.y)
+		non_degenerate[dim(non_degenerate)] = edges[i];
+
+	return non_degenerate;
+    }
+
     Edge[*] remove_horizontal (Edge[*] edges) {
 	Edge[...] non_horizontal = {};
 	for (int i=0; i < dim(edges); i++)
@@ -392,6 +395,8 @@
 
     EventPtr initialize_event_queue (Edge[*] segments) {
 	Event[...] events = {};
+
+	segments = remove_degenerate (segments);
 /*
 	segments = remove_horizontal (segments);
 */
@@ -791,7 +796,7 @@
 for (int i=0; i < dim(tests); i++)
     run_test (tests[i].name, tests[i].edges);
 
-num_random = 19;
+num_random = 20;
 
 PRNG::srandom (0);
 Edge[...] random_edges = {};




More information about the Commit mailing list