Skip to content

Commit a850d11

Browse files
committed
Cleaned up and refactored. Added in changeable data type.
1 parent 2a25206 commit a850d11

17 files changed

+539
-325
lines changed

output.png

-515 KB
Loading

src/bin/main.rs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
use std::time::Instant;
22
use rust_fractal::renderer::FractalRenderer;
3-
use float_extended::float_extended::FloatExtended;
4-
use std::{io, fs};
5-
use std::io::{stdout, stdin, Write, BufReader, BufRead};
6-
use std::fs::File;
3+
use std::fs;
4+
use std::io::{stdout, stdin, Write};
75

86
fn main() {
97
println!("Mandelbrot Renderer");
@@ -33,33 +31,27 @@ fn main() {
3331
for line in data.lines() {
3432
let mut parts = line.split_whitespace();
3533
// println!("{}", line);
36-
let mut temp = parts.next().unwrap();
34+
let temp = parts.next().unwrap();
3735

3836
match temp {
3937
"Re:" => {
40-
let mut temp2 = parts.next().unwrap();
41-
center_re = temp2;
38+
center_re = parts.next().unwrap();
4239
},
4340
"Im:" => {
44-
let mut temp2 = parts.next().unwrap();
45-
center_im = temp2;
41+
center_im = parts.next().unwrap();
4642
}
4743
"Zoom:" => {
48-
let mut temp2 = parts.next().unwrap();
49-
zoom = temp2;
44+
zoom = parts.next().unwrap();
5045
},
5146
"Iterations:" => {
52-
let mut temp2 = parts.next().unwrap();
53-
iterations = temp2;
47+
iterations = parts.next().unwrap();
5448
}
5549
_ => {}
5650
}
5751
}
5852

5953
println!("Zoom: {}", zoom);
6054

61-
println!("Rendering...");
62-
6355
let mut renderer = FractalRenderer::new(
6456
1000,
6557
1000,

src/lib.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
#![feature(extra_log_consts)]
2-
3-
// pub mod renderer;
42
pub mod renderer;
53
pub mod util;
6-
pub mod colouring;
7-
pub mod colouring2;
84
pub mod math;

src/math/mod.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
// pub mod perturbation_f64;
2-
// pub mod perturbation_f64_vectorised;
3-
pub mod perturbation;
4-
pub mod perturbation2;
5-
pub mod reference;
6-
pub mod reference2;
7-
pub mod series_approximation;
1+
pub mod perturbation_double;
2+
pub mod perturbation_extended;
3+
pub mod reference_double;
4+
pub mod reference_extended;
5+
pub mod series_approximation_double;
6+
pub mod series_approximation_extended;

src/math/perturbation.rs

Lines changed: 0 additions & 42 deletions
This file was deleted.

src/math/perturbation_double.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
use crate::math::reference_double::ReferenceDouble;
2+
use crate::util::PixelDataDouble;
3+
use rayon::prelude::*;
4+
5+
pub struct PerturbationDouble {}
6+
7+
impl PerturbationDouble {
8+
pub fn iterate(pixel_data: &mut Vec<PixelDataDouble>, reference: &ReferenceDouble, reference_current_iteration: usize) {
9+
pixel_data.par_chunks_mut(4)
10+
.for_each(|pixel_data| {
11+
for packet in pixel_data {
12+
// normal
13+
while packet.iteration < reference_current_iteration {
14+
// This uses the difference between the starting iteration of the reference - can be used to skip some
15+
let z = packet.delta_current + reference.z_reference[packet.iteration - reference.start_iteration];
16+
let z_norm = z.norm_sqr();
17+
18+
if z_norm < reference.z_tolerance[packet.iteration - reference.start_iteration] {
19+
packet.glitched = true;
20+
packet.delta_current = z;
21+
break;
22+
}
23+
24+
if z_norm > 1e16 {
25+
packet.escaped = true;
26+
packet.delta_current = z;
27+
break;
28+
}
29+
30+
// packet.derivative_current = 2.0 * z * packet.derivative_current + 1.0;
31+
packet.delta_current = 2.0 * reference.z_reference[packet.iteration - reference.start_iteration] * packet.delta_current + packet.delta_current * packet.delta_current + packet.delta_reference;
32+
packet.iteration += 1;
33+
}
34+
}
35+
});
36+
}
37+
}
38+
39+
40+

src/math/perturbation2.rs renamed to src/math/perturbation_extended.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
use crate::math::reference::Reference;
2-
use crate::util::{PixelData, PixelData2};
1+
use crate::util::PixelDataExtended;
32
use float_extended::util::FloatExp;
43

54
use rayon::prelude::*;
6-
use float_extended::float_extended::FloatExtended;
7-
use crate::math::reference2::Reference2;
5+
use crate::math::reference_extended::ReferenceExtended;
86
use std::cmp::max;
97

10-
pub struct Perturbation2 {}
8+
pub struct PerturbationExtended {}
119

12-
impl Perturbation2 {
13-
pub fn iterate(pixel_data: &mut Vec<PixelData2>, reference: &Reference, reference_current_iteration: usize) {
10+
impl PerturbationExtended {
11+
pub fn iterate(pixel_data: &mut Vec<PixelDataExtended>, reference: &ReferenceExtended, reference_current_iteration: usize) {
1412
pixel_data.par_chunks_mut(4)
1513
.for_each(|pixel_data| {
1614
for packet in pixel_data {

src/math/reference2.rs

Lines changed: 0 additions & 62 deletions
This file was deleted.

src/math/reference_double.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use crate::util::{ComplexArbitrary, ComplexFixed, to_fixed};
2+
3+
pub struct ReferenceDouble {
4+
pub start_iteration: usize,
5+
pub current_iteration: usize,
6+
pub maximum_iteration: usize,
7+
pub z: ComplexArbitrary,
8+
pub c: ComplexArbitrary,
9+
pub z_reference: Vec<ComplexFixed<f64>>,
10+
pub z_tolerance: Vec<f64>
11+
}
12+
13+
impl ReferenceDouble {
14+
pub fn new(z: ComplexArbitrary, c: ComplexArbitrary, current_iteration: usize, maximum_iteration: usize) -> ReferenceDouble {
15+
let z_fixed = to_fixed(&z);
16+
17+
// 1e-6 is the threshold for pauldelbrot's criterion
18+
ReferenceDouble {
19+
start_iteration: current_iteration,
20+
current_iteration,
21+
maximum_iteration,
22+
z,
23+
c,
24+
z_reference: vec![z_fixed],
25+
z_tolerance: vec![1e-6 * z_fixed.norm_sqr()]
26+
}
27+
}
28+
29+
pub fn step(&mut self) -> bool {
30+
self.z = self.z.clone().square() + &self.c;
31+
self.current_iteration += 1;
32+
let z_fixed = to_fixed(&self.z);
33+
self.z_reference.push(z_fixed);
34+
self.z_tolerance.push(1e-6 * z_fixed.norm_sqr());
35+
z_fixed.norm_sqr() <= 1e256
36+
}
37+
38+
39+
pub fn run(&mut self) -> bool {
40+
while self.current_iteration < self.maximum_iteration {
41+
if !self.step() {
42+
break;
43+
}
44+
};
45+
self.current_iteration == self.maximum_iteration
46+
}
47+
}

src/math/reference.rs renamed to src/math/reference_extended.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::util::{ComplexArbitrary, ComplexFixed, to_fixed, to_fixed_exp};
22

3-
pub struct Reference {
3+
pub struct ReferenceExtended {
44
pub start_iteration: usize,
55
pub current_iteration: usize,
66
pub maximum_iteration: usize,
@@ -10,8 +10,8 @@ pub struct Reference {
1010
pub z_tolerance: Vec<f64>
1111
}
1212

13-
impl Reference {
14-
pub fn new(z: ComplexArbitrary, c: ComplexArbitrary, current_iteration: usize, maximum_iteration: usize) -> Reference {
13+
impl ReferenceExtended {
14+
pub fn new(z: ComplexArbitrary, c: ComplexArbitrary, current_iteration: usize, maximum_iteration: usize) -> ReferenceExtended {
1515
let z_fixed = (to_fixed(&z), 0);
1616

1717
// Stored in premultiplied form
@@ -23,7 +23,7 @@ impl Reference {
2323
};
2424

2525
// 1e-6 is the threshold for pauldelbrot's criterion
26-
Reference {
26+
ReferenceExtended {
2727
start_iteration: current_iteration,
2828
current_iteration,
2929
maximum_iteration,
@@ -54,7 +54,6 @@ impl Reference {
5454
// If the value is not small we do the escape check, otherwise it has not escaped
5555
// as we do the check for 65536 on the perturbation, we need this to be more than that squared
5656
z_fixed.0.norm_sqr() <= 1e256
57-
// true
5857
}
5958

6059

0 commit comments

Comments
 (0)