Re: fix for wide line directional dependence

Randolph Bentson <[email protected]>
Newsgroups gmane.comp.python.image
Message-ID <[email protected]>
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
[email protected]
_______________________________________________
Image-SIG maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/image-sig
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.