|
Post by tenochtitlanuk on Sept 30, 2019 12:21:52 GMT -5
In a moment of madness I wondered if I could create a sine wave which was modulated at a higher frequency- but transverse to its current direction ( imagine bending a wire into a whole lot of small sin waves, then bending that wire bigger amounts but of much longer wavelength.) I thought turtle graphics would help.
Here's my first attempt- I got it wrong!!
|
|
|
Post by tenochtitlanuk on Sept 30, 2019 17:22:00 GMT -5
More accurately, turtle graphics WOULD have helped. But they can't be used for accurate graphics since they round off distances and angles. Luckily I wrote replacements long ago- so the errors don't accumulate as in the first attempt.
|
|
|
Post by tenochtitlanuk on Oct 8, 2019 17:19:28 GMT -5
Basically, here's a warning to LB-ers not to use inbuilt turtle commands for accurate results. It stores nearest screen position and/or an integer angle, so each move/draw can be wrong by up to half a pixel. The next move then starts from the wrong position/angle, and in figures with finer detail than a large square it goes badly and unpredictably wrong. Example is my Koch curve example.. see rosettacode.org/wiki/Koch_curveMy replacements for draw and turning store x, y and orientation as floats, so errors should not exceed one pixel.
|
|
|
Post by tsh73 on Oct 9, 2019 2:30:56 GMT -5
Ok John we believe your library is great. Could we get it?
|
|
|
Post by tenochtitlanuk on Oct 9, 2019 2:59:53 GMT -5
Haven't added a page to my site yet- tho' I had similar code on the old forum. Code follows- easily adapted for any other curve that is most easily described in turtle language..
nomainwin
' Demonstrates turtle drawn directly, avoiding LB's turtle errors and giving ' direct access to turtle's position/heading, saved in globals. global pi, TX, TY, Ttheta pi =4 *atn( 1): TX =102: TY =252: Ttheta =0 ' screen left, centred vertically, pointing west
nomainwin
WindowWidth =1100: WindowHeight =700
open "Demo Koch Snowflake" for graphics_nsb as #wg
#wg "trapclose quit" #wg "backcolor white" #wg "goto 2 2 ; down ; box 1202 702 ; up"
call graticule
l =160
for d =0 to 5 TX = 180 *d +26 ' <<<< start position, direction of each Koch curve. TY = 87 *d +51 Ttheta =0
for side =1 to 3 call fwd l, d call turn 120 next side
#wg "flush"
next d
#wg "flush" '#wg "print 1110"
wait
sub quit h$ call save$ close #h$ end end sub
sub fwd length, depth scan if depth <= 0 then call forward length else call fwd length /3, depth -1: call turn -60 call fwd length /3, depth -1: call turn 120 call fwd length /3, depth -1: call turn -60 call fwd length /3, depth -1 end if
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 #wg "up" else #wg "down" ' #wg "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) 'mod 360 end sub
sub forward s dx =s *cosRad( Ttheta) dy =s *sinRad( Ttheta) #wg "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
sub graticule #wg "down" for x =0 to 1500 step 50 ' draw vertical graticule lines 'if x =( Tx -2) then #wg "size 4 ; color red" else #wg "size 2 ; color white" #wg "line "; x +2; " "; 2; " "; x +2; " "; 702 next x for y =0 to 800 step 50 #wg "line "; 2; " "; y +2; " "; 1202; " "; y +2 next y #wg "up" end sub
sub saveS #wg "flush" #wg "getbmp scr 0 0 1110 710" filedialog "Save as ", "*.bmp", fn$ bmpsave "scr", fn$ end sub
|
|
|
Post by tsh73 on Oct 9, 2019 12:54:30 GMT -5
Ok I remember having troubles drawing Pythagoras tree with turtle So I found it and then fixed with John's code. First, drawings - source and fixed really, mainly change #gr "turn -90" #gr "go ";l #gr "turn 45"
to call turn -90 call forward l call turn 45
Source code 'some recursive drawing global minLength minLength = 5 nomainwin WindowWidth = 640 WindowHeight = 480 UpperLeftX = (DisplayWidth - WindowWidth )/2 UpperLeftY = (DisplayHeight - WindowHeight )/2
open "gr" for graphics_nsb as #gr #gr "trapclose [quit]" #gr "home ; down ; posxy midX midY" width = 2*midX : height = 2*midY
l = 100 #gr "place ";midX-l/2;" ";400 #gr "turn 90" ' print l call box l #gr "color red; go 10" wait
sub box l 'recursion exit condition scan if l < minLength then 'it should left in same position as if drawn #gr "go ";l exit sub end if 'draw a box for i = 1 to 4 #gr "color ";word$("red green blue black",i) #gr "go ";l #gr "turn -90" next 'set place for a next box #gr "turn -90" #gr "go ";l #gr "turn 45" 'call recursively call box l/sqr(2) 'goto next position #gr "turn 90" 'call recursively call box l/sqr(2) 'now set to back position... #gr "turn 45" #gr "go ";l #gr "turn -90" end sub
[quit] close #gr end fixed code 'some recursive drawing '+Turtle fix by Tenochtitlanuk ' Demonstrates turtle drawn directly, avoiding LB's turtle errors and giving ' direct access to turtle's position/heading, saved in globals. global pi, TX, TY, Ttheta pi =4 *atn( 1): TX =102: TY =252: Ttheta =0 ' screen left, centred vertically, pointing west ' // --------------------------------- global minLength minLength = 4 nomainwin WindowWidth = 640 WindowHeight = 480 UpperLeftX = (DisplayWidth - WindowWidth )/2 UpperLeftY = (DisplayHeight - WindowHeight )/2
open "gr" for graphics_nsb as #gr #gr "trapclose [quit]" #gr "home ; down ; posxy midX midY" width = 2*midX : height = 2*midY
l = 100 TX =midX-l/2: TY =400 ' print l call box l #gr "color red; go 10" wait
sub box l 'recursion exit condition scan if l < minLength then 'it should left in same position as if drawn call forward l exit sub end if 'draw a box for i = 1 to 4 #gr "color ";word$("red green blue black",i) call forward l call turn -90 next 'set place for a next box call turn -90 call forward l call turn 45 'call recursively call box l/sqr(2) 'goto next position call turn 90 'call recursively call box l/sqr(2) 'now set to back position... call turn 45 call forward l call turn -90 end sub
[quit] close #gr end
'------------------------------------------------- 'Turtle fix by Tenochtitlanuk, with globals above sub turn angle ' increment/update global turtle direction ( in DEGREES) Ttheta =( Ttheta +angle) 'mod 360 end sub
sub forward s dx =s *cosRad( Ttheta) dy =s *sinRad( Ttheta) #gr "down ; line "; TX; " "; TY; " "; TX +dx; " "; TY +dy; " ; up" TX =TX +dx TY =TY +dy end sub
function sinRad( a) sinRad =sin( a *pi /180) end function
function cosRad( a) cosRad =cos( a *pi /180) end function
|
|