I apologize in advance for the fact that this is only partially related to the topic. How to rotate the image - My frame method is memory -intensive as I have shown them. Turning with Steve's method in turn consumes a small amount of power. The worst method is direct rotation and direct rendering of everything at once. It depends on the particular program, when it fits best.
With both rotation method and with SaveImage can every from us easy sprite image files to do. If you set rotation center to correct place, you can rotate just piece of image for example, just the character's hand, but not the whole character....
Bplus here hidden draw galaxy...
OPTION _EXPLICIT
_TITLE "Crescent Line Filled Circle Arcs" 'b+ 2019-06-29
CONST xmax = 800, ymax = 600, pi = 3.14159265
DIM aof
DIM Frames(35) AS LONG, CreateFrames AS INTEGER, X AS SINGLE, Z AS SINGLE, angle AS SINGLE, height AS SINGLE, f AS _BYTE
FOR CreateFrames = 0 TO 35
Frames(CreateFrames) = _NEWIMAGE(101, 101, 32)
_DEST Frames(CreateFrames)
CLS
'aof = 0 'ALL Stop to view fill: hey that's a darn good fill!!!!
aof = aof + pi / 18
crescentLFCA 50, 50, 50, aof
_CLEARCOLOR &HFF000000
NEXT
_DEST 0
transform Frames()
_DISPLAYORDER _SOFTWARE , _HARDWARE
DO
Circled X, Z, angle, 1.3
angle = angle + .01
FOR height = 1.2 - Z TO 1.2 - Z + .1 STEP .01 'this is BAD METHOD, because i am too lasy. For best power muss be next segment defined and draw between segment A and segment B with MAPTRIANGLE.
view3D 0 + X, height, -4 + Z, Frames(), f
NEXT
LOCATE 1, 1: PRINT "BPlus created color galaxy!"
_DISPLAY
f = f - 1: IF f < LBOUND(frames) THEN f = UBOUND(frames)
_LIMIT 20
LOOP
'cresecent Line Filled Circular Arcs combines arc drawing sub with crescentPattern sub
SUB crescentLFCA (x0, y0, r6, aoff) 'r6 is radius of 6 crescent pattern
DIM a12, r1, a6, x6, y6, x6m12, y6m12, i, al, a, x1, y1, x2, y2, c~&
r1 = r6 / 2 ' the radius of each crescent
a12 = 2 * pi / 12 ' 30 degrees to draw 12 arcs about x0, y0
a6 = 2 * pi / 6
FOR i = 1 TO 6 'draw 6 crescents find x, y of leading and trailing edges
x6 = x0 + r1 * COS(i * a6 + aoff): y6 = y0 + r1 * SIN(i * a6 + aoff) 'origins of leading edges
x6m12 = x0 + r1 * COS(i * a6 - a12 + aoff): y6m12 = y0 + r1 * SIN(i * a6 - a12 + aoff) 'origins of trailing edges
al = _PI * r1 * r1 * (pi + pi / 6) / _PI(2)
FOR a = (i * a6 + aoff - pi / 6) TO (i * a6 + aoff + pi) STEP 1 / al 'draw arc chords for dist a
x1 = x6 + r1 * COS(a): y1 = y6 + r1 * SIN(a) ' point on leading edge
x2 = x6m12 + r1 * COS(a): y2 = y6m12 + r1 * SIN(a) 'eqivalent point on trailing edge
IF i MOD 3 = 0 THEN
c~& = &HFF990000
ELSEIF i MOD 3 = 1 THEN
c~& = &HFF008800
ELSEIF i MOD 3 = 2 THEN
c~& = &HFF000099
END IF
LINE (x1, y1)-(x2, y2), c~&
NEXT
NEXT
END SUB
SUB transform (arr() AS LONG)
DIM t AS INTEGER, img32 AS LONG
FOR t = LBOUND(arr) TO UBOUND(arr)
img32 = _COPYIMAGE(arr(t))
arr(t) = _COPYIMAGE(img32, 33)
_FREEIMAGE img32
NEXT
END SUB
SUB view3D (x AS SINGLE, y AS SINGLE, z AS SINGLE, arr() AS LONG, frameNR AS INTEGER)
DIM w AS INTEGER, h AS INTEGER, width3d AS _BYTE, height3d AS _BYTE, depth3d AS _BYTE
w = _WIDTH(arr(frameNR))
h = _HEIGHT(arr(frameNR))
width3d = 1
height3d = 1
depth3d = 1
_MAPTRIANGLE (0, 0)-(w, 0)-(0, h), arr(frameNR) TO(x - width3d, y - height3d, z - 3 * depth3d)-(x + width3d, y - height3d, z - 3 * depth3d)-(x - width3d, y - height3d, z + 3 * depth3d)
_MAPTRIANGLE (w, 0)-(0, h)-(w, h), arr(frameNR) TO(x + width3d, y - height3d, z - 3 * depth3d)-(x - width3d, y - height3d, z + 3 * depth3d)-(x + width3d, y - height3d, z + 3 * depth3d)
END SUB
SUB Circled (GetX, GetZ, angle, radius)
GetX = SIN(angle) * radius
GetZ = COS(angle) * radius
END SUB