Triangle fill algorithm
Posted: Tue Feb 13, 2007 1:09 pm
Hi, i'm working on a 64kb intro for Amiga, and i made a triangle fill algorithm that i tested before on Purebasic (windows), it use fixed point math, and words to store values, with a 6 bits of precision you can draw triangles on a screen of 1024x1024 maximum, but you can change the algorithm to accept bigger values (change word variables to long).
Code: Select all
EnableExplicit
#FP = 6
Procedure filltriangle(x1,y1,x2,y2,x3,y3,color)
Define.w x, y, x0,y0, dx1, dx2, dx3, scanleftx, scanrightx, leftadd, rightadd, beginx, endx
Define.b bucle
; Sort algorithm using swap method, two iterations is enough to sort an array with 3 items
For bucle = 0 To 1
If y1>y2 : x0=x2 : x2=x1 : x1=x0 : y0=y2 : y2=y1 : y1=y0 : EndIf
If y2>y3 : x0=x3 : x3=x2: x2=x0 : y0=y3 : y3=y2 : y2=y0 : EndIf
Next bucle
If y2 <> y1
dx1=((x2-x1)<<#FP)/(y2-y1)
EndIf
If y3 <> y1
dx2=((x3-x1)<<#FP)/(y3-y1)
EndIf
If y3<> y2
dx3=((x3-x2)<<#FP)/(y3-y2)
EndIf
scanleftx = x1 << #FP
scanrightx = x1 << #FP
If dx1 < dx2
leftadd=dx1
rightadd=dx2
Else
leftadd=dx2
rightadd=dx1
EndIf
For y = y1 To y2-1
beginx = scanleftx >> #FP
endx = scanrightx >> #FP
LineXY(beginx, y, endx, y, color)
scanleftx + leftadd
scanrightx + rightadd
Next y
If dx2 > dx3
leftadd = dx2
rightadd = dx3
Else
leftadd = dx3
rightadd = dx2
EndIf
For y = y2 To y3
beginx = scanleftx >> #FP
endx = scanrightx >> #FP
LineXY(beginx, y, endx, y, color)
scanleftx + leftadd
scanrightx + rightadd
Next y
EndProcedure