💡 Performance: only calculate points once
This commit is contained in:
parent
41c3ce8b17
commit
7019b4c40a
72
bundle.js
72
bundle.js
|
@ -491,18 +491,18 @@ function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.const
|
|||
};
|
||||
|
||||
/**
|
||||
* Apply the chaos game: starting from `start`, we plot
|
||||
* the next `n` points. To get to the next point, we apply
|
||||
* a random transformation among given ones
|
||||
* Starting from the last point in `points`, add
|
||||
* `iterations` number of point generated by applying
|
||||
* transformations chosen at random among `transforms`
|
||||
*
|
||||
* @param {Array} start Starting point
|
||||
* @param {Array} points Initial set of points
|
||||
* @param {number} iterations Number of points to plot
|
||||
* @param {Array} transforms List of available transforms
|
||||
* @param {Array} weights Probability weights for each transform
|
||||
* @return {null}
|
||||
*/
|
||||
var applyChaos = exports.applyChaos = function applyChaos(start, iterations, transforms, weights, cb) {
|
||||
var point = start;
|
||||
var applyChaos = exports.applyChaos = function applyChaos(points, iterations, transforms, weights) {
|
||||
var point = points[points.length - 1];
|
||||
|
||||
if (weights === undefined) {
|
||||
weights = Array.apply(null, Array(transforms.length)).map(function () {
|
||||
|
@ -513,8 +513,7 @@ function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.const
|
|||
while (iterations--) {
|
||||
var index = chooseIndex(weights);
|
||||
point = transforms[index](point);
|
||||
|
||||
cb(point);
|
||||
points.push(point);
|
||||
}
|
||||
};
|
||||
}, {}], 7: [function (require, module, exports) {
|
||||
|
@ -571,6 +570,8 @@ function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.const
|
|||
var width = undefined,
|
||||
height = undefined;
|
||||
|
||||
var points = [[0, 0]];
|
||||
|
||||
/**
|
||||
* Re-render the scene from scratch
|
||||
*
|
||||
|
@ -587,24 +588,22 @@ function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.const
|
|||
|
||||
// do the chaos game
|
||||
var image = ctx.getImageData(0, 0, width, height);
|
||||
var length = points.length;
|
||||
var color = [0, 0, 0];
|
||||
var skip = 50;
|
||||
|
||||
_chaos.applyChaos.apply(undefined, [[0, 0], 200000].concat(_toConsumableArray(_ifs.barnsley), [function (point) {
|
||||
var x = Math.floor(point[0] * zoom + center[0]);
|
||||
var y = height - Math.floor(point[1] * zoom + center[1]);
|
||||
for (var i = 50; i < length; i += 1) {
|
||||
var x = Math.floor(points[i][0] * zoom + center[0]);
|
||||
var y = height - Math.floor(points[i][1] * zoom + center[1]);
|
||||
|
||||
if (x >= 0 && x < width && y >= 0 && y < height && skip <= 0) {
|
||||
var i = (y * width + x) * 4;
|
||||
if (x >= 0 && x < width && y >= 0 && y < height) {
|
||||
var index = (y * width + x) * 4;
|
||||
|
||||
image.data[i] = color[0];
|
||||
image.data[i + 1] = color[1];
|
||||
image.data[i + 2] = color[2];
|
||||
image.data[i + 3] = 255;
|
||||
image.data[index] = color[0];
|
||||
image.data[index + 1] = color[1];
|
||||
image.data[index + 2] = color[2];
|
||||
image.data[index + 3] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
skip -= 1;
|
||||
}]));
|
||||
|
||||
ctx.putImageData(image, 0, 0);
|
||||
};
|
||||
|
@ -627,7 +626,7 @@ function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.const
|
|||
*/
|
||||
content.on('wheel', function (event) {
|
||||
var delta = event.deltaMode === 0 ? event.deltaY / 53 : event.deltaY;
|
||||
var newZoom = zoom * (1 - delta * .035);
|
||||
var newZoom = zoom * Math.max(0, 1 - delta * .035);
|
||||
|
||||
// which (unprojected) point does the mouse point on?
|
||||
var mouse = [(event.offsetX - center[0]) / zoom, (height - event.offsetY - center[1]) / zoom];
|
||||
|
@ -638,9 +637,33 @@ function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.const
|
|||
// => newCenter = mouse * zoom - mouse * newZoom + center
|
||||
center = [mouse[0] * zoom - mouse[0] * newZoom + center[0], mouse[1] * zoom - mouse[1] * newZoom + center[1]];
|
||||
|
||||
zoom = newZoom;
|
||||
render();
|
||||
if (newZoom > zoom) {
|
||||
_chaos.applyChaos.apply(undefined, [points, Math.floor((newZoom - zoom) * 1000)].concat(_toConsumableArray(_ifs.sierpinski)));
|
||||
} else {
|
||||
// points = points.slice(0, points.length + Math.floor((newZoom - zoom) * 1000));
|
||||
}
|
||||
|
||||
zoom = newZoom;
|
||||
|
||||
// time for some GC
|
||||
if (points.length > 1000000) {
|
||||
var length = points.length;
|
||||
var newPoints = [];
|
||||
var i = 0;
|
||||
|
||||
for (i = 0; i < length; i += 1) {
|
||||
var x = Math.floor(points[i][0] * zoom + center[0]);
|
||||
var y = height - Math.floor(points[i][1] * zoom + center[1]);
|
||||
|
||||
if (x >= 0 && x < width && y >= 0 && y < height) {
|
||||
newPoints.push(points[i]);
|
||||
}
|
||||
}
|
||||
|
||||
points = newPoints;
|
||||
}
|
||||
|
||||
render();
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
|
@ -668,6 +691,7 @@ function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.const
|
|||
}
|
||||
});
|
||||
|
||||
_chaos.applyChaos.apply(undefined, [points, 200000].concat(_toConsumableArray(_ifs.sierpinski)));
|
||||
window.onresize = resize;
|
||||
resize();
|
||||
}, { "./chaos": 6, "./ifs": 7, "the-dom": 1 }] }, {}, [8]);
|
||||
|
|
|
@ -20,18 +20,18 @@ const chooseIndex = weights => {
|
|||
};
|
||||
|
||||
/**
|
||||
* Apply the chaos game: starting from `start`, we plot
|
||||
* the next `n` points. To get to the next point, we apply
|
||||
* a random transformation among given ones
|
||||
* Starting from the last point in `points`, add
|
||||
* `iterations` number of point generated by applying
|
||||
* transformations chosen at random among `transforms`
|
||||
*
|
||||
* @param {Array} start Starting point
|
||||
* @param {Array} points Initial set of points
|
||||
* @param {number} iterations Number of points to plot
|
||||
* @param {Array} transforms List of available transforms
|
||||
* @param {Array} weights Probability weights for each transform
|
||||
* @return {null}
|
||||
*/
|
||||
export const applyChaos = (start, iterations, transforms, weights, cb) => {
|
||||
let point = start;
|
||||
export const applyChaos = (points, iterations, transforms, weights) => {
|
||||
let point = points[points.length - 1];
|
||||
|
||||
if (weights === undefined) {
|
||||
weights = Array.apply(null, Array(transforms.length)).map(
|
||||
|
@ -42,7 +42,6 @@ export const applyChaos = (start, iterations, transforms, weights, cb) => {
|
|||
while (iterations--) {
|
||||
const index = chooseIndex(weights);
|
||||
point = transforms[index](point);
|
||||
|
||||
cb(point);
|
||||
points.push(point);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -14,6 +14,8 @@ let dragging = false;
|
|||
let center, zoom = 200;
|
||||
let width, height;
|
||||
|
||||
let points = [[0, 0]];
|
||||
|
||||
/**
|
||||
* Re-render the scene from scratch
|
||||
*
|
||||
|
@ -30,24 +32,22 @@ const render = () => {
|
|||
|
||||
// do the chaos game
|
||||
const image = ctx.getImageData(0, 0, width, height);
|
||||
const length = points.length;
|
||||
const color = [0, 0, 0];
|
||||
let skip = 50;
|
||||
|
||||
applyChaos([0, 0], 200000, ...barnsley, point => {
|
||||
const x = Math.floor(point[0] * zoom + center[0]);
|
||||
const y = height - Math.floor(point[1] * zoom + center[1]);
|
||||
for (let i = 50; i < length; i += 1) {
|
||||
const x = Math.floor(points[i][0] * zoom + center[0]);
|
||||
const y = height - Math.floor(points[i][1] * zoom + center[1]);
|
||||
|
||||
if (x >= 0 && x < width && y >= 0 && y < height && skip <= 0) {
|
||||
const i = (y * width + x) * 4;
|
||||
if (x >= 0 && x < width && y >= 0 && y < height) {
|
||||
const index = (y * width + x) * 4;
|
||||
|
||||
image.data[i] = color[0];
|
||||
image.data[i + 1] = color[1];
|
||||
image.data[i + 2] = color[2];
|
||||
image.data[i + 3] = 255;
|
||||
image.data[index] = color[0];
|
||||
image.data[index + 1] = color[1];
|
||||
image.data[index + 2] = color[2];
|
||||
image.data[index + 3] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
skip -= 1;
|
||||
});
|
||||
|
||||
ctx.putImageData(image, 0, 0);
|
||||
};
|
||||
|
@ -70,7 +70,7 @@ const resize = () => {
|
|||
*/
|
||||
content.on('wheel', event => {
|
||||
const delta = event.deltaMode === 0 ? event.deltaY / 53 : event.deltaY;
|
||||
const newZoom = zoom * (1 - delta * .035);
|
||||
const newZoom = zoom * Math.max(0, 1 - delta * .035);
|
||||
|
||||
// which (unprojected) point does the mouse point on?
|
||||
const mouse = [
|
||||
|
@ -113,5 +113,6 @@ content.on('mousemove', event => {
|
|||
}
|
||||
});
|
||||
|
||||
applyChaos(points, 200000, ...barnsley);
|
||||
window.onresize = resize;
|
||||
resize();
|
||||
|
|
Loading…
Reference in New Issue