96 lines
2.0 KiB
Plaintext
96 lines
2.0 KiB
Plaintext
import "graphics" for Canvas, Color
|
|
import "dome" for Window
|
|
import "math" for Math
|
|
|
|
var Nodes = [
|
|
[-1, -1, -1],
|
|
[-1, -1, 1],
|
|
[-1, 1, -1],
|
|
[-1, 1, 1],
|
|
[ 1, -1, -1],
|
|
[ 1, -1, 1],
|
|
[ 1, 1, -1],
|
|
[ 1, 1, 1]
|
|
]
|
|
|
|
var Edges = [
|
|
[0, 1],
|
|
[1, 3],
|
|
[3, 2],
|
|
[2, 0],
|
|
[4, 5],
|
|
[5, 7],
|
|
[7, 6],
|
|
[6, 4],
|
|
[0, 4],
|
|
[1, 5],
|
|
[2, 6],
|
|
[3, 7]
|
|
]
|
|
|
|
class RotatingCube {
|
|
construct new(width, height) {
|
|
Window.title = "Rotating cube"
|
|
Window.resize(width, height)
|
|
Canvas.resize(width, height)
|
|
_width = width
|
|
_height = height
|
|
_fore = Color.blue
|
|
}
|
|
|
|
init() {
|
|
scale(100)
|
|
rotateCube(Num.pi / 4, Math.atan(2.sqrt))
|
|
drawCube()
|
|
}
|
|
|
|
update() {
|
|
rotateCube(Num.pi / 180, 0)
|
|
}
|
|
|
|
draw(alpha) {
|
|
drawCube()
|
|
}
|
|
|
|
scale(s) {
|
|
for (node in Nodes) {
|
|
node[0] = node[0] * s
|
|
node[1] = node[1] * s
|
|
node[2] = node[2] * s
|
|
}
|
|
}
|
|
|
|
drawCube() {
|
|
Canvas.cls(Color.white)
|
|
Canvas.offset(_width / 2, _height / 2)
|
|
for (edge in Edges) {
|
|
var xy1 = Nodes[edge[0]]
|
|
var xy2 = Nodes[edge[1]]
|
|
Canvas.line(Math.round(xy1[0]), Math.round(xy1[1]),
|
|
Math.round(xy2[0]), Math.round(xy2[1]), _fore)
|
|
}
|
|
for (node in Nodes) {
|
|
Canvas.rectfill(Math.round(node[0]) - 4, Math.round(node[1]) - 4, 8, 8, _fore)
|
|
}
|
|
}
|
|
|
|
rotateCube(angleX, angleY) {
|
|
var sinX = Math.sin(angleX)
|
|
var cosX = Math.cos(angleX)
|
|
var sinY = Math.sin(angleY)
|
|
var cosY = Math.cos(angleY)
|
|
for (node in Nodes) {
|
|
var x = node[0]
|
|
var y = node[1]
|
|
var z = node[2]
|
|
node[0] = x * cosX - z * sinX
|
|
node[2] = z * cosX + x * sinX
|
|
z = node[2]
|
|
node[1] = y * cosY - z * sinY
|
|
node[2] = z * cosY + y * sinY
|
|
}
|
|
}
|
|
}
|
|
|
|
var Game = RotatingCube.new(640, 640)
|