Maltese Cross


Code

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
                                                               '   <<<<<<<<<<<<<<<<<<<<<<<<<