In LB4 turtle graphics were useless for anything other than very simple- the turtle position and angle accumulated errors by being rounded off internally. LB5 seems much better, 'tho I've not deep-tested.
Here's a Maltese Cross. In LB4 the figure does not close. In 5 it does. So I can fill it with a colour- except dll calls now are not available ( ?yet?)
-
' Maltese Cross curve
nomainwin
global pi, TX, TY, Ttheta
'TX =250: TY =250: Ttheta =0 ' screen centre, pointing South/down. ' <<<<<<<<<<<<<<<<<<<<<<<<<
pi =4 *atn( 1)
WindowWidth =502
WindowHeight =582
graphicbox #w.g, -100, -100, 800, 900
open "Maltese Cross" for graphics_nsb as #w
hw =hwnd( #w.g)
calldll #user32, "GetDC", hw as ulong, hdc as ulong
#w "trapclose quit"
#w.g "down ; fill 180 180 80 ; size 1"
for p =1 to 200
F =0.04 +0.2 *rnd( 1) ' sets scale
r =int( 256 *rnd( 1))
g =int( 256 *rnd( 1))
bl =int( 256 *rnd( 1))
fillCol$ =str$( r) +" " +str$( g) +" " +str$( bl)
#w.g "color "; fillCol$
#w.g "backcolor "; fillCol$
targetcolor =bl *2^16 +g *2^8 +r ' this is colour to fill WITH
' this is also the colour of the outline to fill out TO.
TX =int( 0 +600 *rnd( 1)): TY =int( 100 +600 *rnd( 1)): Ttheta =-40 +80 *rnd( 1)
Cx =TX ' centre to fill from
Cy =TY -5
for j =1 to 4
call forward 120 *F
call turn -120
for i =1 to 20
call forward 7 *F
call turn 1
next i
call turn 110
for i =1 to 20
call forward 7 *F
call turn 1
next i
call turn -120
call forward 120 *F
next j
call delay 1000
calldll #gdi32, "ExtFloodFill",_
hdc as ulong,_
Cx as long,_
Cy as long,_
targetcolor as long,_ ' ie fill out 'til this colour is met..
_FLOODFILLBORDER as long,_
result as long
call delay 1000
next p
#w.g "getbmp scr 101 101 500 500"
bmpsave "scr", "MalteseCross" +str$( time$( "seconds")) +".bmp"
wait
sub delay sleeptime
'calldll #kernel32, "Sleep", sleeptime as long, ret as void
scan
end sub
sub quit h$
calldll #user32, "ReleaseDC", hw as ulong, hdc as ulong, ret as void 'release the DC
close #w
end
end sub
' <<<<<<<<<<<<<<<<<<<<<<<<<
function sinRad( a)
sinRad =sin( a *pi /180)
end function
function cosRad( a)
cosRad =cos( a *pi /180)
end function
sub draw lifted, x, y
if lifted =0 then #w "up" else #w "down"
#w.g "line "; TX; " "; TY; " "; x; " "; y
Ttheta =atan2( x -TX, TY -y) *180 /pi ' NB DEGREES.
TX =x
TY =y
end sub
sub turn angle ' increment/update global turtle direction ( in DEGREES)
Ttheta =( Ttheta +angle)
if Theta <0 then Ttheta =Ttheta +360
Ttheta =Ttheta mod 360
end sub
sub forward s
dx =s *cosRad( Ttheta)
dy =s *sinRad( Ttheta)
#w.g "down ; line "; TX; " "; TY; " "; TX +dx; " "; TY +dy; " ; up"
TX =TX +dx
TY =TY +dy
end sub
function atan2( x, y)
Result$ = "Undetermined"
If ( x = 0) and ( y > 0) Then atan2 = pi / 2: Result$ = "Determined"
If ( x = 0) and ( y < 0) Then atan2 = 3 * pi / 2: Result$ = "Determined"
If ( x > 0) and ( y = 0) Then atan2 = 0: Result$ = "Determined"
If ( x < 0) and ( y = 0) Then atan2 = pi: Result$ = "Determined"
If Result$ = "Determined" Then [End.of.function]
BaseAngle = Atn( abs( y) /abs( x))
If (x > 0) and (y > 0) Then atan2 = BaseAngle
If (x < 0) and (y > 0) Then atan2 = pi -BaseAngle
If (x < 0) and (y < 0) Then atan2 = pi +BaseAngle
If (x > 0) and (y < 0) Then atan2 = 2*pi -BaseAngle
[End.of.function]
end function
' <<<<<<<<<<<<<<<<<<<<<<<<<