GMLscripts.com

Discuss and collaborate on GML scripts
Invert

You are not logged in.

#1 Re: Script Submission » draw_line_aa - Anti-Aliased Lines » 2016-08-27 07:11:14

Zek
xot wrote:

Great idea for a script! Thanks, Zek, and welcome to the forums.

Thank you! biggrin

#2 Script Submission » draw_line_aa - Anti-Aliased Lines » 2016-08-25 13:26:15

Zek
Replies: 2
Expand/// draw_line_aa(x1, y1, x2, y2);
//
//  Draws an anti-aliased line using Xiaolin Wu's line algorithm.
//
//      x1, y1       1st point of line, real.
//      x2, y2       2nd point of line, real.
//
/// GMLscripts.com/license

var x1, y1, x2, y2, xx, dx, dy, xprev, yprev, xend, yend, xgap, xpxl1, ypxl1, xpxl2, ypxl2, steep, gradient, i, a, intery;
x1 = argument0;
y1 = argument1;
x2 = argument2;
y2 = argument3;

steep = abs(y2 - y1) > abs(x2 - x1);

if (steep) {
    xprev = x1;
    x1 = y1;
    y1 = xprev;
    xprev = x2;
    x2 = y2;
    y2 = xprev;
}

if (x1 > x2) {
    xprev = x1;
    x1 = x2;
    x2 = xprev;
    yprev = y1;
    y1 = y2;
    y2 = yprev;
}

x2 -= 1;
y2 -= 1;

dx = x2 - x1;
dy = y2 - y1;
gradient = dy / dx;

xend = floor(x1 + 0.5);
yend = y1 + gradient * (xend - x1);

if ((x1 + 0.5) < 0)
    i = 1 - ((x1 + 0.5) - floor((x1 + 0.5)));
else
    i = (x1 + 0.5) - floor((x1 + 0.5));
    
xgap = 1 - i;

xpxl1 = xend;
ypxl1 = floor(yend);

if (yend < 0)
    i = 1 - (yend - floor(yend));
else
    i = yend - floor(yend);
        
a = 1 - i;

if (steep) {
    draw_set_alpha(a * xgap);
    draw_point(ypxl1, xpxl1);
    draw_set_alpha(i * xgap);
    draw_point(ypxl1 + 1, xpxl1);
    draw_set_alpha(1);
} else {
    draw_set_alpha(a * xgap);
    draw_point(xpxl1, ypxl1);
    draw_set_alpha(i * xgap);
    draw_point(xpxl1, ypxl1 + 1);
    draw_set_alpha(1);
}

intery = yend + gradient;

xend = floor(x2 + 0.5);
yend = y2 + gradient * (xend - x2);

if ((x2 + 0.5) < 0)
    i = 1 - ((x2 + 0.5) - floor((x2 + 0.5)));
else
    i = (x2 + 0.5) - floor((x2 + 0.5));

xgap = i;

xpxl2 = xend;
ypxl2 = floor(yend);

if (yend < 0)
    i = 1 - (yend - floor(yend));
else
    i = yend - floor(yend);
        
a = 1 - i;

if (steep) {
    draw_set_alpha(a * xgap);
    draw_point(ypxl2, xpxl2);
    draw_set_alpha(i * xgap);
    draw_point(ypxl2 + 1, xpxl2);
    draw_set_alpha(1);
} else {
    draw_set_alpha(a * xgap);
    draw_point(xpxl2, ypxl2);
    draw_set_alpha(i * xgap);
    draw_point(xpxl2, ypxl2 + 1);
    draw_set_alpha(1);
}

if (steep) {
    for (xx = xpxl1 + 1; xx < xpxl2; xx += 1) {
        if (intery < 0)
            i = 1 - (intery - floor(intery));
        else
            i = intery - floor(intery);
        
        a = 1 - i;
    
        draw_set_alpha(a);
        draw_point(floor(intery), xx);
        draw_set_alpha(i);
        draw_point(floor(intery) + 1, xx);
        draw_set_alpha(1);
        
        intery += gradient;
    }
} else {
    for (xx = xpxl1 + 1; xx < xpxl2; xx += 1) {
        if (intery < 0)
            i = 1 - (intery - floor(intery));
        else
            i = intery - floor(intery);
        
        a = 1 - i;
    
        draw_set_alpha(a);
        draw_point(xx, floor(intery));
        draw_set_alpha(i);
        draw_point(xx, floor(intery) + 1);
        draw_set_alpha(1);
                
        intery += gradient;
    }
}

Board footer

Powered by FluxBB