3D Plot
Description of the page content
Conversion of 3D Plot to several programming languages.
Usually 3D Plot is the second program converted in the Basics off projects.
This program has been converted to 28 programming languages.
Original
Origin of 3d_plot.bas:
3-D Plot (by Mark Bramhall), 1978.
Creative Computing's BASIC Games.
- http://vintage-basic.net/games.html
- http://vintage-basic.net/bcg/3dplot.bas
- https://www.atariarchives.org/basicgames/showpage.php?page=167
1 PRINT TAB(32);"3D PLOT"
2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
3 PRINT:PRINT:PRINT
5 DEF FNA(Z)=30*EXP(-Z*Z/100)
100 PRINT
110 FOR X=-30 TO 30 STEP 1.5
120 L=0
130 Y1=5*INT(SQR(900-X*X)/5)
140 FOR Y=Y1 TO -Y1 STEP -5
150 Z=INT(25+FNA(SQR(X*X+Y*Y))-.7*Y)
160 IF Z<=L THEN 190
170 L=Z
180 PRINT TAB(Z);"*";
190 NEXT Y
200 PRINT
210 NEXT X
300 END
Output
*
* * *
* * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * * * *
* * * * * * * * * * *
* * * * * * ** * * *
* * * * * * * * * *
* * * * * * * * *
* * * * * ** *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * ** *
* * * * * * * * *
* * * * * * * * * *
* * * * * * ** * * *
* * * * * * * * * * *
* * * * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * *
* * *
*
In Ada
-- 3D Plot
--
-- Original version in BASIC:
-- 3-D Plot (by Mark Bramhall), 1978.
-- Creative Computing's BASIC Games.
-- - http://vintage-basic.net/games.html
-- - http://vintage-basic.net/bcg/3dplot.bas
-- - https://www.atariarchives.org/basicgames/showpage.php?page=167
--
-- This version in Ada:
-- Copyright (c) 2025, Marcos Cruz (programandala.net);
-- SPDX-License-Identifier: Fair
--
-- Written on 2025-03-19, 2025-03-29.
--
-- Last modified: 20251204T2259+0100.
with ada.numerics;
use ada.numerics;
with ada.numerics.elementary_functions;
use ada.numerics.elementary_functions;
with ada.text_io;
use ada.text_io;
procedure plot_3d is
procedure move_cursor_home is
escape : constant character := character'val (16#1B#); -- 0x1B
begin
put (escape & "[H");
end move_cursor_home;
procedure erase_screen is
escape : constant character := character'val (16#1B#); -- 0x1B
begin
put (escape & "[2J");
end erase_screen;
procedure clear_screen is
begin
erase_screen;
move_cursor_home;
end clear_screen;
procedure wait_for_keypress (expected_char : character) is
pressed_char : character;
is_a_char_available : boolean;
begin
loop
ada.text_io.get_immediate (pressed_char, is_a_char_available);
if (pressed_char = expected_char) then
exit;
end if;
end loop;
end wait_for_keypress;
procedure print_credits is
begin
put_line ("3D Plot");
new_line;
put_line ("Original version in BASIC:");
put_line (" Creative computing (Morristown, New Jersey, USA), ca. 1980.");
new_line;
put_line ("This version in Ada:");
put_line (" Copyright (c) 2025, Marcos Cruz (programandala.net)");
put_line (" SPDX-License-Identifier: Fair");
new_line;
put ("Press Enter to start the program. ");
wait_for_keypress (character'val (16#0a#)); -- 0x0a, the enter character
end print_credits;
function a (z : float) return float is
begin
return 30.0 * exp (-z * z / 100.0);
end a;
procedure draw is
space : constant character := ' ';
dot : constant character := '*';
width : constant integer := 56;
l : integer;
z : integer;
y : integer;
y1 : integer;
line : array (0 .. width - 1) of character;
x : float := -30.0;
begin
while x <= 30.0 loop
for c in 0 .. width - 1 loop
line (c) := space;
end loop;
l := 0;
y1 :=
5
* integer (
float'truncation (sqrt (900.0 - x * x) / 5.0)
);
y := y1;
while y >= -y1 loop
z := integer (
float'truncation (
25.0
+ a (sqrt (x * x + float (y * y)))
- 0.7 * float (y)
)
);
if z > l then
l := z;
line (z) := dot;
end if;
y := y - 5;
end loop;
for pos in 0 .. width - 1 loop
put (line (pos));
end loop;
new_line;
x := x + 1.5;
end loop;
end draw;
begin
clear_screen;
print_credits;
clear_screen;
draw;
end plot_3d;
In Arturo
; 3D Plot
; Original version in BASIC:
; 3-D Plot (by Mark Bramhall), 1978.
; Creative Computing's BASIC Games.
; - http://vintage-basic.net/games.html
; - http://vintage-basic.net/bcg/3dplot.bas
; - https://www.atariarchives.org/basicgames/showpage.php?page=167
; This version in Arturo:
; Copyright (c) 2023, Marcos Cruz (programandala.net)
; SPDX-License-Identifier: Fair
;
; Written on 2023-10-17.
;
; Last modified: 20251205T0043+0100.
SPACE: ` `
DOT: `*`
WIDTH: 56
; Display the credits and wait for a keypress.
printCredits: function [] [
print "3D Plot\n"
print "Original version in BASIC:"
print " Creative computing (Morristown, New Jersey, USA), ca. 1980.\n"
print "This version in Arturo:"
print " Copyright (c) 2023, Marcos Cruz (programandala.net)"
print " SPDX-License-Identifier: Fair\n"
input "Press Enter to start the program."
]
a: function [z] [
mul 30 exp div (mul neg z z) 100
]
draw: function [] [
x: neg 30
while [not? greater? x 30] [
line: array.of: WIDTH SPACE
l: 0
y1: mul 5 floor div sqrt(sub 900 (mul x x)) 5
loop y1 .. (neg y1) .step: 5 'y [
z: floor (add 25 sub a(sqrt(add mul x x mul y y)) (mul 0.7 y))
if greater? z l [
l: z
line\[z]: DOT
]
] ; y loop
loop 0 .. (sub WIDTH 1) 'pos [
prints line\[pos]
]
print ""
add 'x 1.5
] ; x loop
]
clear
printCredits
clear
draw
In C#
// 3D Plot
// Original version in BASIC, "3D Plot":
// 3-D Plot (by Mark Bramhall), 1978.
// Creative Computing's BASIC Games.
// - http://vintage-basic.net/games.html
// - http://vintage-basic.net/bcg/3dplot.bas
// - https://www.atariarchives.org/basicgames/showpage.php?page=167
// This version in C#:
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2024-12-20.
//
// Last modified: 20251205T1528+0100.
using System;
class D3Plot
{
static void PrintCredits()
{
Console.WriteLine("3D Plot\n");
Console.WriteLine("Original version in BASIC:");
Console.WriteLine(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n");
Console.WriteLine("This version in C#:");
Console.WriteLine(" Copyright (c) 2024, Marcos Cruz (programandala.net)");
Console.WriteLine(" SPDX-License-Identifier: Fair\n");
Console.Write("Press any key to start. ");
Console.ReadKey();
}
static double A(double z)
{
return 30 * Math.Exp(-z * z / 100);
}
static void Draw()
{
const int WIDTH = 56;
const char SPACE = ' ';
const char DOT = '*';
int l = 0;
int z = 0;
int y = 0;
int y1 = 0;
char[] line = new char[WIDTH];
double x = -30.0;
while (x <= 30.0)
{
for (int i = 0; i < WIDTH; i++)
{
line[i] = SPACE;
}
l = 0;
y1 = 5 * (int)(Math.Sqrt(900 - x * x) / 5);
y = y1;
while (y >= -y1)
{
z = (int)(25 + A(Math.Sqrt(x * x + (double)(y * y))) - 0.7 * y);
if (z > l)
{
l = z;
line[z] = DOT;
};
y += -5;
} // y loop
foreach (char c in line)
{
Console.Write(c);
}
Console.WriteLine();
x += 1.5;
} // x loop
}
static void Main()
{
Console.Clear();
PrintCredits();
Console.Clear();
Draw();
}
}
In C3
// 3D Plot
// Original version in BASIC:
// Creative Computing (Morristown, New Jersey, USA), ca. 1980.
// This version in C3:
// Copyright (c) 2025, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2025-03-07.
//
// Last modified: 20250307T1349+0100.
import std::io;
const SPACE = " ";
const DOT = "*";
const WIDTH = 56;
fn void clearScreen() {
io::printn("\e[0;0H\e[2J");
}
fn String acceptString(String prompt = "") {
io::print(prompt);
String! s = io::readline();
if (catch excuse = s) {
return "";
} else {
return s;
}
}
fn void pressEnter(String prompt = "") {
String discard = acceptString(prompt);
free(discard);
}
fn void printCredits() {
io::printn("3D Plot\n");
io::printn("Original version in BASIC:");
io::printn(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n");
io::printn("This version in C3:");
io::printn(" Copyright (c) 2025, Marcos Cruz (programandala.net)");
io::printn(" SPDX-License-Identifier: Fair\n");
pressEnter("Press Enter to start. ");
}
fn double a(double z) {
return 30.0 * $$exp(-z * z / 100.0);
}
fn void draw() {
int l = 0;
int z = 0;
int y1 = 0;
String[WIDTH] line = {};
for (double x = -30.0; x <= 30.0; x += 1.5) {
for (int i = 0; i < WIDTH; i += 1) {
line[i] = SPACE;
}
l = 0;
y1 = 5 * (int)($$sqrt(900.0 - x * x) / 5.0);
for (int y = y1; y >= -y1; y += -5) {
z = (int)(25.0 + a($$sqrt(x * x + (double)(y * y))) - 0.7 * (double)y);
if (z > l) {
l = z;
line[z] = DOT;
}
} // y loop
for (int pos = 0; pos < WIDTH; pos += 1) {
io::print(line[pos]);
}
io::printn();
} // x loop
}
fn void main() {
clearScreen();
printCredits();
clearScreen();
draw();
}
In Chapel
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Chapel:
Copyright (c) 2025, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2025-04-04.
Last modified 20250405T2002+0200.
*/
import IO;
import Math;
const space = " ";
const dot = "*";
const width = 56;
// Erase the screen, reset the attributes and move the cursor to the home
// position.
proc clear() {
write("\x1B[2J\x1B[0m\x1B[H");
}
// Clear the screen, display the credits and wait for a keypress.
proc printCredits() {
clear();
writeln("3D Plot\n");
writeln("Original version in BASIC:");
writeln(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n");
writeln("This version in Chapel:");
writeln(" Copyright (c) 2025, Marcos Cruz (programandala.net)");
writeln(" SPDX-License-Identifier: Fair\n");
writeln("Press Enter to start the program.");
IO.readLine();
}
proc a(z: real): real {
return 30 * Math.exp(-z * z / 100);
}
proc draw() {
var l: int = 0;
var z: int = 0;
var y1: int = 0;
var line: [0 ..< width] string;
clear();
var x: real = -30.0;
while x <= 30.0 {
for pos in 0 ..< width {
line[pos] = space;
}
l = 0;
y1 = 5 * (sqrt(900 - x * x) / 5): int;
var y: int = y1;
while y >= -y1 {
z = (25 + a(sqrt(x * x + (y * y): real)) - 0.7 * (y): real): int;
if z > l {
l = z;
line[z] = dot;
}
y += -5;
} // y loop
for pos in 0 ..< width {
write(line[pos]);
}
writeln("");
x += 1.5;
} // x loop
}
proc main() {
printCredits();
draw();
}
In Crystal
# 3D Plot
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
# This version in Crystal:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written on 2023-09, 2023-11.
#
# Last modified: 20231104T0055+0100.
SPACE = ' '
DOT = '*'
WIDTH = 56
def clear
print "\e[0;0H\e[2J"
end
def print_credits
puts "3D Plot\n"
puts "Original version in BASIC:"
puts " Creative computing (Morristown, New Jersey, USA), ca. 1980.\n"
puts "This version in Crystal:"
puts " Copyright (c) 2023, Marcos Cruz (programandala.net)"
puts " SPDX-License-Identifier: Fair\n"
puts "Press Enter to start the program."
gets
end
def a(z)
return 30 * Math.exp(-z * z / 100)
end
def draw
x = -30.0
while x <= 30
c = 0
line = Array.new WIDTH, SPACE
l = 0
y1 = 5 * (Math.sqrt(900 - x * x) / 5).to_i
y = y1
while y >= -y1
z = (25 + a(Math.sqrt(x * x + y * y)) - 0.7 * y).to_i
if z > l
l = z
line[z] = DOT
end
y += -5
end
c = 0
line.each do |item|
print item
end
puts
x += 1.5
end
end
clear
print_credits
clear
draw
In D
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in D:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-03-25/26.
Last modified 20251220T0654+0100.
*/
module three_d_plot;
/// Erase the screen, reset the attributes and move the cursor to the home
/// position.
void clear()
{
import std.stdio : write;
write("\033[2J\033[0m\033[H");
}
/// Clear the screen, display the credits and wait for a keypress.
void printCredits()
{
import std.stdio : readln;
import std.stdio : writeln;
clear();
writeln("3D Plot\n");
writeln("Original version in BASIC:");
writeln(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n");
writeln("This version in D:");
writeln(" Copyright (c) 2023, Marcos Cruz (programandala.net)");
writeln(" SPDX-License-Identifier: Fair\n");
writeln("Press Enter to start the program.");
readln();
}
float a(float z)
{
import std.math : exp;
return 30 * exp(-z * z / 100);
}
void draw()
{
import std.stdio : write;
import std.stdio : writeln;
import std.math : sqrt;
enum char dot = '*';
enum char space = ' ';
enum int width = 56;
int l = 0;
int z = 0;
int y1 = 0;
char[width] line;
clear();
for (float x = -30.0; x <= 30.0; x += 1.5)
{
for (int pos = 0; pos<width; pos++)
{
line[pos] = space;
}
l = 0;
y1 = 5 * cast(int)(sqrt(900 - x * x) / 5);
for (int y = y1; y >= -y1; y += -5)
{
z = cast(int)(25 + a(sqrt(x * x + cast(float)(y * y))) - 0.7 * cast(float)(y));
if (z > l)
{
l = z;
line[z] = dot;
}
} // y loop
for (int pos = 0; pos<width; pos++)
{
write(line[pos]);
}
writeln();
} // x loop
}
void main()
{
printCredits();
draw();
}
In F#
// 3D Plot
// Original version in BASIC, "3D Plot":
// Creative Computing (Morristown, New Jersey, USA), ca. 1980.
// This version in F# 5.0:
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2024-12-20.
//
// Last modified: 20241231T1245+0100.
open System
let PrintCredits() =
printfn "3D Plot\n"
printfn "Original version in BASIC:"
printfn " Creative computing (Morristown, New Jersey, USA), ca. 1980.\n"
printfn "This version in F# 5.0:"
printfn " Copyright (c) 2024, Marcos Cruz (programandala.net)"
printfn " SPDX-License-Identifier: Fair\n"
printf "Press any key to start. "
Console.ReadKey() |> ignore
let A z =
30.0 * Math.Exp(-z * z / 100.0)
let Draw() =
let WIDTH = 56
let SPACE = ' '
let DOT = '*'
let mutable l = 0
let mutable z = 0
let mutable y = 0
let mutable y1 = 0
let mutable line : char array = Array.zeroCreate WIDTH
let mutable output = new String(line)
let mutable x = -30.0
while x <= 30.0 do
for i=0 to WIDTH-1 do
line.[i] <- SPACE
l <- 0
y1 <- 5 * int (Math.Sqrt(900.0 - x * x) / 5.0)
y <- y1
while y >= -y1 do
z <- int (25.0 + A(Math.Sqrt(x * x + double (y * y))) - 0.7 * double y)
if z > l then
l <- z
line.[z] <- DOT
y <- y + -5
let output = String(line)
printfn "%s" output
x <- x + 1.5
[<EntryPoint>]
let main argv =
Console.Clear()
PrintCredits()
Console.Clear()
Draw()
0 // integer exit code
// vim: filetype=fsharp
In FreeBASIC
/'
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in FreeBASIC:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-11-20.
Last modified: 20241120T2343+0100.
'/
sub print_credits()
print !"3D Plot\n"
print "Original version in BASIC:"
print !" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n"
print "This version in FreeBASIC:"
print " Copyright (c) 2024, Marcos Cruz (programandala.net)"
print !" SPDX-License-Identifier: Fair\n"
print "Press any key to start the program. ";
sleep
end sub
function a(z as single) as single
return 30 * exp(-z * z / 100)
end function
function repeat(s as string, n as integer) as string
' source: https://rosettacode.org/wiki/Repeat_a_string#FreeBASIC
if n < 1 then return ""
if n = 1 then return s
var size = len(s)
if size = 0 then return s ' empty string
if size = 1 then return string(n, s[0]) ' repeated single character
var buffer = space(size * n) ' create buffer for size > 1
for i as integer = 0 to n - 1
for j as integer = 0 to size - 1
buffer[i * size + j] = s[j]
next j
next i
return buffer
end function
sub do_draw()
const size as integer = 56
dim x as single
dim l as integer
dim l1 as integer
dim y as single
dim y1 as integer
dim z as single
for x = -30 to 30 step 1.5
dim row as string = repeat(" ", size)
l = 0
y1 = 5 * int(sqr(900 - x * x) / 5)
for y = y1 to -y1 step -5
z = int((25 + a(sqr(x * x + y * y)) - .7 * y))
if z > l then
l = z
row = mid(row, 1, z) + "*" + mid(row, z+2)
end if
next
print row
next
end sub
cls
print_credits()
cls
do_draw()
' vim: filetype=freebasic
In Go
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Go:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-12-28.
.
Last modified: 20250105T1150+0100.
*/
package main
import "fmt"
import "math"
const space rune = ' '
const dot rune = '*'
const width int = 56
func clearScreen() {
fmt.Print("\x1B[0;0H\x1B[2J")
}
func input(prompt string) string {
fmt.Print(prompt)
var s = ""
fmt.Scanf("%s", &s)
return s
}
// Display the credits and wait for a keypress.
func printCredits() {
fmt.Println("3D Plot\n")
fmt.Println("Original version in BASIC:")
fmt.Println(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
fmt.Println("This version in Go:")
fmt.Println(" Copyright (c) 2024, Marcos Cruz (programandala.net)")
fmt.Println(" SPDX-License-Identifier: Fair\n")
input("Press Enter to start the program. ")
}
func a(z float64) float64 {
return 30 * math.Exp(-z*z/100)
}
func draw() {
var l = 0
var z = 0
var y1 = 0
var line [width]rune
for x := -30.0; x <= 30.0; x += 1.5 {
for pos := 0; pos < width; pos++ {
line[pos] = space
}
l = 0
y1 = 5 * int(math.Sqrt(900-x*x)/5)
for y := y1; y >= -y1; y += -5 {
z = int(25 + a(math.Sqrt(x*x+float64(y*y))) - 0.7*float64(y))
if z > l {
l = z
line[z] = dot
}
} // y loop
for pos := 0; pos < width; pos++ {
fmt.Printf(string(line[pos]))
}
fmt.Println()
} // x loop
}
func main() {
clearScreen()
printCredits()
clearScreen()
draw()
}
In Hare
// 3D Plot
// Original version in BASIC:
// Creative Computing (Morristown, New Jersey, USA), ca. 1980.
// This version in Hare:
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2024-12-14/15, 2025-03-07.
//
// Last modified: 20260213T1645+0100.
use bufio;
use fmt;
use math;
use os;
use strings;
def SPACE = ' ';
def DOT = '*';
def WIDTH = 56;
fn clear_screen() void = {
fmt::print("\x1B[0;0H\x1B[2J")!;
};
fn print_prompt(prompt: str = "") void = {
fmt::print(prompt)!;
bufio::flush(os::stdout)!;
};
fn accept_string(prompt: str = "") str = {
print_prompt(prompt);
const buffer = match (bufio::read_line(os::stdin)!) {
case let buffer: []u8 =>
yield buffer;
case =>
return "";
};
defer free(buffer);
return strings::dup(strings::fromutf8(buffer)!)!;
};
fn press_enter(prompt: str = "") void = {
free(accept_string(prompt));
};
fn print_credits() void = {
fmt::println("3D Plot\n")!;
fmt::println("Original version in BASIC:")!;
fmt::println(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")!;
fmt::println("This version in Hare:")!;
fmt::println(" Copyright (c) 2024, Marcos Cruz (programandala.net)")!;
fmt::println(" SPDX-License-Identifier: Fair\n")!;
press_enter("Press Enter to start.");
};
fn a(z: f64) f64 = {
return 30.0 * math::expf64(-z * z / 100.0);
};
fn draw() void = {
let l = 0;
let z = 0;
let y1 = 0;
let line: [WIDTH]rune = [SPACE...];
for (let x = -30.0; x <= 30.0; x += 1.5) {
line = [SPACE...];
l = 0;
y1 = 5 * (math::sqrtf64(900.0 - x * x) / 5.0): int;
for (let y = y1; y >= -y1; y += -5) {
z = (25.0
+ a(math::sqrtf64(x * x + (y * y): f64))
- 0.7 * (y: f64)): int;
if (z > l) {
l = z;
line[z] = DOT;
};
};
for (let pos = 0; pos < WIDTH; pos += 1) {
fmt::print(line[pos])!;
};
fmt::println()!;
};
};
export fn main() void = {
clear_screen();
print_credits();
clear_screen();
draw();
};
In Icon
# 3D Plot
#
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
#
# This version in Icon:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-03-03/21.
#
# Last modified 20231103T2341+0100.
link iscreen # clear()
$define dot "*"
$define space " "
$define width 56
procedure print_credits()
clear()
write("3D Plot\n")
write("Original version in BASIC:")
write(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
write("This version in Icon:")
write(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
write(" SPDX-License-Identifier: Fair\n")
write("Press Enter to start the program.")
read()
end
procedure a(z)
return 30 * exp(-z * z / 100)
end
procedure draw()
clear()
x := -30
while x <= 30 do {
line := repl(space,width)
l := 0
y1 := 5 * integer(sqrt(900 - x * x) / 5)
y := y1
while y >= -y1 do {
z := integer(25 + a(sqrt(x * x + y * y)) - .7 * y)
if z > l then {
l := z
line[z + 1] := dot
}
y -:= 5
}
write(line)
x +:= 1.50
}
end
procedure main()
print_credits()
draw()
end
In Janet
# 3D Plot
# Original version in BASIC:
# 3-D Plot (by Mark Bramhall), 1978.
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
# This version in Janet:
# Copyright (c) 2025, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written on 2025-12-23.
#
# Last modified: 20251225T1944+0100.
(defn move-cursor-home []
(prin "\e[H"))
(defn clear-screen []
(prin "\e[2J")
(move-cursor-home))
(defn display-credits []
(print "3D Plot\n")
(print "Original version in BASIC:")
(print " Mark Bramhall, 1978.")
(print " Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
(print "This version in Janet:")
(print " Copyright (c) 2025, Marcos Cruz (programandala.net)")
(print " SPDX-License-Identifier: Fair\n")
(prin "Press Enter to start the program. ")
(flush)
(getline))
(defn a [z]
(* 30 (math/exp (/ (* (- z) z) 100))))
(defn draw []
(def line-width 56)
(def space (chr " "))
(def asterisk (chr "*"))
(def line (buffer/new-filled line-width space))
(var l 0)
(var z 0)
(var y1 0)
(var y 0)
(loop [x :range [-30 30.5 1.5]]
(set l 0)
(set y1 (* 5 (math/floor (/ (math/sqrt (- 900 (* x x))) 5))))
(loop [y :down [y1 (+ (- y1) -5) 5]]
(set z (math/floor (- (+ 25 (a (math/sqrt (+ (* x x) (* y y))))) (* 0.7 y))))
(when (> z l)
(set l z)
(buffer/push-at line z asterisk)))
(print line)
(buffer/fill line space)))
(defn main [& args]
(clear-screen)
(display-credits)
(clear-screen)
(draw))
In Julia
# 3D Plot
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
# This version in Julia:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
# Written in 2023-07-07/08.
# Last modified: 20241202T2317+0100.
width = 56
function clear()
print("\e[0;0H\e[2J")
end
function print_credits()
clear()
println("3D Plot\n")
println("Original version in BASIC:")
println(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
println("This version in Julia:")
println(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
println(" SPDX-License-Identifier: Fair\n")
println("Press Enter to start the program.")
_ = readline()
end
function a(z)
return 30 * exp(-z * z / 100)
end
function draw()
clear()
for x = -30 : 1.5 : 30
line = repeat(" ", width)
l = 0
y1 = 5 * floor(Int, sqrt(900 - x * x) / 5)
for y = y1 : -5 : -y1
z = floor(Int, (25 + a(sqrt(x * x + y * y)) - .7 * y))
if z > l
l = z
line = line[1:z] * "*" * line[z+2:end]
end
end
println(line)
end
end
print_credits()
draw()
In Kotlin
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Kotlin:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-08, 2023-09, 2023-10.
Last modified: 20250419T2224+0200.
*/
fun home() {
print("\u001B\u005B\u0048")
}
fun clear() {
print("\u001B\u005B\u0032\u004A")
home()
}
fun showCredits() {
println("3D Plot\n")
println("Original version in BASIC:")
println(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
println("This version in Kotlin:")
println(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
println(" SPDX-License-Identifier: Fair\n")
println("Press Enter to start the program.")
readln()
}
fun a(z: Double): Double {
return 30 * kotlin.math.exp(-z * z / 100)
}
fun draw() {
val width = 56
val space = ' '
val dot = '*'
var line = CharArray(width)
var l: Int
var y1: Int
var z: Int
var x = -30.0
while (x <= 30) {
line.fill(space)
l = 0
y1 = 5 * (kotlin.math.sqrt(900 - x * x) / 5).toInt()
for (y in y1 downTo -y1 step 5) {
z = (25 + a(kotlin.math.sqrt(x * x + (y * y)))-0.7 * y).toInt()
if (z > l) {
l = z
line[z] = dot
}
}
for (pos in 0 ..< width) {
print(line[pos])
}
println()
x += 1.5
}
}
fun main() {
clear()
showCredits()
clear()
draw()
}
In Lobster
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Lobster:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2023-09-16.
Last modified 20250318T1528+0100.
*/
def clear():
print("\x1B[0;0H\x1B[2J")
def showCredits():
print("3D Plot\n")
print("Original version in BASIC:")
print(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
print("This version in Lobster:")
print(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
print(" SPDX-License-Identifier: Fair\n")
get_line("Press Enter to start the program.")
def exp(n: float) -> float:
let E = 2.71828
return pow(E, n)
def a(z: float) -> float:
return 30.0 * exp(-z * z / 100.0)
def draw():
let WIDTH = 56
let SPACE = " "
let DOT = "*"
var l = 0
var y1 = 0
var z = 0
var x = -30.0
while x <= 30.0:
let line = []
var pos = 0
while pos < WIDTH:
push(line, SPACE)
pos += 1
l = 0
y1 = 5 * int(sqrt(900.0 - x * x) / 5.0)
var y = y1
while y >= -y1:
z = int(25.0 + a(sqrt(x * x + float(y * y))) - 0.7 * float(y))
if z > l:
l = z
line[z] = DOT
y -= 5
print(concat_string(line, ""))
x += 1.5
clear()
showCredits()
clear()
draw()
In Odin
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Odin:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-02/03, 2023-08/09, 2023-12.
Last modified: 20241229T1712+0100.
*/
package three_d_plot
import "../lib/anodino/src/read"
import "../lib/anodino/src/term"
import "core:fmt"
import "core:math"
SPACE :: ' '
DOT :: '*'
WIDTH :: 56
// Display the credits and wait for a keypress.
//
print_credits :: proc() {
fmt.println("3D Plot\n")
fmt.println("Original version in BASIC:")
fmt.println(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
fmt.println("This version in Odin:")
fmt.println(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
fmt.println(" SPDX-License-Identifier: Fair\n")
read.a_prompted_string("Press Enter to start the program. ")
}
a :: proc(z : f64) -> f64 {
return 30 * math.exp(-z * z / 100)
}
draw :: proc() {
l := 0
z := 0
y1 := 0
line : [WIDTH]rune
for x := -30.0; x <= 30.0; x += 1.5 {
for pos in 0 ..< WIDTH {
line[pos] = SPACE
}
l = 0
y1 = 5 * int(math.sqrt(900 - x * x) / 5)
for y := y1; y >= -y1; y += -5 {
z = int(25 + a(math.sqrt(x * x + f64(y * y))) - 0.7 * f64(y))
if z > l {
l = z
line[z] = DOT
}
} // y loop
for pos in 0 ..< WIDTH {
fmt.print(line[pos])
}
fmt.println("")
} // x loop
}
main :: proc() {
term.clear_screen()
print_credits()
term.clear_screen()
draw()
}
In Pike
#! /usr/bin/env pike
// 3D Plot
// Original version in BASIC:
// Creative Computing (Morristown, New Jersey, USA), ca. 1980.
// This version in Pike:
// Copyright (c) 2024, Marcos Cruz (programandala.net)
// SPDX-License-Identifier: Fair
//
// Written on 2024-12-17.
//
// Last modified: 20250311T0155+0100.
constant SPACE = " ";
constant DOT = "*";
constant WIDTH = 56;
void clear_screen() {
write("\x1B[0;0H\x1B[2J");
}
void prompt(string s) {
write(s);
Stdio.stdin->gets();
}
void print_credits() {
write("3D Plot\n\n");
write("Original version in BASIC:\n");
write(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n\n");
write("This version in Pike:\n");
write(" Copyright (c) 2024, Marcos Cruz (programandala.net)\n");
write(" SPDX-License-Identifier: Fair\n\n");
prompt("Press Enter to start. ");
}
float a(float z) {
return 30.0 * exp(-z * z / 100.0);
}
void draw() {
int l = 0;
int z = 0;
int y1 = 0;
array(string) line = allocate(WIDTH);
for (float x = -30.0; x <= 30.0; x += 1.5) {
for (int i = 0; i < WIDTH; i += 1)
line[i] = SPACE;
l = 0;
y1 = 5 * (int) (sqrt(900.0 - x * x) / 5.0);
for (int y = y1; y >= -y1; y += -5) {
z = (int) (25.0 + a(sqrt(x * x + (float) (y * y))) - 0.7 * (float) y);
if (z > l) {
l = z;
line[z] = DOT;
}
} // y loop
for (int pos = 0; pos < WIDTH; pos += 1)
write(line[pos]);
write("\n");
} // x loop
}
void main() {
clear_screen();
print_credits();
clear_screen();
draw();
}
In Python
# 3D Plot
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
# This version in Python:
# Copyright (c) 2024, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
# Written on 2024-10-29.
# Last modified: 20241029T1607+0100.
import math
import os
WIDTH = 56
def clear():
if os.name == 'nt':
_ = os.system('cls')
else:
# on mac and linux, `os.name` is 'posix'
_ = os.system('clear')
def print_credits():
clear()
print("3D Plot\n")
print("Original version in BASIC:")
print(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
print("This version in Python:")
print(" Copyright (c) 2024, Marcos Cruz (programandala.net)")
print(" SPDX-License-Identifier: Fair\n")
input("Press Enter to start the program.")
def a(z):
return 30 * math.exp(-z * z / 100)
def draw():
x = -30.0
while x <= 30.0:
line = " " * WIDTH
l = 0
y1 = 5 * math.floor(math.sqrt(900 - x * x) / 5)
for y in range(y1, -y1 - 1, -5):
z = math.floor(25 + a(math.sqrt(x * x + y * y)) - .7 * y)
if z > l:
l = z
line = line[: z] + "*" + line[z + 1:]
print(line)
x += 1.5
print_credits()
clear()
draw()
In Racket
#! /usr/bin/env racket
#|
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Racket:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-12-06.
Last modified: 20260106T0841+0100.
|#
#lang racket
(define (move-cursor-home)
(display "\e[H"))
(define (clear-screen)
(display "\e[2J")
(move-cursor-home))
(define (display-credits)
(displayln "3D Plot\n")
(displayln "Original version in BASIC:")
(displayln " Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
(displayln "This version in Racket")
(displayln " Copyright (c) 2024, Marcos Cruz (programandala.net)")
(displayln " SPDX-License-Identifier: Fair\n")
(display "Press Enter to start the program. ")
(void (read-line)))
(define (a z)
(* 30 (exp (/ (* (- z) z) 100))))
(define (draw)
(define l 0)
(define z 0)
(define y1 0)
(define line-width 56)
(define line (make-string line-width #\space))
(for ([x (in-range -30.0 30.5 1.5)])
(set! l 0)
(set! y1 (* 5 (exact-floor (/ (sqrt (- 900 (* x x))) 5))))
(for ([y (in-range y1 (+ (- y1) -5) -5)])
(set! z (exact-floor (- (+ 25 (a (sqrt (+ (* x x) (* y y))))) (* 0.7 y))))
(when (> z l)
(begin
(set! l z)
(string-set! line z #\*))))
(displayln line)
(string-fill! line #\space)))
(clear-screen)
(display-credits)
(clear-screen)
(draw)
In Raku
# 3D Plot
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
# This version in Raku:
# Copyright (c) 2024, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
# Written on 2024-12-02.
# Last modified: 20241211T1232+0100.
constant $WIDTH = 56;
sub clear_screen {
print "\e[0;0H\e[2J";
}
sub print_credits {
put "3D Plot\n";
put 'Original version in BASIC:';
put " Creative computing (Morristown, New Jersey, USA), ca. 1980.\n";
put 'This version in Raku:';
put ' Copyright (c) 2024, Marcos Cruz (programandala.net)';
put " SPDX-License-Identifier: Fair\n";
put 'Press Enter to start the program.';
prompt '';
}
sub a($z) {
30 * exp(-$z * $z / 100);
}
sub draw {
for -30, -28.5 ... 30 -> $x {
my $line = ' ' x $WIDTH;
my $l = 0;
my $y1 = 5 * (sqrt(900 - $x * $x) / 5).Int;
for $y1, $y1 - 5 ... -$y1 -> $y {
my $z = (25 + a(sqrt($x * $x + $y * $y)) - .7 * $y).Int;
if $z > $l {
$l = $z;
$line.substr-rw($z, 1) = '*';
}
}
put $line;
}
}
clear_screen;
print_credits;
clear_screen;
draw;
In Ring
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Ring:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-03-15.
Last modified: 20240318T1303+0100.
*/
SPACE = " "
DOT = "*"
WIDTH = 56
// Clear the terminal and move the cursor to the top left position.
func clear() {
system("clear")
}
// Display the credits and wait for a keypress.
func printCredits() {
print("3D Plot\n\n")
print("Original version in BASIC:\n")
print(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n\n")
print("This version in Ring:\n")
print(" Copyright (c) 2024, Marcos Cruz (programandala.net)\n")
print(" SPDX-License-Identifier: Fair\n\n")
print("Press Enter to start the program.\n")
getString()
}
func a(z) {
return 30.0 * exp(-z * z / 100.0)
}
func draw() {
l = 0
z = 0
y1 = 0
line = list(WIDTH)
x = -30.0
while x <= 30.0 {
for pos = 1 to WIDTH {
line[pos] = SPACE
}
l = 0
y1 = 5 * floor(sqrt(900.0 - x * x) / 5.0)
y = y1
while y >= -y1 {
z = floor(25.0 + a(sqrt(x * x + y * y)) - 0.7 * y)
if z > l {
l = z
line[z] = DOT
}
y += -5
} // y loop
print(SPACE)
for pos = 1 to WIDTH {
print(line[pos])
}
print(nl)
x += 1.5
} // x loop
}
func main {
clear()
printCredits()
clear()
draw()
}
In Rust
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Rust:
Copyright (c) 2024, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2024-12-26/27.
Last modified: 20241227T1235+0100.
*/
use std::io;
use std::io::Write;
const SPACE: char = ' ';
const DOT: char = '*';
const WIDTH: usize = 56;
fn move_cursor_home() {
print!("\x1B[H")
}
fn erase_screen() {
print!("\x1B[2J")
}
fn clear_screen() {
erase_screen();
move_cursor_home()
}
fn press_enter(prompt: &str) {
print!("{prompt}");
io::stdout().flush().unwrap(); // print pending text
let mut input = String::new();
let _ = io::stdin().read_line(&mut input);
}
// Display the credits and wait for a keypress.
//
fn print_credits() {
println!("3D Plot\n");
println!("Original version in BASIC:");
println!(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n");
println!("This version in Rust:");
println!(" Copyright (c) 2024, Marcos Cruz (programandala.net)");
println!(" SPDX-License-Identifier: Fair\n");
press_enter("Press Enter to start the program. ")
}
fn a(z: f64) -> f64 {
return 30.0 * f64::exp(-z * z / 100.0)
}
fn draw() {
let mut l: isize;
let mut z: isize;
let mut y1: isize;
let mut line : [char; WIDTH];
let mut x: f64 = -30.0;
while x <= 30.0 {
line = [SPACE; WIDTH];
l = 0;
y1 = 5 * (f64::sqrt(900.0 - x * x) / 5.0) as isize;
let mut y = y1;
while y >= -y1 {
z = (25.0 + a(f64::sqrt(x * x + (y * y) as f64)) - 0.7 * (y as f64)) as isize;
if z > l {
l = z;
line[z as usize] = DOT
}
y += -5
} // y loop
for pos in 0 .. WIDTH {
print!("{}", line[pos])
}
println!();
x += 1.5
} // x loop
}
fn main() {
clear_screen();
print_credits();
clear_screen();
draw()
}
In Scala
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Scala:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-08, 2023-09.
Last modified: 20231103T2352+0100.
*/
def home() =
print("\u001B[H")
def clear() =
print("\u001B[2J")
home()
def showCredits() =
println("3D Plot\n")
println("Original version in BASIC:")
println(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
println("This version in Scala:")
println(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
println(" SPDX-License-Identifier: Fair\n")
println("Press any key to start the program.")
io.StdIn.readLine("")
def a(z: Double): Double =
30 * math.exp(-z * z / 100)
def draw() =
val width = 56
val space = ' '
val dot = '*'
var line = new Array[Char](width)
var l = 0
var y1 = 0
var z = 0
var x = -30.0
while x <= 30 do
line = Array.fill(width){space}
l = 0
y1 = 5 * (math.sqrt(900 - x * x) / 5).toInt
for y <- y1 to -y1 by -5 do
z = (25 + a(math.sqrt(x * x + (y * y)))-0.7 * y).toInt
if z > l then
l = z
line(z) = dot
for pos <- 0 until width do
print(line(pos))
println()
x += 1.5
@main def main() =
clear()
showCredits()
clear()
draw()
In Scheme
; 3D Plot
; Original version in BASIC:
; 3-D Plot (by Mark Bramhall), 1978.
; Creative Computing (Morristown, New Jersey, USA), ca. 1980.
; This version in Scheme (Bigloo):
; Copyright (c) 2025, Marcos Cruz (programandala.net)
; SPDX-License-Identifier: Fair
;
; Written in 2025-11-30/12-03.
;
; Last modified: 20251205T0113+0100.
(module 3d-plot)
(define (move-cursor-home)
(display "\x1B[H"))
(define (clear-screen)
(display "\x1B[2J")
(move-cursor-home))
(define (display-credits)
(display "3D Plot\n\n")
(display "Original version in BASIC:\n")
(display " Creative computing (Morristown, New Jersey, USA), ca. 1980.\n\n")
(display "This version in Scheme (Bigloo)\n")
(display " Copyright (c) 2025, Marcos Cruz (programandala.net)\n")
(display " SPDX-License-Identifier: Fair\n\n")
(display "Press Enter to start the program. ")
(read-line))
(define (a z)
(* 30 (exp (/ (* (- z) z) 100))))
(define (draw)
(define l 0)
(define z 0)
(define y1 0)
(define line-width 56)
(define line (make-string line-width #\space))
(do ((x -30.0 (+ x 1.5))) ((> x 30.0))
(set! l 0)
(set! y1 (* 5 (floor (/ (sqrt (- 900 (* x x))) 5))))
(do ((y y1 (- y 5))) ((< y (- y1)))
(set! z (floor (- (+ 25 (a (sqrt (+ (* x x) (* y y))))) (* 0.7 y))))
(when (> z l)
(set! l z)
(string-set! line (inexact->exact (truncate z)) #\*)))
(display line)
(newline)
(string-fill! line #\space)))
(clear-screen)
(display-credits)
(clear-screen)
(draw)
In Swift
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Swift:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written on 2023-11-02/03, 2023-11-17.
Last modified: 20231117T2222+0100.
*/
import Foundation // exp(), sqrt()
let SPACE = " "
let DOT = "*"
let WIDTH = 56
// Move the cursor to the top left position of the terminal.
func home() {
print("\u{001B}[H", terminator: "")
}
// Clear the terminal and move the cursor to the top left position.
func clear() {
print("\u{001B}[2J", terminator: "")
home()
}
// Display the credits and wait for a keypress.
func printCredits() {
print("3D Plot\n")
print("Original version in BASIC:")
print(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
print("This version in Swift:")
print(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
print(" SPDX-License-Identifier: Fair\n")
print("Press Enter to start the program.")
let _ = readLine()
}
func a(_ z: Double) -> Double {
return 30.0 * exp(-z * z / 100.0)
}
func draw() {
var l = 0
var z = 0
var y1 = 0
var line = Array<String>(repeating: SPACE, count: WIDTH)
var x = -30.0
while x <= 30.0 {
for pos in 0 ..< WIDTH {
line[pos] = SPACE
}
l = 0
y1 = 5 * Int(sqrt(900.0 - x * x) / 5.0)
var y = y1
while y >= -y1 {
z = Int(25.0 + a(sqrt(x * x + Double(y * y))) - 0.7 * Double(y))
if z > l {
l = z
line[z] = DOT
}
y += -5
} // y loop
for pos in 0 ..< WIDTH {
print(line[pos], terminator: "")
}
print()
x += 1.5
} // x loop
}
clear()
printCredits()
clear()
draw()
In V
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in V:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-02-04/05.
Last modified 20250108T2315+0100.
*/
import math
import os
import term
const space = u8(` `)
const dot = u8(`*`)
fn credits() {
term.clear()
println('3D Plot\n')
println('Original version in BASIC:')
println(' Creative computing (Morristown, New Jersey, USA), ca. 1980.\n')
println('This version in V:')
println(' Copyright (c) 2023, Marcos Cruz (programandala.net)')
println(' SPDX-License-Identifier: Fair\n')
os.input('\nPress the Enter key to start. ')
}
fn a(z f64) f64 {
return 30 * math.exp(-z * z / 100)
}
fn draw() {
mut l := 0
mut z := 0
mut y1 := 0
width := 56
mut line := []u8{len: width}
term.clear()
for x := -30.0; x <= 30.0; x += 1.5 {
line = []u8{len: width, init: space}
l = 0
y1 = 5 * int(math.sqrt(900 - x * x) / 5)
for y := y1; y >= -y1; y += -5 {
z = int(25 + a(math.sqrt(x * x + y * y)) - 0.7 * f64(y))
if z > l {
l = z
line[z] = dot
}
} // y loop
println(line.bytestr())
} // x loop
}
fn main() {
credits()
draw()
}
In Vala
/*
3D Plot
Original version in BASIC:
Creative Computing (Morristown, New Jersey, USA), ca. 1980.
This version in Vala:
Copyright (c) 2023, Marcos Cruz (programandala.net)
SPDX-License-Identifier: Fair
Written in 2023-08-30/31.
Last modified 20231103T2132+0100.
*/
using GLib; // Math needed
// Clear the screen, reset the attributes and move the cursor to the home position.
void clear() {
print("\033[2J\033[0m\033[H");
}
// Display the credits and wait until the user presses Enter.
void print_credits() {
print("3D Plot\n\n");
print("Original version in BASIC:\n");
print(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n\n");
print("This version in Vala:\n");
print(" Copyright (c) 2023, Marcos Cruz (programandala.net)\n");
print(" SPDX-License-Identifier: Fair\n\n");
print("Press Enter to start the program.\n");
stdin.read_line();
}
double a(double z) {
return 30 * Math.exp(-z * z / 100);
}
void draw() {
const int width = 56;
const char space = ' ';
const char dot = '*';
char line[width];
int l = 0;
int z = 0;
int y1 = 0;
for (double x = -30.0; x <= 30.0; x += 1.5) {
for (int pos = 0; pos < width; pos++) {
line[pos] = space;
}
l = 0;
y1 = 5 * (int)(Math.sqrt(900 - x * x) / 5);
for (int y = y1; y >= -y1; y += -5) {
z = (int)(25 + a(Math.sqrt(x * x + (y * y))) - 0.7 * y);
if (z > l) {
l = z;
line[z] = dot;
}
} // y loop
for (int pos = 0; pos < width; pos++) {
print(line[pos].to_string());
}
print("\n");
} // x loop
}
void main() {
clear();
print_credits();
clear();
draw();
}
