On Wed, Sep 30, 2009 at 07:56:32AM -0700, Randolph Bentson wrote: > I've found that wide lines drawn with PIL 1.1.6 have a directional > dependence, e.g., lines from (0,0) to (-100,0) are thinner than those > from (0,0) to (0,-100).
A few days ago I posted a hack which reduced the magnitude of the problem. The following patch does a better job at little additional cost. I've introduced variables dX and dY to improve the readability of the code which computes the values of the pixel-based dx and dy values. The reference to "diagonal lines" doesn't implement proper antialiasing, but it improves things with modest code change.) Feedback is welcome because I do hope this'll get in the 1.1.7 release. --- OLD_Draw.c 2009-10-03 14:44:31.000000000 -0700 +++ Draw.c 2009-10-03 15:42:41.000000000 -0700 @@ -665,6 +665,7 @@ Edge e[4]; + int dX, dY; int dx, dy; double d; @@ -675,18 +676,34 @@ return 0; } - dx = x1-x0; - dy = y1-y0; + dX = x1-x0; + dY = y1-y0; - if (dx == 0 && dy == 0) { + if (dX == 0 && dY == 0) { draw->point(im, x0, y0, ink); return 0; } - d = width / sqrt(dx*dx + dy*dy) / 2.0; + d = width / sqrt(dX*dX + dY*dY) / 2.0; - dx = (int) (d * (y1-y0) + 0.5); - dy = (int) (d * (x1-x0) + 0.5); + /* Negative values are rounded down and positive + values are rounded up, else the deltas disappear! + */ + if (dY < 0) dx = (int) (d * dY - 0.5); + else dx = (int) (d * dY + 0.5); + if (dX < 0) dy = (int) (d * dX - 0.5); + else dy = (int) (d * dX + 0.5); + + /* This is necessary because diagonal lines are too wide. + */ + if ( 4*(dx*dx+dy*dy) > (width*width) ){ + if (abs(dx) > abs(dy)) + if (dx < 0) dx ++; + else dx --; + else + if (dy < 0) dy ++; + else dy --; + } add_edge(e+0, x0 - dx, y0 + dy, x1 - dx, y1 + dy); add_edge(e+1, x1 - dx, y1 + dy, x1 + dx, y1 - dy); -- Randolph Bentson bent...@holmsjoen.com _______________________________________________ Image-SIG maillist - Image-SIG@python.org http://mail.python.org/mailman/listinfo/image-sig