June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -59,7 +59,7 @@ void draw_line_antialias(
|
|||
plot_(xpxl2, ypxl2 + 1, fpart_(yend) * xgap);
|
||||
|
||||
int x;
|
||||
for(x=xpxl1+1; x <= (xpxl2-1); x++) {
|
||||
for(x=xpxl1+1; x < xpxl2; x++) {
|
||||
plot_(x, ipart_(intery), rfpart_(intery));
|
||||
plot_(x, ipart_(intery) + 1, fpart_(intery));
|
||||
intery += gradient;
|
||||
|
|
@ -76,7 +76,7 @@ void draw_line_antialias(
|
|||
int ypxl1 = yend;
|
||||
int xpxl1 = ipart_(xend);
|
||||
plot_(xpxl1, ypxl1, rfpart_(xend)*ygap);
|
||||
plot_(xpxl1, ypxl1+1, fpart_(xend)*ygap);
|
||||
plot_(xpxl1 + 1, ypxl1, fpart_(xend)*ygap);
|
||||
double interx = xend + gradient;
|
||||
|
||||
yend = round_(y2);
|
||||
|
|
@ -85,10 +85,10 @@ void draw_line_antialias(
|
|||
int ypxl2 = yend;
|
||||
int xpxl2 = ipart_(xend);
|
||||
plot_(xpxl2, ypxl2, rfpart_(xend) * ygap);
|
||||
plot_(xpxl2, ypxl2 + 1, fpart_(xend) * ygap);
|
||||
plot_(xpxl2 + 1, ypxl2, fpart_(xend) * ygap);
|
||||
|
||||
int y;
|
||||
for(y=ypxl1+1; y <= (ypxl2-1); y++) {
|
||||
for(y=ypxl1+1; y < ypxl2; y++) {
|
||||
plot_(ipart_(interx), y, rfpart_(interx));
|
||||
plot_(ipart_(interx) + 1, y, fpart_(interx));
|
||||
interx += gradient;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,75 @@
|
|||
using Images
|
||||
|
||||
fpart(x) = mod(x, one(x))
|
||||
rfpart(x) = one(x) - fpart(x)
|
||||
|
||||
function drawline!(img::Matrix{Gray{N0f8}}, x0::Integer, y0::Integer, x1::Integer, y1::Integer)
|
||||
steep = abs(y1 - y0) > abs(x1 - x0)
|
||||
|
||||
if steep
|
||||
x0, y0 = y0, x0
|
||||
x1, y1 = y1, x1
|
||||
end
|
||||
if x0 > x1
|
||||
x0, x1 = x1, x0
|
||||
y0, y1 = y1, y0
|
||||
end
|
||||
|
||||
dx = x1 - x0
|
||||
dy = y1 - y0
|
||||
grad = dy / dx
|
||||
|
||||
if iszero(dx)
|
||||
grad = oftype(grad, 1.0)
|
||||
end
|
||||
|
||||
# handle first endpoint
|
||||
xend = round(Int, x0)
|
||||
yend = y0 + grad * (xend - x0)
|
||||
xgap = rfpart(x0 + 0.5)
|
||||
xpxl1 = xend
|
||||
ypxl1 = floor(Int, yend)
|
||||
|
||||
if steep
|
||||
img[ypxl1, xpxl1] = rfpart(yend) * xgap
|
||||
img[ypxl1+1, xpxl1] = fpart(yend) * xgap
|
||||
else
|
||||
img[xpxl1, ypxl1 ] = rfpart(yend) * xgap
|
||||
img[xpxl1, ypxl1+1] = fpart(yend) * xgap
|
||||
end
|
||||
intery = yend + grad # first y-intersection for the main loop
|
||||
|
||||
# handle second endpoint
|
||||
xend = round(Int, x1)
|
||||
yend = y1 + grad * (xend - x1)
|
||||
xgap = fpart(x1 + 0.5)
|
||||
xpxl2 = xend
|
||||
ypxl2 = floor(Int, yend)
|
||||
if steep
|
||||
img[ypxl2, xpxl2] = rfpart(yend) * xgap
|
||||
img[ypxl2+1, xpxl2] = fpart(yend) * xgap
|
||||
else
|
||||
img[xpxl2, ypxl2 ] = rfpart(yend) * xgap
|
||||
img[xpxl2, ypxl2+1] = fpart(yend) * xgap
|
||||
end
|
||||
|
||||
# main loop
|
||||
if steep
|
||||
for x in xpxl1+1:xpxl2-1
|
||||
img[floor(Int, intery), x] = rfpart(intery)
|
||||
img[floor(Int, intery)+1, x] = fpart(intery)
|
||||
intery += grad
|
||||
end
|
||||
else
|
||||
for x in xpxl1+1:xpxl2-1
|
||||
img[x, floor(Int, intery) ] = rfpart(intery)
|
||||
img[x, floor(Int, intery)+1] = fpart(intery)
|
||||
intery += grad
|
||||
end
|
||||
end
|
||||
|
||||
return img
|
||||
end
|
||||
|
||||
img = fill(Gray(1.0N0f8), 250, 250);
|
||||
drawline!(img, 8, 8, 192, 154)
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
/*REXX program plots/draws (ASCII) a line using the Xiaolin Wu line algorithm. */
|
||||
/*REXX program plots/draws (ASCII) a line using the Xiaolin Wu line algorithm. */
|
||||
background= '·' /*background character: a middle-dot. */
|
||||
image.= background /*fill the array with middle-dots. */
|
||||
plotC= '░▒▓█' /*characters used for plotting points. */
|
||||
|
|
@ -17,11 +17,11 @@ minX=0; minY=0 /*use these as the limits for p
|
|||
maxX=0; maxY=0 /* " " " " " " " */
|
||||
call drawLine xi, yi, xf, yf /*invoke subroutine and graph the line.*/
|
||||
border=2 /*allow additional space (plot border).*/
|
||||
minX=minX - border * 2; maxX=maxX+border * 2 /*preserve screen's aspect ratio {*2}.*/
|
||||
minY=minY - border ; maxY=maxY+border
|
||||
do y=maxY to minY by -1; _= /*construct a row.*/
|
||||
do x=minX to maxX; _=_ || image.x.y; end /*x*/
|
||||
say _ /*display the constructed row to term. */
|
||||
minX=minX - border * 2; maxX=maxX + border * 2 /*preserve screen's aspect ratio {*2}.*/
|
||||
minY=minY - border ; maxY=maxY + border
|
||||
do y=maxY to minY by -1; $= /*construct a row.*/
|
||||
do x=minX to maxX; $=$ || image.x.y; end /*x*/
|
||||
say $ /*display the constructed row to term. */
|
||||
end /*y*/ /*graph is cropped by the MINs and MAXs*/
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
|
|
@ -42,19 +42,19 @@ drawLine: parse arg x1,y1,x2,y2; switchXY=0; dx=x2-x1
|
|||
call plotXY xpx12, ypx12 , brite(1 - fpart(yend*xgap)), switchXY
|
||||
call plotXY xpx12, ypx12+1, brite( fpart(yend*xgap)), switchXY
|
||||
|
||||
do x=xpx11+1 to xpx12-1 /*◄───draw the line.═════════════*/
|
||||
!intery=floor(intery)
|
||||
call plotXY x, !intery , brite(1 - fpart(intery)), switchXY
|
||||
call plotXY x, !intery+1, brite( fpart(intery)), switchXY
|
||||
intery=intery + gradient
|
||||
end /*x*/
|
||||
do x=xpx11+1 to xpx12-1 /*◄═════════════════draw the line.═════════════*/
|
||||
!intery=floor(intery)
|
||||
call plotXY x, !intery , brite(1 - fpart(intery)), switchXY
|
||||
call plotXY x, !intery+1, brite( fpart(intery)), switchXY
|
||||
intery=intery + gradient
|
||||
end /*x*/
|
||||
return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
brite: return substr(background || plotC, 1 + round( abs( arg(1) ) * length(plotC)), 1)
|
||||
floor: parse arg ?; _=trunc(?); return _ - (?<0) * (?\=_)
|
||||
fpart: parse arg ?; return abs(? - trunc(?))
|
||||
floor: parse arg #; _=trunc(#); return _ - (#<0) * (#\=_)
|
||||
fpart: parse arg #; return abs(# - trunc(#) )
|
||||
round: return format(arg(1), , word(arg(2) 0, 1) )
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
plotXY: parse arg xx,yy,bc,switchYX; if switchYX then parse arg yy,xx
|
||||
image.xx.yy=bc; minX=min(minX, xx); maxX=max(maxX,xx)
|
||||
minY=min(minY, yy); maxY=max(maxY,yy); return
|
||||
image.xx.yy=bc; minX=min(minX, xx); maxX=max(maxX,xx)
|
||||
minY=min(minY, yy); maxY=max(maxY,yy); return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue