Xiaolin Wu's line algorithm: Difference between revisions
Content deleted Content added
Added solution for Action! |
|||
Line 12: | Line 12: | ||
* See [[Bresenham's line algorithm]] for ''aliased'' lines. |
* See [[Bresenham's line algorithm]] for ''aliased'' lines. |
||
<br><br> |
<br><br> |
||
=={{header|Action!}}== |
|||
{{libheader|Action! Tool Kit}} |
|||
{{libheader|Action! Real Math}} |
|||
<lang Action!>INCLUDE "H6:REALMATH.ACT" |
|||
REAL one |
|||
PROC PutBigPixel(INT x,y,col) |
|||
IF x>=0 AND x<=79 AND y>=0 AND y<=47 THEN |
|||
y==LSH 2 |
|||
IF col<0 THEN col=0 |
|||
ELSEIF col>15 THEN col=15 FI |
|||
Color=col |
|||
Plot(x,y) |
|||
DrawTo(x,y+3) |
|||
FI |
|||
RETURN |
|||
INT FUNC Abs(INT x) |
|||
IF x<0 THEN RETURN (-x) FI |
|||
RETURN (x) |
|||
PROC Swap(INT POINTER a,b) |
|||
INT tmp |
|||
tmp=a^ a^=b^ b^=tmp |
|||
RETURN |
|||
PROC Line(INT x1,y1,x2,y2,col) |
|||
INT x,y,dx,dy,c |
|||
INT POINTER px,py |
|||
REAL rx,ry,grad,rcol,tmp1,tmp2 |
|||
dx=Abs(x2-x1) |
|||
dy=Abs(y2-y1) |
|||
IF dy>dx THEN |
|||
Swap(@x1,@y1) |
|||
Swap(@x2,@y2) |
|||
px=@y py=@x |
|||
ELSE |
|||
px=@x py=@y |
|||
FI |
|||
IF x1>x2 THEN |
|||
Swap(@x1,@x2) |
|||
Swap(@y1,@y2) |
|||
FI |
|||
x=x2-x1 |
|||
IF x=0 THEN x=1 FI |
|||
IntToRealForNeg(x,rx) |
|||
IntToRealForNeg(y2-y1,ry) |
|||
RealDiv(ry,rx,grad) |
|||
IntToRealForNeg(y1,ry) |
|||
IntToReal(col,rcol) |
|||
FOR x=x1 TO x2 |
|||
DO |
|||
Frac(ry,tmp1) |
|||
IF IsNegative(tmp1) THEN |
|||
RealAdd(one,tmp1,tmp2) |
|||
RealAssign(tmp2,tmp1) |
|||
FI |
|||
RealMult(rcol,tmp1,tmp2) |
|||
c=Round(tmp2) |
|||
y=Floor(ry) |
|||
PutBigPixel(px^,py^,col-c) |
|||
y==+1 |
|||
PutBigPixel(px^,py^,c) |
|||
RealAdd(ry,grad,tmp1) |
|||
RealAssign(tmp1,ry) |
|||
OD |
|||
RETURN |
|||
PROC Main() |
|||
BYTE CH=$02FC ;Internal hardware value for last key pressed |
|||
REAL tmp,c |
|||
BYTE i,x1,y1,x2,y2 |
|||
MathInit() |
|||
IntToReal(1,one) |
|||
Graphics(9) |
|||
FOR i=0 TO 11 |
|||
DO |
|||
Line(0,i*4,38,1+i*5,15) |
|||
Line(40+i*4,0,41+i*6,47,15) |
|||
OD |
|||
DO UNTIL CH#$FF OD |
|||
CH=$FF |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Xiaolin_Wu's_line_algorithm.png Screenshot from Atari 8-bit computer] |
|||
=={{header|ARM Assembly}}== |
=={{header|ARM Assembly}}== |