feat: add presets for mandelbrot
This commit is contained in:
+53
@@ -33,6 +33,35 @@ const JULIA_PRESETS: &[(&str, f64, f64)] = &[
|
|||||||
("siegel", -0.391, -0.587),
|
("siegel", -0.391, -0.587),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/// Curated beautiful Mandelbrot locations offered as one-click presets.
|
||||||
|
/// Each is `(name, center_re, center_im, half_height, iterations)`; the centers
|
||||||
|
/// are decimals parsed at full precision so deep places stay sharp.
|
||||||
|
const MANDEL_PLACES: &[(&str, &str, &str, f64, u32)] = &[
|
||||||
|
(
|
||||||
|
"Seahorse Valley",
|
||||||
|
"-0.743643887037158704752191506114774",
|
||||||
|
"0.131825904205311970493132056385139",
|
||||||
|
4.0e-6,
|
||||||
|
1500,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"Elephant Valley",
|
||||||
|
"0.2549870375144766",
|
||||||
|
"0.0005679790528465",
|
||||||
|
6.0e-5,
|
||||||
|
2000,
|
||||||
|
),
|
||||||
|
("Scepter Valley", "-1.360022", "0.041", 3.0e-4, 2000),
|
||||||
|
("Starburst", "-1.62917", "0.0203968", 1.5e-3, 1500),
|
||||||
|
(
|
||||||
|
"Deep Spiral",
|
||||||
|
"-0.7436438870371587",
|
||||||
|
"0.1318259042053",
|
||||||
|
8.0e-8,
|
||||||
|
3000,
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
/// Parameters a reference orbit was (or will be) computed for. Used to decide
|
/// Parameters a reference orbit was (or will be) computed for. Used to decide
|
||||||
/// when the current reference is stale enough to recompute.
|
/// when the current reference is stale enough to recompute.
|
||||||
struct RequestKey {
|
struct RequestKey {
|
||||||
@@ -232,6 +261,19 @@ impl FractalApp {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Jump to a preset Mandelbrot location: decimal center (parsed at the
|
||||||
|
/// precision the zoom needs), half-height, and a fitting iteration count.
|
||||||
|
fn go_to_place(&mut self, re: &str, im: &str, half_height: f64, iterations: u32) {
|
||||||
|
let bits = precision_for(half_height);
|
||||||
|
if let (Some(cre), Some(cim)) =
|
||||||
|
(big_from_decimal_str(re, bits), big_from_decimal_str(im, bits))
|
||||||
|
{
|
||||||
|
self.mode = FractalMode::Mandelbrot;
|
||||||
|
self.view = ViewState::with_center(cre, cim, half_height);
|
||||||
|
self.max_iterations = iterations.clamp(32, MAX_REF_POINTS as u32 - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Snapshot the current view as a shareable state.
|
/// Snapshot the current view as a shareable state.
|
||||||
fn share_state(&self) -> ShareState {
|
fn share_state(&self) -> ShareState {
|
||||||
let sig_digits = sig_digits_for(self.view.precision_bits());
|
let sig_digits = sig_digits_for(self.view.precision_bits());
|
||||||
@@ -506,6 +548,17 @@ impl FractalApp {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if self.mode == FractalMode::Mandelbrot {
|
||||||
|
ui.label("places:");
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
for &(name, re, im, half_height, iter) in MANDEL_PLACES {
|
||||||
|
if ui.small_button(name).clicked() {
|
||||||
|
self.go_to_place(re, im, half_height, iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
ui.separator();
|
ui.separator();
|
||||||
ui.add(
|
ui.add(
|
||||||
egui::Slider::new(&mut self.max_iterations, 32..=100_000)
|
egui::Slider::new(&mut self.max_iterations, 32..=100_000)
|
||||||
|
|||||||
Reference in New Issue
Block a user