speice.io/blog/2024-11-15-playing-with-fire/3-log-density/chaosGameHistogram.ts

78 lines
1.5 KiB
TypeScript
Raw Normal View History

2024-12-01 21:57:10 -05:00
// hidden-start
import { randomBiUnit } from "../src/randomBiUnit";
import { randomChoice } from "../src/randomChoice";
import { Props as ChaosGameFinalProps } from "../2-transforms/chaosGameFinal";
import { camera, histIndex } from "../src/camera";
2024-12-09 22:18:13 -05:00
const quality = 10;
const step = 100_000;
2024-12-01 21:57:10 -05:00
// hidden-end
type Props = ChaosGameFinalProps & {
paint: (
width: number,
height: number,
histogram: number[]
) => ImageData;
2024-12-01 21:57:10 -05:00
}
export function* chaosGameHistogram(
{
width,
height,
transforms,
final,
paint
}: Props
) {
const pixels = width * height;
const iterations = quality * pixels;
// highlight-start
const hist = Array<number>(pixels)
.fill(0);
const plotHist = (
x: number,
y: number
) => {
const [pixelX, pixelY] =
camera(x, y, width);
if (
pixelX < 0 ||
pixelX >= width ||
pixelY < 0 ||
pixelY >= height
)
return;
2024-12-09 22:18:13 -05:00
const hIndex =
histIndex(pixelX, pixelY, width, 1);
2024-12-09 22:18:13 -05:00
hist[hIndex] += 1;
};
// highlight-end
let [x, y] = [
randomBiUnit(),
randomBiUnit()
];
for (let i = 0; i < iterations; i++) {
const [_, transform] =
randomChoice(transforms);
[x, y] = transform(x, y);
const [finalX, finalY] = final(x, y);
if (i > 20) {
// highlight-start
plotHist(finalX, finalY);
// highlight-end
}
if (i % step === 0)
yield paint(width, height, hist);
}
yield paint(width, height, hist);
}