Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
81
Task/Draw-a-rotating-cube/Nim/draw-a-rotating-cube.nim
Normal file
81
Task/Draw-a-rotating-cube/Nim/draw-a-rotating-cube.nim
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
import math
|
||||
import sdl2
|
||||
|
||||
const
|
||||
Width = 500
|
||||
Height = 500
|
||||
Offset = 500 / 2
|
||||
|
||||
var nodes = [(x: -100.0, y: -100.0, z: -100.0),
|
||||
(x: -100.0, y: -100.0, z: 100.0),
|
||||
(x: -100.0, y: 100.0, z: -100.0),
|
||||
(x: -100.0, y: 100.0, z: 100.0),
|
||||
(x: 100.0, y: -100.0, z: -100.0),
|
||||
(x: 100.0, y: -100.0, z: 100.0),
|
||||
(x: 100.0, y: 100.0, z: -100.0),
|
||||
(x: 100.0, y: 100.0, z: 100.0)]
|
||||
|
||||
const Edges = [(a: 0, b: 1), (a: 1, b: 3), (a: 3, b: 2), (a: 2, b: 0),
|
||||
(a: 4, b: 5), (a: 5, b: 7), (a: 7, b: 6), (a: 6, b: 4),
|
||||
(a: 0, b: 4), (a: 1, b: 5), (a: 2, b: 6), (a: 3, b: 7)]
|
||||
|
||||
var
|
||||
window: WindowPtr
|
||||
renderer: RendererPtr
|
||||
event: Event
|
||||
endSimulation = false
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
proc rotateCube(angleX, angleY: float) =
|
||||
let
|
||||
sinX = sin(angleX)
|
||||
cosX = cos(angleX)
|
||||
sinY = sin(angleY)
|
||||
cosY = cos(angleY)
|
||||
|
||||
for node in nodes.mitems:
|
||||
var (x, y, z) = node
|
||||
node.x = x * cosX - z * sinX
|
||||
node.z = z * cosX + x * sinX
|
||||
z = node.z
|
||||
node.y = y * cosY - z * sinY
|
||||
node.z = z * cosY + y * sinY
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
proc pollQuit(): bool =
|
||||
while pollEvent(event):
|
||||
if event.kind == QuitEvent:
|
||||
return true
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
proc drawCube(): bool =
|
||||
var rect: Rect = (cint(0), cint(0), cint(Width), cint(Height))
|
||||
rotateCube(PI / 4, arctan(sqrt(2.0)))
|
||||
for frame in 0..359:
|
||||
renderer.setDrawColor((0u8, 0u8, 0u8, 255u8))
|
||||
renderer.fillRect(addr(rect))
|
||||
renderer.setDrawColor((0u8, 220u8, 0u8, 255u8))
|
||||
for edge in Edges:
|
||||
let xy1 = nodes[edge.a]
|
||||
let xy2 = nodes[edge.b]
|
||||
renderer.drawLine(cint(xy1.x + Offset), cint(xy1.y + Offset),
|
||||
cint(xy2.x + Offset), cint(xy2.y + Offset))
|
||||
rotateCube(PI / 180, 0)
|
||||
renderer.present()
|
||||
if pollQuit(): return true
|
||||
delay 10
|
||||
|
||||
#———————————————————————————————————————————————————————————————————————————————————————————————————
|
||||
|
||||
if sdl2.init(INIT_EVERYTHING) == SdlError:
|
||||
quit(QuitFailure)
|
||||
|
||||
window = createWindow("Rotating cube", 10, 10, 500, 500, 0)
|
||||
renderer = createRenderer(window, -1, Renderer_Accelerated)
|
||||
|
||||
while not endSimulation:
|
||||
endSimulation = drawCube()
|
||||
window.destroy()
|
||||
Loading…
Add table
Add a link
Reference in a new issue