Goto 10 RetroComputing: Atari and more

Share this post

Archimedes Spiral in BASIC

www.goto10retro.com

Archimedes Spiral in BASIC

It's the famous "hat" image!

Paul Lefebvre
Apr 15, 2022
7
7
Share this post

Archimedes Spiral in BASIC

www.goto10retro.com

I’ve reviewing some of my ANALOG Computing magazines, starting with Issue 1 and have come up with a few things that I’ll be highlighting here. On of those things is a short BASIC program to display an Archimedes Spiral from ANALOG Computing Issue 7.

In the his column, Non-Tutorial VI, Charles Bachand includes this program to demonstrate both Atari graphics and then later how you might print it out.

This is the program:

The program takes a long time to run. According to the article, just under 3 hours! I typed it in and ran it on my 800XL and it definitely took a long time. Here is the finished image:

Running it on OSS BASIC XE in FAST mode was much faster, indeed. When I’m not using actual hardware, my emulator of choice is Atari 800MacX. When I let the emulator use the full speed of my Mac along with BASIC XE in FAST mode, it was drawing very quickly, finishing in about 15 minutes.

Turbo BASIC XL seemed even faster than BASIC XE.

If I also turn off the ANTIC screen updates (POKE 559,0 at start; POKE 559,34 at end), it finishes even quicker, about 10 minutes.

Subscribe for free to receive new posts and support my work.

Since this BASIC program is both short and easily translated to other languages, I thought I would quickly throw together versions for Xojo and Python.

Here is the Xojo version

1
, which runs in about 1 second or less:

// Archimedes Spiral
// Converted from Atari BASIC
// ANALOG Computing, Issue 7
// Non-Tutorial VI by Charles Bachand

g.DrawingColor = Color.White
g.FillRectangle(0, 0, g.Width, g.Height)

Const kSize = 144

Var xp As Integer = kSize
Var xr As Double = 4.71238905
Var xf As Double = xr / xp

For zi As Integer = -64 To 64
  Var zt As Double = zi * 2.25
  Var zs As Double = zt * zt
  Var xl As Double = Round(Sqrt(kSize * kSize - zs) + 0.5)
  
  For xi As Integer = 0 - xl To xl
    Var xt As Double = Sqrt(xi * xi + zs) * xf
    Var yy As Double = (Sin(xt) + Sin(xt * 3) * 0.4) * 56
    Var x1 As Double = xi + zi + 160
    Var y1 As Double = 90 - yy + zi
    
    g.DrawingColor = Color.Black
    g.DrawLine(x1, y1, x1, y1)
    
    If Not TransparentCheck.Value Then
      g.DrawingColor = Color.White
      g.DrawLine(x1, y1 + 1, x1, 191)
    End If
  Next
Next

Download the the Xojo project: ArchimedesSpiral

Here is the Python version, which also finishes in about a second:

#!/usr/bin/env python3
from graphics import *
import math

win = GraphWin(width = 320, height = 200, autoflush=False)
win.setBackground("white")

kSize = 144

xp = kSize
xr = 4.71238905
xf = xr / xp

for zi in range(-64, 64):
  zt = zi * 2.25
  zs = zt * zt
  xl = round(math.sqrt(kSize * kSize - zs) + 0.5)

  for xi in range(0-xl, xl):
    xt = math.sqrt(xi * xi + zs) * xf
    yy = (math.sin(xt) + math.sin(xt * 3) * 0.4) * 56
    x1 = xi + zi + 160
    y1 = 90 - yy + zi
    
    win.plot(x1, y1, "black")
    
    aLine = Line(Point(x1, y1 + 1), Point(x1, 191))
    aLine.setFill("white")
    aLine.draw(win)
    

update()
win.getMouse() # pause before closing

Thanks for reading Goto 10! Subscribe for free to receive new posts as soon as they are published.

1

I work for Xojo, so will likely often use it when showing sample code.

7
Share this post

Archimedes Spiral in BASIC

www.goto10retro.com
Previous
Next
7 Comments
cinzia greggio
Oct 5, 2022Liked by Paul Lefebvre

https://www.youtube.com/watch?v=M-BnxWd8yhA

ported to my PC_PIC board :)

Expand full comment
Reply
Michael Stoliker
Aug 14, 2022Liked by Paul Lefebvre

I typed this program in a ran it on my Atari 400 back in the day. I did the first run the day that the Superman movie with Christopher Reeves debuted on TV. So I was running back and forth to check progress on every commercial break. At the end of the movie I ran in to be greeted by a blank screen because I had forgotten line 260.

I use the program as a speed test on all variety of period computers and languages. I don't really bother with running it on modern computers or with optimizing the program because it doesn't tell me anything about relative speeds of period computers or languages to do either.

Expand full comment
Reply
5 more comments…
TopNewCommunity

No posts

Ready for more?

© 2023 Paul Lefebvre
Privacy ∙ Terms ∙ Collection notice
Start WritingGet the app
Substack is the home for great writing