Skip to content

Commit 265980c

Browse files
committed
added additional option for changing the glitch tolerance in pauldelbrots criterion
1 parent e6cba8b commit 265980c

File tree

7 files changed

+48
-29
lines changed

7 files changed

+48
-29
lines changed

high_experimental.toml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
image_width = 1920
2-
image_height = 1080
1+
image_width = 8192
2+
image_height = 8192
33
rotate = 0
44
approximation_order = 64
5-
glitch_tolerance = 0.001
5+
glitch_percentage = 0.001
66
frames = 1
77
frame_offset = 0
88
zoom_scale = 2.0
9-
display_glitches = false
9+
display_glitches = true
1010
auto_adjust_iterations = true
1111
probe_sampling = 12
1212
remove_centre = false
@@ -16,4 +16,5 @@ export = "png"
1616
experimental = true
1717
high_precision_data_interval = 100
1818
valid_iteration_frame_multiplier = 0.75
19-
valid_iteration_probe_multiplier = 0.98
19+
valid_iteration_probe_multiplier = 0.98
20+
glitch_tolerance = 1.25e-6

locations/glitch_test2.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
real = "-1.7685304554715107439359975226423287998937254896566074423088827415719065562223946222490318219590860313620613389226996388e+00"
2+
imag = "5.9445386042946892550190097831583153039526746987365071641624831873576346016435037438597231970921541448697901394734283301e-03"
3+
zoom = "5.9680811401822433E112"
4+
iterations = 250000

locations/peanuts.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
real = "-1.94027658588345321091739528561871158285329803755715228746270703125"
2+
imag = "-0.00015063432290237573328275931307447270339596507504722367456943365"
3+
zoom = "1.36112946768E39"
4+
iterations = 9450

src/math/reference.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ pub struct Reference {
1111
// This is for every 100th iteration, when we do glitch correction the new references will be spawed from these values
1212
// Storing every iteration is memory intensive.
1313
pub high_precision_data_interval: usize,
14-
pub high_precision_data: Vec<ComplexArbitrary>
14+
pub high_precision_data: Vec<ComplexArbitrary>,
15+
pub glitch_tolerance: f64,
1516
}
1617

1718
#[derive(Clone)]
@@ -23,7 +24,7 @@ pub struct ReferenceIteration {
2324
}
2425

