Wednesday, August 21, 2024

donut.c converted to donut.go (Go)

 Mr. Andy Sloane published a piece of C code that shows a rotating doughnut on terminal. I tried to convert it to golang as I was learning Go programming language. It's true that the code should like a doughnut, but that comes later. Please send me any improvement suggestions.

/*
** donut.go - golang version of donut.c
**
*/
package main

import (
"fmt"
"math"
"strings"
"time"
)

func main() {
const GRIDSIZE int = 1760
var A float64 = 0.0
var B float64 = 0.0
z := [GRIDSIZE]float64{}
b := [GRIDSIZE]string{}
p := [...]string{".", ",", "-", "~",
":", ";", "=", "!", "*", "#", "$", "@"}

fmt.Print("\x1b[2J");

for {
for k := range b {
b[k] = " "
z[k] = 0.0
}
for j := 0.0; j < 6.28; j += 0.07 {
for i := 0.0; i < 6.28; i += 0.02 {
var c float64 = math.Sin(i)
var d float64 = math.Cos(j)
var e float64 = math.Sin(A)
var f float64 = math.Sin(j)
var g float64 = math.Cos(A)
var h float64 = d + 2
var D float64 = 1 / (c * h * e + f * g + 5)
var l float64 = math.Cos(i)
var m float64 = math.Cos(B)
var n float64 = math.Sin(B)
var t float64 = c * h * g - f * e
var x int = int(40 + 30 * D * (l * h * m - t * n))
var y int = int(12 + 15 * D * (l * h * n + t * m))
var o int = int(x + 80 * y)
var N int = int(8 * ((f * e - c * d * g) * m - c * d * e - f * g - l * d * n))
if 22 > y && y > 0 && x > 0 && 80 > x && D > z[o] {
z[o] = D
if N > 0 {
b[o] = p[N]
} else {
b[o] = "."
}
}
}
}

fmt.Print("\x1b[H")
for k := 0; k < GRIDSIZE; k += 80 {
b[k] = "\n"
}
A += 0.00004 * float64(GRIDSIZE)
B += 0.00002 * float64(GRIDSIZE)
fmt.Println(strings.Join(b[:], ""))
time.Sleep(30 * time.Millisecond);
}
}


No comments:

Post a Comment