From 59a3e455f0640c04f401e803e6503cadaf7b2824 Mon Sep 17 00:00:00 2001 From: Bradlee Speice Date: Sat, 8 Mar 2025 18:14:00 -0500 Subject: [PATCH] Start writing the post --- .../4-camera/camera-controls.png | Bin 0 -> 33929 bytes .../4-camera/camera.ts | 9 +-- .../4-camera/index.mdx | 69 ++++++++++++++++++ 3 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 blog/2024-11-15-playing-with-fire/4-camera/camera-controls.png diff --git a/blog/2024-11-15-playing-with-fire/4-camera/camera-controls.png b/blog/2024-11-15-playing-with-fire/4-camera/camera-controls.png new file mode 100644 index 0000000000000000000000000000000000000000..829bd674f64c718fb72213d65f574ba521171307 GIT binary patch literal 33929 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 +## Restrictions + +To review, the restrictions we've had so far: + +> ...we need to convert from fractal flame coordinates to pixel coordinates. +> To simplify things, we'll assume that we're _plotting a square image_ with range $[0,1]$ for both x and y +> +> -- [The fractal flame algorithm](/2024/11/playing-with-fire) + +There are a couple problems here: + +First, the assumption that fractals get displayed in a square image. Ignoring aspect ratios simplifies +the render process, but we usually don't want square images. As a workaround, you could render +a large square image and crop it to fit an aspect ratio, but it's better to render the desired +image size to start with. + +Second, the assumption that fractals use the range $[0, 1]$. My statement above is an over-simplification; +for Sierpinski's Gasket, the solution set is indeed defined on $[0, 1]$, but all other images in the series +use a display range of $[-2, 2]$. + +Finally, the camera controls available in Apophysis/[`flam3`](https://github.com/scottdraves/flam3/wiki/XML-File-Format) +have a number of settings that were simply not implemented so far: + +
![Screenshot of Apophysis camera controls](./camera-controls.png)
+ +The parameters remaining to implement are scale, zoom, rotation, and position. + +## Scale + +Fractal flames are defined on a continuous range. At some point, we must convert from fractal flame coordinates +into specific pixels, and scale is the parameter we use to do it. Specifically, scale is **the number of pixels +in one unit of the fractal flame coordinate system**. + +For example, if you open the [reference parameters](../params.flame) in a text editor, you'll see the following: + +```xml + +``` + +This says that the final image should be 600 pixels wide and 600 pixels tall, centered at the point $(0, 0)$, +with 150 pixels per unit. Dividing 600 by 150 gives us an image that is 4 units wide and 4 units tall. +And because the center is at $(0, 0)$, the final image is effectively looking at the range $[-2, 2]$ in the +fractal coordinate system (as mentioned above). + +Scale can be used to implement a kind of "zoom" in images. If the reference parameters instead used `scale="300"`, +the same 600 pixels would instead be looking at the range $[-1, 1]$ in the fractal coordinate system. + +This also demonstrates the biggest problem with using scale: it's a parameter that only controls the output image. +If the output image changed to `size="1200 1200"`, and scale stayed the same, the output image would have +a lot more white space. Instead, it's usually better to use a different parameter for controlling image size. + +## Zoom + + +## Rotation + +## Offset + + + import CodeBlock from "@theme/CodeBlock"; import cameraSource from "!!raw-loader!./camera"