RosettaCodeData/Task/Sierpinski-square-curve/FutureBasic/sierpinski-square-curve.basic
2026-04-30 12:34:36 -04:00

95 lines
1.9 KiB
Text

// -------------------------
// Sierpinski Square Curve
//
// Using FutureBasic 7.0.34
// August 2025, R.W.
//
// -------------------------
dim as long ord = 5 // recursion depth
dim as double segLen = 7 // length of each step
dim as double xpos, ypos
dim as int dirn
CGFloat red, green, blue
colorref Colr
// Create main window
void local fn BuildMainWindow(wTag as NSInteger)
colorref wco
CGRect r
SInt32 wndStyleMask
wco = fn ColorBlack
wndStyleMask = NSWindowStyleMaskTitled
wndStyleMask += NSWindowStyleMaskClosable
r = fn CGRectMake( 0, 0, 560, 540 )
window wTag, @" Sierpinsky Square Curve ", r, wndStyleMask
WindowSetBackgroundColor(wTag, wco)
ViewSetFlipped( _WindowContentViewTag, YES )
windowcenter (wTag)
AppSetAppearance(fn AppearanceNamed(NSAppearanceNameDarkAqua))
end fn
//
// Draw forward in current direction
//
local fn Forward(d as int)
select case (dirn AND 3)
case 0 : xpos = xpos + segLen
case 1 : ypos = ypos + segLen
case 2 : xpos = xpos - segLen
case 3 : ypos = ypos - segLen
end select
line xpos, ypos
red = 0.90
green = 0.90
blue = 0.00
Colr = fn ColorWithRGB(red,green,blue,1.0)
pen 2, Colr
Oval fill (xpos, ypos, 1, 1),Colr
dirn = dirn + d
end fn
//
// Recursive square curve
//
local fn S(level as int)
if level > 0
fn S(level - 1)
fn Forward(-1)
fn Forward(+1)
fn Forward(-1)
fn S(level - 1)
fn Forward(+1)
fn Forward(+1)
fn S(level - 1)
fn Forward(-1)
fn Forward(+1)
fn Forward(-1)
fn S(level - 1)
end if
end fn
// -------------------------
// Main
fn BuildMainWindow(1)
// starting position
xpos = 560 /2
ypos = 50
dirn = 0
line xpos, ypos
// axiom: F(+1) S(ord-1) F(+1) F(+1) S(ord-1) F
//
fn Forward(+1) // F(+1)
fn S(ord - 1) // S(ord-1)
fn Forward(+1) // F(+1)
fn Forward(+1) // F(+1)
fn S(ord - 1) // S(ord-1)
fn Forward(0) // final F with no turn
handleEvents