08-20-2023, 09:55 PM
(This post was last modified: 08-21-2023, 01:59 PM by James D Jarvis.)
an update of an older sub to draw filled polygons using _maptriangle . This one is faster than the earlier version (polyT) and includes options for rotation, horizontal and vertical scaling, and a border.
Code: (Select All)
'draw_polyFT
' by James D. Jarvis , August 20,2023
'draw filled polygons
'
'HEADER
Dim Shared xmax, ymax
xmax = 800: ymax = 500
Screen _NewImage(xmax, ymax, 32)
Dim Shared pk& 'must be included in a program that uses polyFT
pk& = _NewImage(3, 3, 32) 'must be included in a program that uses polyFT
'======================================
' demo
'======================================
' This demo draws 64000 random polygons, and then clears the screen and draws a handful of polygons rotating
Randomize Timer
t1 = Timer
For reps = 1 To 64000
polyFT Int(Rnd * xmax), Int(Rnd * ymax), Int(3 + Rnd * 20), Int(3 + Rnd * 12), Int(Rnd * 60), Int(1 + Rnd * 3), Int(1 + Rnd * 3), _RGB32(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256)), _RGB32(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))
Next reps
t2 = Timer
Print "That took "; t2 - t1; " seconds to draw 64000 polygons"
Sleep
rtn = 0
Do
_Limit 60
Cls
Print "Press <ESC> to quit>"
polyFT 100, 100, 40, 3, rtn, 1, 1, _RGB32(100, 200, 50), 0
polyFT 200, 100, 40, 4, 45 + rtn, 1, 1, _RGB32(100, 200, 250), 0
polyFT 300, 100, 40, 5, rtn, 1, 1, _RGB32(200, 100, 250), 0
polyFT 400, 100, 40, 6, rtn, 1, 1, _RGB32(100, 250, 150), 0
polyFT 500, 100, 40, 7, rtn, 1, 1, _RGB32(150, 200, 200), 0
polyFT 600, 100, 40, 8, 22.5 + rtn, 1, 1, _RGB32(200, 200, 0), 0
_PrintString (100 - (_PrintWidth("Triangle")) / 2, 160), "Triangle"
_PrintString (200 - (_PrintWidth("Square")) / 2, 160), "Square"
_PrintString (300 - (_PrintWidth("Pentagon")) / 2, 160), "Pentagon"
_PrintString (400 - (_PrintWidth("Hexagon")) / 2, 160), "Hexagon"
_PrintString (500 - (_PrintWidth("Heptagon")) / 2, 160), "Heptagon"
_PrintString (600 - (_PrintWidth("Octagon")) / 2, 160), "Octagon"
rtn = rtn + 1: If rtn > 360 Then rtn = 0
_Display 'for smooth display
Loop Until InKey$ = Chr$(27)
'==========================================================================
'subroutines
'
' polyFT draw a filled polygon
'
' setklr is a sub to build the color image used by triangles in polyFT
'====================================== ==================================
Sub polyFT (cx As Long, cy As Long, rad As Long, sides As Integer, rang As Long, ww, vv, klr As _Unsigned Long, lineyes As _Unsigned Long)
'draw an equilateral polygon using filled triangle for each segment
'centered at cx,cy to radius rad of sides # of face rotated to angle rang scaled to ww and vv of color klr and lineyes if there is an outline, a value 0 would create no outline
setklr klr
Dim px(sides)
Dim py(sides)
pang = 360 / sides
ang = 0
For p = 1 To sides
px(p) = cx + (rad * Cos(0.01745329 * (ang + rang))) * ww
py(p) = cy + (rad * Sin(0.01745329 * (ang + rang))) * vv
ang = ang + pang
Next p
For p = 1 To sides - 1
_MapTriangle (0, 0)-(0, 2)-(2, 0), pk& To(cx, cy)-(px(p), py(p))-(px(p + 1), py(p + 1))
If lineyes > 0 Then Line (px(p), py(p))-(px(p + 1), py(p + 1)), lineyes
Next p
_MapTriangle (0, 0)-(0, 2)-(2, 0), pk& To(cx, cy)-(px(sides), py(sides))-(px(1), py(1))
If lineyes > 0 Then Line (px(sides), py(sides))-(px(1), py(1)), lineyes
End Sub
Sub setklr (klr As Long)
'internal routine to setup an image to copy a colored triangle from in the color klr
'called by polyT
_Dest pk&
Line (0, 0)-(2, 2), klr, BF
_Dest 0
End Sub