speice.io/posts/2023/06/flam3/2c-final.ts

87 lines
1.7 KiB
TypeScript

import {
Coefs,
Flame,
Transform,
linear,
julia,
popcorn,
pdj,
transform1Coefs,
transform1Weight,
transform2Coefs,
transform2Weight,
transform3Coefs,
transform3Pdj,
transform3Weight,
weightedChoice,
plot,
} from "./2a-variations";
import { TransformPost, transform2Post } from "./2b-post";
export class FlameFinal extends Flame {
constructor(
transforms: [number, Transform][],
public readonly final: Transform
) {
super(transforms);
}
render(quality: number, image: ImageData) {
var x = Math.random() * 2 - 1;
var y = Math.random() * 2 - 1;
const iter = quality * (image.width * image.height);
for (var i = 0; i < iter; i++) {
const transform = weightedChoice(this.transforms);
[x, y] = transform.apply(x, y);
// This line is the only thing that changes:
[x, y] = this.final.apply(x, y);
if (i > 20) {
plot(x, y, image);
}
}
}
}
export const finalCoefs: Coefs = {
a: 2,
b: 0,
c: 0,
d: 0,
e: 2,
f: 0,
};
export function renderFinal(image: ImageData) {
const transform1 = new Transform(transform1Coefs, [[1, julia]]);
const transform2 = new TransformPost(
transform2Coefs,
[
[1, linear],
[1, popcorn],
],
transform2Post
);
const [pdjA, pdjB, pdjC, pdjD] = transform3Pdj;
const transform3 = new Transform(transform3Coefs, [
[1, pdj(pdjA, pdjB, pdjC, pdjD)],
]);
const transformFinal = new Transform(finalCoefs, [[1, julia]]);
const flame = new FlameFinal(
[
[transform1Weight, transform1],
[transform2Weight, transform2],
[transform3Weight, transform3],
],
transformFinal
);
flame.render(1, image);
}