From d4977e28bad2b03eac90adba88a1334932ecf72a Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sun, 31 Jan 2010 22:29:01 +0000 Subject: Improve rounding of fill span endpoints for polygon plotter. svn path=/trunk/libnsfb/; revision=9946 --- src/plot/generic.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/plot/generic.c b/src/plot/generic.c index e6856dc..3bd06a5 100644 --- a/src/plot/generic.c +++ b/src/plot/generic.c @@ -173,9 +173,22 @@ static bool find_span(const int *p, int n, int x, int y, int *x0, int *x1) } else { /* find crossing (intersection of this line and * current y level) */ - x_new = p_x0 + ((long long) - (y - p_y0) * (p_x1 - p_x0)) / - (p_y1 - p_y0); + int numerator = (y - p_y0) * (p_x1 - p_x0); + int denominator = (p_y1 - p_y0); + + /* To round to nearest (rather than down) + * half the denominator is either added to + * or subtracted from the numerator, + * depending on whether the numerator and + * denominator have the same sign */ + if ((numerator < 0) == (denominator < 0)) + x_new = p_x0 + (numerator + + (denominator / 2)) / + denominator; + else + x_new = p_x0 + (numerator - + (denominator / 2)) / + denominator; } /* ignore crossings before current x */ -- cgit v1.2.3