156 lines
4.9 KiB
JavaScript
156 lines
4.9 KiB
JavaScript
let jmax = 2
|
|
let jmin = -2
|
|
let offsetx = 0
|
|
let offsety = 0
|
|
let mode = `mandelbrot`
|
|
preCalculatedGrid = []
|
|
runEveryTick(function(){
|
|
preCalculatedGrid = []
|
|
for (let x = 0; x < pixelMap.length; x++){
|
|
preCalculatedGrid.push([])
|
|
for (let y = 0; y < pixelMap[x].length; y++){
|
|
preCalculatedGrid[x].push({
|
|
x: x,
|
|
y: y,
|
|
iteration: 100,
|
|
})
|
|
}
|
|
}
|
|
for (let ix = 0; ix < preCalculatedGrid.length; ix++){
|
|
for (let iy = 0; iy < preCalculatedGrid[ix].length; iy++){
|
|
const range = jmax - jmin;
|
|
const scale = range / Math.min(width, height);
|
|
let x = (ix - width / 2) * scale + offsetx;
|
|
let y = (iy - height / 2) * scale + offsety;
|
|
let iteration = 0;
|
|
if (mode == `mandelbrot`){
|
|
let zx = 0;
|
|
let zy = 0;
|
|
let c = {x: x, y: y};
|
|
while (zx * zx + zy * zy < 4 && iteration < 100) {
|
|
let xtemp = zx * zx - zy * zy + c.x;
|
|
zy = 2 * zx * zy + c.y;
|
|
zx = xtemp;
|
|
iteration++;
|
|
}}
|
|
else { // burning ship
|
|
let zx = 0;
|
|
let zy = 0;
|
|
let c = {x: x, y: y};
|
|
while (zx * zx + zy * zy < 4 && iteration < 100) {
|
|
let xtemp = zx * zx - zy * zy + c.x;
|
|
zy = Math.abs(2 * zx * zy) + c.y;
|
|
zx = Math.abs(xtemp);
|
|
iteration++;
|
|
}
|
|
}
|
|
preCalculatedGrid[ix][iy].iteration = iteration
|
|
}
|
|
}
|
|
})
|
|
elements.mandelbrot = {
|
|
color: "#000000",
|
|
behavior: behaviors.WALL,
|
|
category: "mandelbrot tools",
|
|
onSelect: function(){
|
|
jmax = parseFloat(prompt("How far would you like it to extend in each direction?"))||2
|
|
jmin = -jmax
|
|
offsetx = parseFloat(prompt("How far would you like it to be offset in the x direction?"))||0
|
|
offsety = parseFloat(prompt("How far would you like it to be offset in the y direction?"))||0
|
|
mode = prompt("Mandelbrot or burning ship?")
|
|
},
|
|
tick: function(pixel){
|
|
// first, map canvas coord to a range of -2 to 2, but dont scale it, using width, height, and pixel.x and pixel.y
|
|
/*
|
|
const range = jmax - jmin;
|
|
const scale = range / Math.min(width, height);
|
|
const x = (pixel.x - width / 2) * scale + offsetx;
|
|
const y = -(pixel.y - height / 2) * scale + offsety;
|
|
let iteration = 0;
|
|
if (mode == `mandelbrot`){
|
|
let zx = 0;
|
|
let zy = 0;
|
|
let c = {x: x, y: y};
|
|
while (zx * zx + zy * zy < 4 && iteration < 100) {
|
|
let xtemp = zx * zx - zy * zy + c.x;
|
|
zy = 2 * zx * zy + c.y;
|
|
zx = xtemp;
|
|
iteration++;
|
|
}}
|
|
else { // burning ship
|
|
let zx = 0;
|
|
let zy = 0;
|
|
let c = {x: x, y: y};
|
|
while (zx * zx + zy * zy < 4 && iteration < 100) {
|
|
let xtemp = zx * zx - zy * zy + c.x;
|
|
zy = Math.abs(2 * zx * zy) + c.y;
|
|
zx = Math.abs(xtemp);
|
|
iteration++;
|
|
}
|
|
}
|
|
*/
|
|
iteration = preCalculatedGrid[pixel.x][pixel.y].iteration
|
|
if (iteration >= 99.5) {
|
|
pixel.color = "rgb(255, 255, 255)"
|
|
} else {
|
|
pixel.color = `rgb(0, ${67.3684*Math.pow(1.01578, iteration)-67.3684}, ${67.3684*Math.pow(1.01578, iteration)-67.3684})`
|
|
//console.log(iteration)
|
|
}
|
|
}
|
|
}
|
|
elements.mandelbrot_zoom_in = {
|
|
color: elements.heater.color,
|
|
category: "mandelbrot tools",
|
|
canPlace: false,
|
|
tool: function(){},
|
|
onSelect: function(){
|
|
jmax *= 0.95
|
|
jmin = -jmax
|
|
}
|
|
}
|
|
elements.mandelbrot_zoom_out = {
|
|
color: elements.cooler.color,
|
|
category: "mandelbrot tools",
|
|
canPlace: false,
|
|
tool: function(){},
|
|
onSelect: function(){
|
|
jmax *= 1.05
|
|
jmin = -jmax
|
|
}
|
|
}
|
|
elements.mandelbrot_move_left = {
|
|
color: elements.grape.color,
|
|
category: "mandelbrot tools",
|
|
canPlace: false,
|
|
tool: function(){},
|
|
onSelect: function(){
|
|
offsetx -= 0.05*jmax
|
|
}
|
|
}
|
|
elements.mandelbrot_move_right = {
|
|
color: elements.tomato.color,
|
|
category: "mandelbrot tools",
|
|
canPlace: false,
|
|
tool: function(){},
|
|
onSelect: function(){
|
|
offsetx += 0.05*jmax
|
|
}
|
|
}
|
|
elements.mandelbrot_move_up = {
|
|
color: elements.mix.color,
|
|
category: "mandelbrot tools",
|
|
canPlace: false,
|
|
tool: function(){},
|
|
onSelect: function(){
|
|
offsety += 0.05*jmax
|
|
}
|
|
}
|
|
elements.mandelbrot_move_down = {
|
|
color: elements.drag.color,
|
|
category: "mandelbrot tools",
|
|
canPlace: false,
|
|
tool: function(){},
|
|
onSelect: function(){
|
|
offsety -= 0.05*jmax
|
|
}
|
|
} |