On Mon, Mar 8, 2010 at 10:13 PM, Harry Eaton <bump...@gmail.com> wrote:
[...] > It looks to me like the SQ() macro risks integer overflow when squaring > the lengths. Thank you, good point. Here's an updated patch that uses Manhattan distance instead - for the tiny lengths involved it should be fine. Peer review saves the day :) diff --git a/src/djopt.c b/src/djopt.c index 68b3641..230b3c7 100644 --- a/src/djopt.c +++ b/src/djopt.c @@ -75,6 +75,9 @@ RCSID ("$Id$"); #define ORIENT(x) ((x) & 0xf0) #define DIRECT(x) ((x) & 0x0f) +/* Manhattan length of the longest "freckle" */ +#define LONGEST_FRECKLE 2 + struct line_s; typedef struct corner_s @@ -1230,6 +1233,33 @@ simple_optimize_corner (corner_s * c) } } check (c, 0); + if (c->n_lines == 1 && !c->via) + { + corner_s *c0 = other_corner (c->lines[0], c); + if (abs(c->x - c0->x) + abs(c->y - c0->y) <= LONGEST_FRECKLE) + { + /* + * Remove this line, as it is a "freckle". A freckle is an extremely + * short line (around 0.01 thou) that is unconnected at one end. + * Freckles are almost insignificantly small, but are annoying as + * they prevent the mitering optimiser from working. + * Freckles sometimes arise because of a bug in the autorouter that + * causes it to create small overshoots (typically 0.01 thou) at the + * intersections of vertical and horizontal lines. These overshoots + * are converted to freckles as a side effect of canonicalize_line(). + * Note that canonicalize_line() is not at fault, the bug is in the + * autorouter creating overshoots. + * The autorouter bug arose some time between the 20080202 and 20091103 + * releases. + * This code is probably worth keeping even when the autorouter bug is + * fixed, as "freckles" could conceivably arise in other ways. + */ + dprintf ("freckle %d,%d to %d,%d\n", + c->x, c->y, c0->x, c0->y); + move_corner (c, c0->x, c0->y); + } + } + check (c, 0); return rv; } _______________________________________________ geda-user mailing list geda-user@moria.seul.org http://www.seul.org/cgi-bin/mailman/listinfo/geda-user