2526
impl Reference {
26-
pub fn new(z: ComplexArbitrary, c: ComplexArbitrary, current_iteration: usize, maximum_iteration: usize, high_precision_data_interval: usize) -> Reference {
27+
pub fn new(z: ComplexArbitrary, c: ComplexArbitrary, current_iteration: usize, maximum_iteration: usize, high_precision_data_interval: usize, glitch_tolerance: f64) -> Reference {
2728
Reference {
2829
start_iteration: current_iteration,
2930
current_iteration,
@@ -32,7 +33,8 @@ impl Reference {
3233
c,
3334
reference_data: Vec::with_capacity(1000),
3435
high_precision_data_interval,
35-
high_precision_data: Vec::with_capacity(1000)
36+
high_precision_data: Vec::with_capacity(1000),
37+
glitch_tolerance
3638
}
3739
}
3840

@@ -42,7 +44,7 @@ impl Reference {
4244
self.current_iteration += 1;
4345

4446
let z_fixed = to_fixed(&self.z);
45-
let z_tolerance = 1e-6 * z_fixed.norm_sqr();
47+
let z_tolerance = self.glitch_tolerance * z_fixed.norm_sqr();
4648

4749
let mut z_extended = to_extended(&self.z);
4850
z_extended.reduce();
@@ -67,7 +69,7 @@ impl Reference {
6769

6870
pub fn run(&mut self) {
6971
let z_fixed = to_fixed(&self.z);
70-
let z_tolerance = 1e-6 * z_fixed.norm_sqr();
72+
let z_tolerance = self.glitch_tolerance * z_fixed.norm_sqr();
7173

7274
let mut z_extended = to_extended(&self.z);
7375
z_extended.reduce();

src/math/series_approximation.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,10 @@ impl SeriesApproximation {
112112

113113
for i in 0..self.probe_sampling {
114114
for j in 0..self.probe_sampling {
115-
// possible improvement is to remove the probes in the centre of the image which are blacked out
116-
// if self.probe_sampling % 2 == 1 && (i == self.probe_sampling / 2 && j == self.probe_sampling / 2) {
117-
// continue;
118-
// } else {
119-
let real = (1.0 - 2.0 * (i as f64 / (self.probe_sampling as f64 - 1.0))) * self.delta_top_left.mantissa.re;
120-
let imag = (1.0 - 2.0 * (j as f64 / (self.probe_sampling as f64 - 1.0))) * self.delta_top_left.mantissa.im;
121-
122-
self.add_probe(ComplexExtended::new2(real, imag, self.delta_top_left.exponent));
123-
// }
115+
let real = (1.0 - 2.0 * (i as f64 / (self.probe_sampling as f64 - 1.0))) * self.delta_top_left.mantissa.re;
116+
let imag = (1.0 - 2.0 * (j as f64 / (self.probe_sampling as f64 - 1.0))) * self.delta_top_left.mantissa.im;
117+
118+
self.add_probe(ComplexExtended::new2(real, imag, self.delta_top_left.exponent));
124119
}
125120
}
126121

@@ -353,7 +348,7 @@ impl SeriesApproximation {
353348
*reference_z.mut_real() += &temp2 * &temp;
354349
*reference_z.mut_imag() += &temp3 * &temp;
355350

356-
Reference::new(reference_z, reference_c, iteration_reference, center_reference.maximum_iteration, self.high_precision_data_interval)
351+
Reference::new(reference_z, reference_c, iteration_reference, center_reference.maximum_iteration, self.high_precision_data_interval, center_reference.glitch_tolerance)
357352
}
358353

359354
pub fn evaluate(&self, point_delta: ComplexExtended, iteration: usize) -> ComplexExtended {

src/renderer.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub struct FractalRenderer {
1616
zoom: FloatExtended,
1717
auto_adjust_iterations: bool,
1818
maximum_iteration: usize,
19-
glitch_tolerance: f64,
19+
glitch_percentage: f64,
2020
data_export: DataExport,
2121
start_render_time: Instant,
2222
remaining_frames: usize,
@@ -39,7 +39,7 @@ impl FractalRenderer {
3939
let center_real = settings.get_str("real").unwrap_or(String::from("-0.75"));
4040
let center_imag = settings.get_str("imag").unwrap_or(String::from("0.0"));
4141
let approximation_order = settings.get_int("approximation_order").unwrap_or(0) as usize;
42-
let glitch_tolerance = settings.get_float("glitch_tolerance").unwrap_or(0.001);
42+
let glitch_percentage = settings.get_float("glitch_percentage").unwrap_or(0.001);
4343
let remaining_frames = settings.get_int("frames").unwrap_or(1) as usize;
4444
let frame_offset = settings.get_int("frame_offset").unwrap_or(0) as usize;
4545
let zoom_scale_factor = settings.get_float("zoom_scale").unwrap_or(2.0);
@@ -51,6 +51,7 @@ impl FractalRenderer {
5151
let iteration_division = settings.get_float("iteration_division").unwrap_or(0.1) as f32;
5252
let valid_iteration_frame_multiplier = settings.get_float("valid_iteration_frame_multiplier").unwrap_or(0.75) as f32;
5353
let valid_iteration_probe_multiplier = settings.get_float("valid_iteration_probe_multiplier").unwrap_or(0.98) as f32;
54+
let glitch_tolerance = settings.get_float("glitch_tolerance").unwrap_or(1e-6) as f64;
5455
let high_precision_data_interval = settings.get_int("high_precision_data_interval").unwrap_or(100) as usize;
5556

5657
let data_type = match settings.get_str("export").unwrap_or(String::from("COLOUR")).to_ascii_uppercase().as_ref() {
@@ -93,7 +94,8 @@ impl FractalRenderer {
9394
center_location.clone(),
9495
1,
9596
maximum_iteration,
96-
high_precision_data_interval);
97+
high_precision_data_interval,
98+
glitch_tolerance);
9799

98100
let series_approximation = SeriesApproximation::new_central(&center_location,
99101
auto_approximation,
@@ -121,7 +123,7 @@ impl FractalRenderer {
121123
zoom,
122124
auto_adjust_iterations,
123125
maximum_iteration,
124-
glitch_tolerance,
126+
glitch_percentage,
125127
data_export: DataExport::new(image_width, image_height, display_glitches, data_type, palette, iteration_division),
126128
start_render_time: Instant::now(),
127129
remaining_frames,
@@ -240,10 +242,12 @@ impl FractalRenderer {
240242
iteration: chosen_iteration,
241243
delta_centre: point_delta,
242244
delta_reference: point_delta,
243-
delta_current: new_delta,
245+
delta_current: new_delta.clone(),
244246
derivative_current: ComplexFixed::new(1.0, 0.0),
245247
glitched: false,
246-
escaped: false
248+
escaped: false,
249+
series_approximation_delta: new_delta,
250+
series_approximation_iteration: chosen_iteration
247251
}
248252
}).collect::<Vec<PixelData>>();
249253

@@ -260,19 +264,24 @@ impl FractalRenderer {
260264
std::io::stdout().flush().unwrap();
261265

262266
let correction_time = Instant::now();
267+
let mut correction_references = 1;
263268

264269
// Remove all non-glitched points from the remaining points
265270
pixel_data.retain(|packet| {
266271
packet.glitched
267272
});
268273

269-
while pixel_data.len() as f64 > 0.01 * self.glitch_tolerance * (self.image_width * self.image_height) as f64 {
274+
while pixel_data.len() as f64 > 0.01 * self.glitch_percentage * (self.image_width * self.image_height) as f64 {
270275
// delta_c is the difference from the next reference from the previous one
276+
271277
let glitch_reference_pixel = pixel_data.choose(&mut rand::thread_rng()).unwrap().clone();
272278

273279
let mut glitch_reference = self.series_approximation.get_reference(glitch_reference_pixel.delta_centre, &self.center_reference);
280+
281+
correction_references += 1;
274282
glitch_reference.run();
275283

284+
276285
let delta_current_reference = self.series_approximation.evaluate(glitch_reference_pixel.delta_centre, glitch_reference.start_iteration);
277286

278287
pixel_data.par_iter_mut()
@@ -281,7 +290,8 @@ impl FractalRenderer {
281290
pixel.glitched = false;
282291
pixel.delta_current = self.series_approximation.evaluate( pixel.delta_centre, glitch_reference.start_iteration) - delta_current_reference;
283292
pixel.delta_reference = pixel.delta_centre - glitch_reference_pixel.delta_centre;
284-
});
293+
});
294+
285295

286296
Perturbation::iterate(&mut pixel_data, &glitch_reference);
287297
self.data_export.export_pixels(&pixel_data, self.maximum_iteration, &glitch_reference);
@@ -292,6 +302,7 @@ impl FractalRenderer {
292302
});
293303
}
294304

305+
print!("| {:<6}", correction_references);
295306
print!("| {:<15}", correction_time.elapsed().as_millis());
296307
std::io::stdout().flush().unwrap();
297308

@@ -304,7 +315,7 @@ impl FractalRenderer {
304315

305316
pub fn render(&mut self) {
306317
// Print out the status information
307-
println!("{:<6}| {:<15}| {:<15}| {:<15}| {:<6}| {:<15}| {:<15}| {:<15}| {:<15}| {:<15}| {:<15}| {:<15}", "Frame", "Zoom", "Approx [ms]", "Skipped [it]", "Order", "Maximum [it]", "Packing [ms]", "Iteration [ms]", "Correct [ms]", "Saving [ms]", "Frame [ms]", "TOTAL [ms]");
318+
println!("{:<6}| {:<15}| {:<15}| {:<15}| {:<6}| {:<15}| {:<15}| {:<15}| {:<6}| {:<15}| {:<15}| {:<15}| {:<15}", "Frame", "Zoom", "Approx [ms]", "Skipped [it]", "Order", "Maximum [it]", "Packing [ms]", "Iteration [ms]", "Ref", "Correct [ms]", "Saving [ms]", "Frame [ms]", "TOTAL [ms]");
308319

309320
let mut count = 0;
310321

src/util/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,6 @@ pub struct PixelData {
163163
pub derivative_current: ComplexFixed<f64>,
164164
pub glitched: bool,
165165
pub escaped: bool,
166+
pub series_approximation_delta: ComplexExtended,
167+
pub series_approximation_iteration: usize
166168
}

0 commit comments

Comments
 (0)