-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
112 lines (98 loc) · 2.7 KB
/
main.go
File metadata and controls
112 lines (98 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package main
import (
"fmt"
"math"
)
const (
width int = 160
height int = 44
cubeWidth float64 = 10
bufferSize int = width * height
background string = " "
objectDistance int = 60
K1 float64 = 40
speed float64 = 0.5
)
var (
ooz, x, y, z float64
xp, yp, idx int
buff []string
zBuff []float64
A, B, C float64
)
func main() {
fmt.Print("\x1b[2J")
buff = make([]string, int(bufferSize))
zBuff = make([]float64, int(bufferSize))
for {
memSet(buff, background)
memSetFloat(zBuff, 0)
for cubeX := -cubeWidth; cubeX < cubeWidth; cubeX += speed {
for cubeY := -cubeWidth; cubeY < cubeWidth; cubeY += speed {
calculateSurface(cubeX, cubeY, -cubeWidth, "#")
calculateSurface(cubeX, cubeY, -cubeWidth, "@")
calculateSurface(cubeWidth, cubeY, cubeX, "$")
calculateSurface(-cubeWidth, cubeY, -cubeX, "~")
calculateSurface(-cubeX, cubeY, cubeWidth, "#")
calculateSurface(cubeX, -cubeWidth, -cubeY, ";")
calculateSurface(cubeX, cubeWidth, cubeY, "+")
}
}
fmt.Print("\x1b[H")
for k := 0; k < width*height; k++ {
c := k % width
if c != 0 {
fmt.Printf("%s", buff[k])
} else {
fmt.Printf("\n")
}
}
A += 0.005
B += 0.005
C += 0.01
}
}
func calculateX(i, j, k float64) float64 {
return j*math.Sin(A)*math.Sin(B)*math.Cos(C) - k*math.Cos(A)*math.Sin(B)*math.Cos(C) + j*math.Cos(A)*math.Sin(C) + k*math.Sin(A)*math.Sin(C) + i*math.Cos(B)*math.Cos(C)
}
func calculateY(i, j, k float64) float64 {
return j*math.Cos(A)*math.Cos(C) + k*math.Sin(A)*math.Cos(C) - j*math.Sin(A)*math.Sin(B)*math.Sin(C) + k*math.Cos(A)*math.Sin(B)*math.Sin(C) - i*math.Cos(B)*math.Sin(C)
}
func calculateZ(i, j, k float64) float64 {
return k*math.Cos(A)*math.Cos(B) - j*math.Sin(A)*math.Cos(B) + i*math.Sin(B)
}
func calculateSurface(cubeX, cubeY, cubeZ float64, ch string) {
x = calculateX(cubeX, cubeY, cubeZ)
y = calculateY(cubeX, cubeY, cubeZ)
z = calculateZ(cubeX, cubeY, cubeZ) + float64(objectDistance)
ooz = 1 / z
xp = int(float64(width)/2 + K1*ooz*x*2)
yp = int(float64(height)/2 + K1*ooz*y)
idx = xp + yp*width
if idx >= 0 && idx < width*height {
if ooz > zBuff[idx] {
zBuff[idx] = ooz
buff[idx] = ch
}
}
}
// memSet fills map's space with a given character. Mimics the behavior of C memset function
func memSet(a []string, v string) {
if len(a) == 0 {
return
}
a[0] = v
for bp := 1; bp < len(a); bp *= 2 {
copy(a[bp:], a[:bp])
}
}
// memSetFloat fills map's space with a given float. Mimics the behavior of C memset function
func memSetFloat(a []float64, v float64) {
if len(a) == 0 {
return
}
a[0] = v
for bp := 1; bp < len(a); bp *= 2 {
copy(a[bp:], a[:bp])
}
}