RetroBASIC
Basicprogramming(.org) => Code and examples => Topic started by: Galileo on May 31, 2017, 05:37:57 PM
-
I have developed for Yabasic 2.78.0 a simplified library for the generation of turtle graphics. It is based on an earlier Tomaaz library.
REM Simplified turtle commands for Yabasic 2.78.0, by Galileo, 5/2017.
REM Adapted from Tomaaz's turtle library.
export sub startTurtle() // Initialize turtle environment.
open window 850, 700
backcolor 0, 0, 0
clear window
home()
end sub
export sub move(long) // If positive, forward. Negative, backward.
local a, b, x, y
a = sin (angle * pi / 180) * long
b = cos (angle * pi / 180) * long
x = posx + a
y = posy - b
if draw then
line posx, posy, x, y
end if
posx = x
posy = y
end sub
export sub turn(degrees) // If positive, turn right. Negative, turn left.
angle = angle + degrees
if angle > 360 angle = angle - 360
if angle < 0 angle = angle + 360
end sub
export sub pen(state) // If 0, no draw. Another, draw.
draw = state // Global variable for this module.
end sub
export sub goxy (x, y) // Jump to location. No draw.
posx = x
posy = y
end sub
export sub gox (steps) // Jump steps pixels in x coord. No draw. Positive or negative.
posx = posx + steps
end sub
export sub goy (steps) // Jump steps pixels in y coord. No draw. Positive or negative.
posy = posy + steps
end sub
export sub reset () // Set angle to 0 degrees.
angle = 0 // Global variable for this module.
end sub
export sub posx() // Return turtle x location.
return posx
end sub
export sub posy() // Return turtle y location.
return posy
end sub
export sub angle() // Return turtle orientation.
return angle
end sub
export sub home() // Establish start mode.
reset()
posy = peek("winheight") / 2 // Global variable for this module.
posx = peek("winwidth") / 2 // Global variable for this module.
pen(1)
end sub
export sub arc(ang, radius) // Moves the turtle along an arc.
local i, stp, sgn
if ang < 0 then sgn = -1 else sgn = 1 end if
stp = (2 * pi * radius) / 360
for i = 1 to abs(ang)
move(stp)
turn(sgn)
next i
end sub
Code example
import turtle3
clear screen
startTurtle()
home()
goy(200)
pen(1)
color 0, 255, 0
tree(300)
sub tree(size)
if size < 5 then
move(size)
move(-size)
return
end if
move(size/3)
turn(-30)
tree(size*2/3)
turn(30)
move(size/6)
turn(25)
tree(size/2)
turn(-25)
move(size/3)
turn(25)
tree(size/2)
turn(-25)
move(size/6)
move(-size)
end sub
-
Adapted code from logo examples.
import turtle3
clear screen
startTurtle()
reset()
goxy(50,100)
rancolor()
square(40)
reset()
goxy(125,75)
rancolor()
rhombus()
reset()
goxy(225,100)
rancolor()
triang()
reset()
goxy(350,75)
rancolor()
windmill()
reset()
goxy(450,75)
rancolor()
tire()
reset()
goxy(550,75)
rancolor()
saw()
reset()
goxy(625,90)
rancolor()
polygon(6, 35)
reset()
goxy(750,75)
rancolor()
AWindow(50)
sub rancolor()
color ran(256), ran(256), ran(256)
end sub
sub rectang(k, m)
local i
for i = 1 to 2
move(k) : turn(90)
move(m) : turn(90)
next i
end sub
sub square(k)
rectang(k, k)
end sub
sub rhombus()
turn(45)
square(40)
turn(45)
end sub
sub triang()
local i
for i = 1 to 3
move(40)
turn(120)
next i
end sub
sub windmill()
local i
for i = 1 to 4
triang()
turn(90)
next i
end sub
// =================
sub tire()
llanta()
goma()
end sub
sub llanta()
local i
for i = 1 to 24
move(25) : move(-25) : turn(15)
next i
end sub
sub goma()
local i
pen(0)
for i = 1 to 360
move(25) : pen(1) : move(10)
pen(0) : move(-35) : turn(1)
next i
pen(1)
end sub
// ===================
sub diente()
move(40) : turn(-120) : move(20)
move(-20) : turn(120) : move(-40)
end sub
sub saw()
local i
for i=1 to 12
diente() : turn(-30)
next i
end sub
// ==================
sub polygon(n, k)
local i
for i = 1 to n
move(k) : turn(360/n)
next i
end sub
sub AWindow(k)
local i
for i=1 to 4
square(k/2) : turn(90)
next i
end sub
-
Nice tree!
-
More logo examples.
import turtle3
clear screen
startTurtle()
home()
gox(-350)
rancolor()
turbine(15)
home()
gox(-225)
rancolor()
fan(60, 7, 20)
home()
gox(-100)
turn(18)
rancolor()
star(5, 25)
home()
rancolor()
catch(20, 20)
home()
gox(150)
pen(1)
rancolor()
spiral(1, 3)
home()
gox(300)
pen(1)
asterix(32)
sub rancolor()
color ran(256), ran(256), ran(256)
end sub
sub rectang(k, m)
local i
for i = 1 to 2
move(k) : turn(90)
move(m) : turn(90)
next i
end sub
sub square(k)
rectang(k, k)
end sub
// =====================
sub turbine(k)
local i
for i = 1 to 18
move(2 * k) : square(k)
move(-2 * k) : turn(20)
next i
end sub
sub fan(k, m, p)
local i
turn(-p * 5)
for i=1 to p
rectang(k, m) : turn(10)
next i
turn(p * 5)
end sub
sub star(k, m)
local i
for i = 1 to k
move(m)
turn(720/k)
move(m)
turn(-(360/k))
next i
end sub
sub catch(k, m)
local i
for i = 1 to k
pen(1) : circle posx(), posy(), m
turn(720/k) : pen(0) : move(m/1.6)
next i
end sub
sub spiral(k, m)
if k < 1250 then
move(k/500)
turn(m)
spiral(k + m, m)
end if
end sub
sub asterix(size)
local i
if size > 1 then
for i = 1 to 5
move(size)
asterix(size * .4)
move(-size)
turn(72)
next i
end if
end sub
-
And more ...
import turtle3
clear screen
startTurtle()
home()
gox(-250)
rancolor()
turn(90)
koch(500, 8)
home()
gox(-100)
goy(100)
rancolor()
turn(90)
snowflake(200, 6)
sub rancolor()
color ran(256), ran(256), ran(256)
end sub
// =====================
sub koch(k, m)
if m = 0 then
move(k)
else
koch(k/3, m-1) : turn(-60)
koch(k/3, m-1) : turn(120)
koch(k/3, m-1) : turn(-60)
koch(k/3, m-1)
end if
end sub
sub snowflake(k, m)
local i
for i = 1 to 3
koch(k, m) : turn(120)
next i
end sub
-
Batman!
import turtle3
clear screen
startTurtle()
home()
goxy(100,600)
multiBatman()
sub rancolor()
color ran(256), ran(256), ran(256)
end sub
// =====================
sub multiBatman()
local i
for i = 0.1 to 0.8 step 0.2
reset()
gox(i * 300) : goy(i * 20)
rancolor()
batman(i)
next i
end sub
sub batman(scale)
local ax, ay
ax = posx() : ay = posy()
hemibatman(1, scale)
goxy(ax, ay)
turn(-263)
hemibatman(-1, scale)
end sub
sub hemibatman(sign, scale)
turn(sign * 5)
draw(30, scale * 3, sign * 1)
draw(250, scale * 0.3, sign * 0.5)
turn(sign * 45)
draw(15, scale * -3, sign * 1)
draw(240, scale * -0.4, sign * 0.7)
draw(10, scale * -3, sign * 1)
turn(sign * 50)
draw(160, scale * 1, sign * -0.6)
draw(100, scale * 1, sign * -0.5)
draw(80, scale * 1, sign * -0.2)
turn(sign * 70)
draw(20, scale * -3, sign * 2)
draw(200, scale * -0.4, sign * 0.7)
move(scale * -40)
turn(sign * 30)
draw(71, scale * 0.8, sign * 0.8)
end sub
sub draw(reps, st, turn)
local i
for i = 1 to reps
move(st) : turn(turn)
next i
end sub
-
A couple of spirals ...
import turtle3
clear screen
startTurtle()
home()
goxy(200, 200)
pen(1)
spircol(.5)
home()
goxy(450, 600)
pen(1)
spirdots(0.3)
sub rancolor()
color ran(256), ran(256), ran(256)
end sub
sub spircol(scale)
local i, c$(6)
c$(0) = "128,0,0" // red
c$(1) = "64,0,64" // purple
c$(2) = "0,0,128" // blue
c$(3) = "0,128,0" // green
c$(4) = "128,128,0" // yellow
c$(5) = "128,83,0" // orange
for i = 1 to 360
color(c$(mod(i,6)))
move(scale * i)
turn(-59)
next i
end sub
//===================
sub prong(i, scale)
pen(0)
move(scale * i)
pen(1)
fill circle posx(), posy(), scale * i / 20
pen(0)
move(scale * i)
end sub
sub spirdots(scale)
local i
for i = 360 to 1 step -1
rancolor()
prong(i, scale)
turn(61)
next i
end sub
-
Moons, stars, ...
import turtle3
clear screen
startTurtle()
home()
MoonAndStars()
sub Mjump()
home()
turn(ran(360))
pen(0)
gox(ran(600)-300)
goy(ran(600)-300)
end sub
sub Mlune(rad)
move(-rad) : turn(-90) : pen(1)
arc(240, rad) : turn(120)
arc(-120, rad)
pen(0) : turn(-150) : move(rad)
end sub
sub Mstar(rad)
local i
move(rad) : turn(162) : pen(1)
for i = 1 to 5
move(rad / 1.38) : turn(-72)
move(rad / 1.38) : turn(144)
next i
pen(0) : turn(-162) : move(-rad)
end sub
sub MoonAndStars()
local i
for i = 1 to 60
pen(0)
Mjump()
if int(ran(2)) then
color 128,128,128
Mlune(19)
else
color 255,255,00
Mstar(25)
end if
next i
end sub
-
Organic forms ...
import turtle3
clear screen
startTurtle()
home()
color 0, 0, 255
gox(-100)
goy(-100)
turn(270)
move(192)
arcWave(192)
home()
gox(-200)
goy(100)
pen(1)
rancolor()
curly(10)
home()
gox(100)
goy(175)
pen(1)
rancolor()
plant(100,0)
home()
gox(100)
goy(-150)
pen(1)
rancolor()
Orbs_1()
sub rancolor()
color ran(256), ran(256), ran(256)
end sub
sub arcWave(size)
if size < 20 return
turn(90)
pen(1)
arc(10, size)
turn(-90)
move(-size)
pen(0)
move(size)
arcWave(size / 1.11)
end sub
sub curly(size)
local i
if size < .5 return
for i = 1 to 360
switch i
case 5: turn(-90) : curly(size/2) : turn(90) : break
case 10: case 15: case 25: turn(-90) : curly(size/5) : turn(90) : break
case 20: turn(-90) : curly(size/4) : turn(90) : break
case 30: turn(-90) : curly(size/8) : turn(90) : break
end switch
move(size)
turn(i)
next i
turn(180)
end sub
sub plant(size, angle)
local i
if size < 1 return
turn(angle)
move(size)
for i = 1 to 4
plant(size/2, ran(160) - 80)
next i
move(-size)
turn(-angle)
end sub
sub Orbs_1()
local size, ang
size = 40
for ang = 0 to 360 step 360/48
pen(-1)
reset()
turn(ang - 90)
move(size) : pen(1)
circle posx(), posy(), size * sin(ang * 0.0174533)
pen(-1) : move(-size)
next ang
end sub
-
A classic fractal with a few instructions ...
import turtle3
clear screen
startTurtle()
home()
color 0, 255, 0
goxy(300,600)
fern(600)
sub fern(size)
If size < 7 return
move(size / 20)
turn(-80) : fern(size * 0.3)
turn(82) : move(size / 20)
turn(80) : fern(size * 0.3)
turn(-78) : fern(size * 0.9)
turn(-2) : move(-(size / 20))
turn(-2) : move(-(size / 20))
end sub
-
A lot of spirals ...
import turtle3
clear screen
startTurtle()
home()
PolySpiral()
sub PSpiral(length, angle)
color 0, length/2, 0
if length > 390 then
move(length/2)
return
end if
move(length) : turn(-angle)
PSpiral(length+4, angle)
end sub
sub PolySpiral()
local angle
for angle = 158 to 176 step 2
home()
clear window
color 255,255,255
text 275,100,"Poly spiral number " + str$(angle),"swiss30"
PSpiral(4, angle)
pause 2
next angle
end sub
-
Wow! nice collection!
-
Turning an equilateral triangle into a square: Dudeney's hinged dissection
This animation demonstrates how a triangle can be converted into a square (and vice versa). Compare this code with the javascript equivalent: http://bl.ocks.org/robinhouston/6016317 (http://bl.ocks.org/robinhouston/6016317)
import turtle3
startTurtle()
home()
Dudeney()
sub sqtri()
move(80) : turn(120) : move(160)
turn(120) : move(119.28) : turn(-42.12)
move(60) : turn(90) : move(104) : turn(90)
move(106) : turn(90) : move(53)
end sub
sub shape0()
move(52) : turn(90) : move(45.5) : turn(42.12)
move(41) : turn(120) : move(80)
end sub
sub shape1(offset)
turn(-offset) : move(80) : turn(120) : move(80)
shape2(offset) : turn(180 + offset)
move(60.5) : turn(90) : move(52)
end sub
sub shape2(offset)
turn(-offset) : move(80) : turn(120) : move(39)
shape3(offset) : turn(180 + offset)
move(52) : turn(90) : move(46)
end sub
sub shape3(offset)
turn(-offset) : move(80) : turn(137.88)
move(60) : turn(90) : move(52)
end sub
sub dudneyDraw(ang)
local offset
offset = 90 * (1 + cos(ang * 0.0174533))
home()
turn(210)
color 128, 128, 128
clear window
sqtri()
color 0, 255, 0
shape0()
shape1(offset)
pause .5
end sub
sub Dudeney()
local ang
for ang = 0 to 180 step 9
dudneyDraw(ang)
next ang
for ang = 180 to 0 step -9
dudneyDraw(ang)
next ang
end sub
-
Thank you, B +. Making graphics with turtle instructions is a lot of fun.
-
Hi Galileo,
The triangle hinge square thingy is nice find! Thanks for sharing. :)
-
Main question here is :
What is a license of this examples...he ...he... 8)
ps..it is joke question :D
Galileo...very nice examples ..i like it :D
-
The original tree program uses colors which looks awesome... below the BaCon version.
INCLUDE canvas.bac
OPTION VARTYPE double
WINDOW("Turtle Graphics Tree", 600, 600)
INK(0,0,0,255)
CLS
RESETANGLE
PENXY(300, 600)
PEN(1, TRUE)
CALL tree(400)
WAITKEY
SUB tree(size)
IF size < 5 THEN
DRAW(size)
DRAW(-size)
EXIT SUB
ENDIF
INK(0,255,0,255)
DRAW(size/3)
TURN(-30)
tree(size*2/3)
TURN(30)
INK(0,255,0,255)
DRAW(size/6)
TURN(25)
tree(size/2)
TURN(-25)
INK(0,255,0,255)
DRAW(size/3)
TURN(25)
tree(size/2)
TURN(-25)
INK(139,69,19,255)
DRAW(size/6)
DRAW(-size)
END SUB
-
Can't resist animations ;D
INCLUDE canvas-gd.bac
OPTION VARTYPE double
WINDOW("Dudeney", 500, 500)
RESETANGLE
PENXY(250, 250)
PEN(2, TRUE)
DELAY(80)
CALL Dudeney()
WAITKEY
SUB sqtri()
DRAW(80) : TURN(120) : DRAW(160)
TURN(120) : DRAW(119.28) : TURN(-42.12)
DRAW(60) : TURN(90) : DRAW(104) : TURN(90)
DRAW(106) : TURN(90) : DRAW(53)
END SUB
SUB shape0()
DRAW(52) : TURN(90) : DRAW(45.5) : TURN(42.12)
DRAW(41) : TURN(120) : DRAW(80)
END SUB
SUB shape1(offset)
TURN(-offset) : DRAW(80) : TURN(120) : DRAW(80)
CALL shape2(offset) : TURN(180 + offset)
DRAW(60.5) : TURN(90) : DRAW(52)
END SUB
SUB shape2(offset)
TURN(-offset) : DRAW(80) : TURN(120) : DRAW(39)
CALL shape3(offset) : TURN(180 + offset)
DRAW(52) : TURN(90) : DRAW(46)
END SUB
SUB shape3(offset)
TURN(-offset) : DRAW(80) : TURN(137.88)
DRAW(60) : TURN(90) : DRAW(52)
END SUB
SUB dudneyDraw(ang)
LOCAL offset
offset = 90 * (1 + COS(ang * 0.0174533))
PENXY(250, 250)
TURN(210)
INK(128, 128, 128, 255)
CLS
sqtri()
INK(0, 255, 0, 255)
shape0()
shape1(offset)
SYNC
END SUB
SUB Dudeney()
LOCAL ang
FOR ang = 0 TO 180 STEP 5
dudneyDraw(ang)
NEXT
FOR ang = 180 DOWNTO 0 STEP 5
dudneyDraw(ang)
NEXT
END SUB
(http://basic-converter.org/canvas/Dudeney.gif)
-
A small update to the library. Added the filling function and the possibility to show the orientation of the turtle.
REM Simplified turtle commands for Yabasic 2.78.0, by Galileo, 5/2017. Rev. 12/2017.
REM Adapted from Tomaaz's turtle library.
export sub startTurtle() // Initialize turtle environment.
open window 850, 700
backcolor 0, 0, 0
clear window
home()
end sub
export sub move(long) // If positive, forward. Negative, backward.
local a, b, x, y
a = sin (angle * pi / 180) * long
b = cos (angle * pi / 180) * long
x = posx + a
y = posy - b
if draw then
line posx, posy, x, y
end if
posx = x
posy = y
end sub
export sub turn(degrees) // If positive, turn right. Negative, turn left.
angle = angle + degrees
if angle > 360 angle = angle - 360
if angle < 0 angle = angle + 360
end sub
export sub pen(state) // If 0, no draw. Another, draw.
draw = state // Global variable for this module.
end sub
export sub goxy (x, y) // Jump to location. No draw.
posx = x
posy = y
end sub
export sub gox (steps) // Jump steps pixels in x coord. No draw. Positive or negative.
posx = posx + steps
end sub
export sub goy (steps) // Jump steps pixels in y coord. No draw. Positive or negative.
posy = posy + steps
end sub
export sub reset () // Set angle to 0 degrees.
angle = 0 // Global variable for this module.
end sub
export sub posx() // Return turtle x location.
return posx
end sub
export sub posy() // Return turtle y location.
return posy
end sub
export sub angle() // Return turtle orientation.
return angle
end sub
export sub home() // Establish start mode.
reset()
posy = peek("winheight") / 2 // Global variable for this module.
posx = peek("winwidth") / 2 // Global variable for this module.
pen(1)
end sub
export sub arc(ang, radius) // Moves the turtle along an arc.
local i, stp, sgn
if ang < 0 then sgn = -1 else sgn = 1 end if
stp = (2 * pi * radius) / 360
for i = 1 to abs(ang)
move(stp)
turn(sgn)
next i
end sub
export sub infill(test$) // Fill irregular shapes
wid = peek("winwidth") : hei = peek("winheight")
floodFill(posx, posy, test$)
end sub
sub floodFill(x, y, test$)
if test$ <> getbit$(x, y, x, y) then
dot x, y
floodFill(x + 1, y, test$)
floodFill(x - 1, y, test$)
floodFill(x, y + 1, test$)
floodFill(x, y - 1, test$)
end if
end sub
export sub turtle() // show turtle orientation
color 255,0,0
pen(true)
move(10)
fill circle posx, posy, 2
end sub
A little example.
import turtle3
clear screen
startTurtle()
home()
goxy(100,600)
multiBatman()
// =====================
sub multiBatman()
local i
for i = 0.1 to 0.8 step 0.2
reset()
gox(i * 200) : goy(i * -50)
turn(i*100)
color 128 * i, 128 * i, 255
batman(i)
next i
end sub
sub batman(scale)
local ax, ay, angle, color$
ax = posx() : ay = posy()
hemibatman(1, scale)
goxy(ax, ay)
color$ = getbit$(ax,ay,ax,ay)
turn(-263)
hemibatman(-1, scale)
pen(false) : turn(90) : move(5) : pen(true)
infill(color$)
end sub
sub hemibatman(sign, scale)
turn(sign * 5)
draw(30, scale * 3, sign * 1)
draw(250, scale * 0.3, sign * 0.5)
turn(sign * 45)
draw(15, scale * -3, sign * 1)
draw(240, scale * -0.4, sign * 0.7)
draw(10, scale * -3, sign * 1)
turn(sign * 50)
draw(160, scale * 1, sign * -0.6)
draw(100, scale * 1, sign * -0.5)
draw(80, scale * 1, sign * -0.2)
turn(sign * 70)
draw(20, scale * -3, sign * 2)
draw(200, scale * -0.4, sign * 0.7)
move(scale * -40)
turn(sign * 30)
draw(71, scale * 0.8, sign * 0.8)
end sub
sub draw(reps, st, turn)
local i
for i = 1 to reps
move(st) : turn(turn)
next i
end sub