You are not logged in.
Pages: 1
/// 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;
}
}
Last edited by Zek (2016-08-25 13:39:40)
Offline
Great idea for a script! Thanks, Zek, and welcome to the forums.
Abusing forum power since 1986.
Offline
Great idea for a script! Thanks, Zek, and welcome to the forums.
Thank you!
Offline
Pages: 1