\ ciforth 5.5.1. 64-bits
\ draait in de terminal
\
\ middelpunt xm ym
\ r  is de straal
\ x en y worden los van het middelpunt berekent.
\ vanaf x=o tot y2 de helft is van de startwaarde 
\ worden de berekeningen van y gemaakt 
\ via de plotxy functie wordt rest v.d. cirkel getekend.
\ 
\  geg y2   y-kwardraat
\  geg y     y actueel
\  geg yn   nieuwe y
\  geg kp  kantelpunt ( y2 waarde waaronder y=y-1 )
\  form:  y2  naar nieuwe (y-1)kwardraat  y2 -2x +1
\  ber KP  bestaande kp-2y + 1 \ startwaarde kp is r2 -2y +1

want AT-XY  -color- 
 
variable xm       \ x coord middelpunt
variable ym       \ y coord middelpunt
variable xx       \ x-waarde actueel
variable cirkelrond  \  y2 waarde waarbij cirkel compleet is
variable xscherm   110 xscherm !  \ grenzen terminalscherm
variable yscherm   50 yscherm !     
\ variable kleur

 : xy->8xy    \  van x y naar 8 paren x en y
          2dup negate     			\ x -y
          2dup swap negate swap  	\  -x -y
          2dup negate      			\  -x y   
          2dup swap        			\   y -x
          2dup negate      			\   y x
          2dup swap negate swap  	\ -y x 
          2dup negate  				\  -y -x
    ;

\ middelpunt er in verwerken
: xy->XY             \  ( x y --  X Y  )
         ym @ + swap
         xm @ + 2* swap   \ 2* vanwege de dubbele spatie
         ;

: binnen-terminalscherm?     ( X Y -  X Y fl)
         2dup 
         0 yscherm @ within     		\ X Y X fly
         swap 0 xscherm @ 1- within     \ X Y fly flx  
         and  
         ;
         
\ een punt wordt weergegeven door 2 gekleurde spaties
\ zodat de cirkel in de terminal ook ongeveer rond wordt
: prt2bl                            \ ( X Y -- ) 
            binnen-terminalscherm?   \ X Y fl 
            if at-xy  bblue  bl emit bl emit default-bw
            else 2drop  then ;

: plotxy             \  ( x y -- )
         xy->8xy
         8 0 do
               xy->XY  prt2bl
             loop ;  

: startwaarden       \  vanuit  opdracht cirkel met als gegevens
                     \  middelpunt  xm ym  en de straal r
      0 xx !
      swap  ym !
      swap  xm !           	\  r
      dup dup *            	\  r y2
      dup 2/ cirkelrond !
      swap                 	\  y2 y  	= r
      2dup - 1+ ;        	\  y2 y kp


: cirkel     \         ( xm ym r  --  )
      clear                 \ scherm leeg maken
      startwaarden  		\  op stack moet komen: y2 y kp
      >r  
      begin
          dup  xx @ swap plotxy   	\ y2 y   R: kp
          over						\ y2 y y2		
          cirkelrond @ > 
      while    
          1 xx +!
          swap xx @ 2* - 1+  			\  y y2n  =verlaagde y2
          dup r@  <            			\  y y2n fl    verg y2 met kp
             if                			\ kp en y moeten worden aangepast
              over 2* r> swap - 1+ >r   \  y y2n      nieuwe kp op R:
              swap 1-  swap             \  yn  y2n
             then                
           swap      					\  y2 y    R: kp
      repeat            
      rdrop  2drop  ; 					\ stacks schonen





