You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.8 KiB
85 lines
1.8 KiB
var fs = require('fs')
|
|
var path = require('path')
|
|
var Canvas = require('..')
|
|
|
|
var canvas = new Canvas(243 * 4, 243)
|
|
var ctx = canvas.getContext('2d')
|
|
|
|
function render (level) {
|
|
ctx.fillStyle = getPointColour(122, 122)
|
|
ctx.fillRect(0, 0, 240, 240)
|
|
renderLevel(level, 81, 0)
|
|
}
|
|
|
|
function renderLevel (minimumLevel, level, y) {
|
|
var x
|
|
|
|
for (x = 0; x < 243 / level; ++x) {
|
|
drawBlock(x, y, level)
|
|
}
|
|
for (x = 0; x < 243 / level; x += 3) {
|
|
drawBlock(x, y + 1, level)
|
|
drawBlock(x + 2, y + 1, level)
|
|
}
|
|
for (x = 0; x < 243 / level; ++x) {
|
|
drawBlock(x, y + 2, level)
|
|
}
|
|
if ((y += 3) >= 243 / level) {
|
|
y = 0
|
|
level /= 3
|
|
}
|
|
if (level >= minimumLevel) {
|
|
renderLevel(minimumLevel, level, y)
|
|
}
|
|
}
|
|
|
|
function drawBlock (x, y, level) {
|
|
ctx.fillStyle = getPointColour(
|
|
x * level + (level - 1) / 2,
|
|
y * level + (level - 1) / 2
|
|
)
|
|
|
|
ctx.fillRect(
|
|
x * level,
|
|
y * level,
|
|
level,
|
|
level
|
|
)
|
|
}
|
|
|
|
function getPointColour (x, y) {
|
|
x = x / 121.5 - 1
|
|
y = -y / 121.5 + 1
|
|
|
|
var x2y2 = x * x + y * y
|
|
if (x2y2 > 1) {
|
|
return '#000'
|
|
}
|
|
|
|
var root = Math.sqrt(1 - x2y2)
|
|
var x3d = x * 0.7071067812 + root / 2 - y / 2
|
|
var y3d = x * 0.7071067812 - root / 2 + y / 2
|
|
var z3d = 0.7071067812 * root + 0.7071067812 * y
|
|
var brightness = -x / 2 + root * 0.7071067812 + y / 2
|
|
if (brightness < 0) brightness = 0
|
|
|
|
var r = Math.round(brightness * 127.5 * (1 - y3d))
|
|
var g = Math.round(brightness * 127.5 * (x3d + 1))
|
|
var b = Math.round(brightness * 127.5 * (z3d + 1))
|
|
|
|
return 'rgb(' + r + ', ' + g + ', ' + b + ')'
|
|
}
|
|
|
|
var start = new Date()
|
|
|
|
render(10)
|
|
ctx.translate(243, 0)
|
|
render(6)
|
|
ctx.translate(243, 0)
|
|
render(3)
|
|
ctx.translate(243, 0)
|
|
render(1)
|
|
|
|
console.log('Rendered in %s seconds', (new Date() - start) / 1000)
|
|
|
|
canvas.pngStream().pipe(fs.createWriteStream(path.join(__dirname, 'ray.png')))
|
|
|