REM ****** connected wheels ****** by smbstarv
'y'
     hgtipad=724
     wdipad=1024
 START:
     SET ORIENTATION ALL
     SET TOOLBAR ON
     GET SCREEN SIZE wd,hgt
     wr=wd/wdipad
     hr=hgt/hgtipad
     rd=MIN(wr,hr)                               'reduction factor if device other than iPad
     
'b'
     OPTION ANGLE DEGREES
     OPTION SPRITE POS CENTRAL
     h=SCREEN_HEIGHT()
     w=SCREEN_WIDTH()
     mx=w/2
     my=h/2
     
     r0=60                                       'radius inner wheel
     r13=150                                     'radius in-between wheel
     r03=r0+r13                                  '
     r4=r0+r13*2                                 'radius outer wheel
     rat14=r13/r4                                'ratio's
     rat10=r13/r0
     
     r0*=rd                                      'reduction if necessary
     r13*=rd
     r03*=rd
     r4*=rd
     
     GRAPHICS
     GRAPHICS CLEAR 0,0,0
     DRAW COLOR 1,1,1
     FILL COLOR 1,1,0
     dsh=10                                       'dash parameter
     
'SPRITES  WHEELS
     SPRITE "0" BEGIN 2*r0,2*r0                  'inner wheel named E
     DRAW DASH dsh
     DRAW CIRCLE r0,r0 SIZE r0
     DRAW FONT SIZE 35
     DRAW TEXT "E" AT r0*.85,r0*.85
     FILL CIRCLE 0,r0 SIZE 5                     'yellow dot
     SPRITE END
     
     SPRITE 4 BEGIN 2*r4,2*r4                    'outer wheel named A
     DRAW DASH dsh
     DRAW CIRCLE r4,r4 SIZE r4
     DRAW FONT SIZE 70
     DRAW TEXT "A" AT 1*r4,0
     FILL CIRCLE 0,r4 SIZE 5                     'yellow dot
     SPRITE END
     
     FOR i=1 TO 3
         SPRITE i BEGIN 2*r13,2*r13              'in-between wheels B, C and D
         DRAW DASH dsh
         DRAW CIRCLE r13,r13 SIZE r13
         DRAW FONT SIZE 50
         DRAW TEXT CHR$(65+i) AT r13*.85,r13*.85 'named B C and D
         FILL CIRCLE 0,r13 SIZE 5                'yellow dot
         SPRITE END
     NEXT i
     
     RANDOMIZE
     SPRITE 0 AT mx,my ANGLE 0
     SPRITE 4 AT mx,my ANGLE 0
     SPRITE 0 SHOW
     SPRITE 4 SHOW
     
     FOR i=1 TO 3
         SPRITE i AT mx+(r03)*COS(-120+i*120),my+(r03)*SIN(-120+i*120) ANGLE RND(360)
         SPRITE i SHOW
     NEXT i
     
'SLIDERS and BUTTON
     rpm=.5
     DRAW FONT SIZE 25
     DRAW TEXT "E rpm" AT 900*rd,80*rd           'rotation speed of inner wheel
     DRAW TEXT "++" AT 970*rd,120*rd
     DRAW TEXT " 0" AT 970*rd,355*rd
     DRAW TEXT "--" AT 970*rd,580*rd
     SLIDER "G" VALUE rpm AT 950*rd,100*rd  SIZE 500 ANGLE 90
     SLIDER "G" SHOW
     
     DRAW TEXT "A rpm" AT 50*rd,80*rd            'rotation speed of outer wheel
     DRAW TEXT "++" AT 100*rd,120*rd
     DRAW TEXT " 0" AT 100*rd,355*rd
     DRAW TEXT "--" AT 100*rd,580*rd
     SLIDER "A" VALUE rpm AT 80*rd,100*rd  SIZE 500 ANGLE 90
     SLIDER "A" SHOW
     
     
     
     
'r'
'initial speeds
     dha=0                                      'outer wheel
     dhe=0                                     'inner wheel

 cycl:
     dhb=(dha*r4-dhe*r0)/2/r13
     dhg=(dha*r4+dhe*r0)/2/r03
     GET SPRITE 4 ANGLE alfa                     'current rotation angle of outer wheel
     GET SPRITE 0 ANGLE epsilon                  'current rotation angle of inner wheel
     FOR i=1 TO 3
         GET SPRITE i ANGLE beta                 'current rotation angle of in-between wheel
         GET SPRITE i POS x,y                    'current position of in-between wheel
         x-=mx                                   'relative to central point
         y-=my
         
         beta+=dhb                               'rotation increment of in-between wheels
         gamma=atg(y,x)                          'calculate new pos of in-between wheels
         gamma+=dhg
         xx=(r03)*COS(gamma)                     'new position of in-between wheels
         yy=(r03)*SIN(gamma)
         SPRITE i AT mx+xx,my+yy ANGLE beta
     NEXT i
     
     alfa+=dha                                   'rotation increment of outer wheel
     alfa%=360
     SPRITE 4 AT mx,my ANGLE alfa
     
     epsilon+=dhe                                'rotation increment of inner wheel
     epsilon%=360
     SPRITE 0 AT mx,my ANGLE epsilon
     
     PAUSE 0.01                                  'visualization tempo
     
     IF SLIDER_CHANGED("G") THEN                 'change rotationspeed of inner wheel
         dhe=-(SLIDER_VALUE("G")-.5)*8
     ENDIF
     IF SLIDER_CHANGED("A") THEN                 'change rotationspeed of outer wheel
         dha=(SLIDER_VALUE("A")-.5)*2
     END IF

     GOTO cycl
     STOP
     
     
'c'
     
     DEF atg(y,x)                                'arctangent for 0-360 degrees
         IF y=>0 THEN
             IF x<0 THEN atg=180-ATAN(-y/x)
             IF x=0 THEN atg=90
             IF x>0 THEN atg=ATAN(y/x)
         END IF
         IF y<0 THEN
             IF x<0 THEN atg=ATAN(y/x)+180
             IF x=0 THEN atg=270
             IF x>0 THEN atg=360-ATAN(-y/x)
         END IF
     END DEF
     
     DEF db
         DEBUG PAUSE
     END DEF
     
     
     
     
     
