Skip to content

Commit 758c473

Browse files
committed
Changed mandelbrot return type from 2d to 1d array
1 parent 49e83f1 commit 758c473

File tree

5 files changed

+28
-38
lines changed

5 files changed

+28
-38
lines changed

source/mandelbrot/mandelbrot_window.cpp

+7-23
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,25 @@
1919
#include <iostream>
2020

2121
namespace fractal {
22-
std::array<float, 8> MandelbrotWindow::draw_coordinate_(
23-
display_coordinate display_coord, const avx512_complex& complex_coords
24-
)
25-
{
26-
static constexpr avx512_complex START{};
27-
std::array<iteration_count, 8> iterations =
28-
compute_iterations(START, complex_coords, MANDELBROT_MAX_ITERATIONS);
29-
30-
std::array<float, 8> ret{};
31-
for (size_t i = 0; i < 8; i++) {
32-
ret[i] = static_cast<float>(iterations[i]) / MANDELBROT_MAX_ITERATIONS;
33-
display_coord.x++;
34-
}
35-
return ret;
36-
}
3722

38-
std::unique_ptr<MandelbrotWindow::arr> MandelbrotWindow::calculate_(
23+
std::unique_ptr<MandelbrotWindow::pixel_iteration_counts> MandelbrotWindow::calculate_(
3924
const DisplayDomain& full_display_domain, const DisplayDomain& new_domain_selection
4025
)
4126
{
4227
to_complex_.update_display_domain(new_domain_selection);
4328

4429
auto process_coordinates = [&](display_coordinate coord) {
45-
return draw_coordinate_(coord, to_complex_.to_complex_projections(coord));
30+
return compute_iterations(
31+
{}, to_complex_.to_complex_projections(coord), MANDELBROT_MAX_ITERATIONS
32+
);
4633
};
4734

48-
auto ret = std::make_unique<arr>();
35+
auto ret = std::make_unique<pixel_iteration_counts>();
4936
auto process_chunk = [&](DisplayDomain::DisplayCoordinateIterator start,
5037
DisplayDomain::DisplayCoordinateIterator end) {
5138
for (auto it = start; it != end; it += 8) {
52-
display_coordinate pos = *it;
53-
std::array<float, 8> t = process_coordinates(pos);
54-
for (size_t i = 0; i < 8; ++i) {
55-
(*ret)[pos.x++][pos.y] = Percentage{t[i]};
56-
}
39+
std::array<iteration_count, 8> t = process_coordinates(*it);
40+
std::copy(t.begin(), t.end(), ret->begin() + it.get_underlying());
5741
}
5842
};
5943

source/mandelbrot/mandelbrot_window.hpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,16 @@
1414

1515
namespace fractal {
1616
class MandelbrotWindow {
17-
using arr = std::array<std::array<Percentage, WINDOW_HEIGHT + 8>, WINDOW_WIDTH + 8>;
1817
DisplayToComplexCoordinates to_complex_;
1918

20-
static std::array<float, 8> draw_coordinate_(
21-
display_coordinate display_coord, const avx512_complex& complex_coords
22-
);
23-
2419
public:
2520
MandelbrotWindow(
2621
const DisplayDomain& display_domain, const complex_domain& complex_domain
2722
);
2823

29-
std::unique_ptr<arr> calculate_(
24+
using pixel_iteration_counts =
25+
std::array<iteration_count, WINDOW_HEIGHT * WINDOW_WIDTH>;
26+
std::unique_ptr<pixel_iteration_counts> calculate_(
3027
const DisplayDomain& full_display_domain,
3128
const DisplayDomain& new_domain_selection
3229
);

source/mandelbrot/window.hpp

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "config.hpp"
34
#include "graphics/aspect_ratio/aspect_ratio.hpp"
45
#include "graphics/color_conversions/color_conversions.hpp"
56
#include "graphics/display_event_observer.hpp"
@@ -33,6 +34,18 @@ class Window : public DisplayEventObserver {
3334
);
3435
}
3536

37+
void
38+
set_pixel_colors(std::unique_ptr<MandelbrotWindow::pixel_iteration_counts> pixels)
39+
{
40+
for (auto it = DISPLAY_DOMAIN.begin(); it != DISPLAY_DOMAIN.end(); ++it) {
41+
Percentage color(
42+
static_cast<float>((*pixels)[it.get_underlying()])
43+
/ MANDELBROT_MAX_ITERATIONS
44+
);
45+
set_pixel_color(*it, color);
46+
}
47+
}
48+
3649
Window(DisplayDomain display_domain, complex_domain complex_domain) :
3750
DISPLAY_DOMAIN{display_domain}, complex_domain_{complex_domain},
3851
mandelbrot_{display_domain, complex_domain}
@@ -42,10 +55,7 @@ class Window : public DisplayEventObserver {
4255
display_domain.get_end_coordinate().y + 1u
4356
);
4457

45-
auto res = mandelbrot_.calculate_(DISPLAY_DOMAIN, DISPLAY_DOMAIN);
46-
for (display_coordinate pos : DISPLAY_DOMAIN) {
47-
set_pixel_color(pos, (*res)[pos.x][pos.y]);
48-
}
58+
set_pixel_colors(mandelbrot_.calculate_(DISPLAY_DOMAIN, DISPLAY_DOMAIN));
4959
}
5060

5161
void on_mouse_button_pressed(const sf::Event::MouseButtonEvent& event) override
@@ -60,10 +70,7 @@ class Window : public DisplayEventObserver {
6070
DisplayDomain ends = calculate_rectangle_end_points(
6171
{selection_start_x_, selection_start_y_}, {event.x, event.y}
6272
);
63-
auto res = mandelbrot_.calculate_(DISPLAY_DOMAIN, ends);
64-
for (display_coordinate pos : DISPLAY_DOMAIN) {
65-
set_pixel_color(pos, (*res)[pos.x][pos.y]);
66-
}
73+
set_pixel_colors(mandelbrot_.calculate_(DISPLAY_DOMAIN, ends));
6774
}
6875

6976
std::optional<std::unique_ptr<sf::Drawable>> get_drawable() override

source/units/display_domain.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ class DisplayDomain {
7979
}
8080

8181
bool operator==(const DisplayCoordinateIterator&) const = default;
82+
83+
uint32_t get_underlying() const { return current_coordinate_; }
8284
};
8385

8486
uint32_t width() const { return END_COORDINATE.x - START_COORDINATE.x; }

source/units/units.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Percentage {
2525
assert_true(percentage <= 1.0f);
2626
}
2727

28-
consteval explicit Percentage() : percentage_{0.0f} {}
28+
constexpr explicit Percentage() : percentage_{0.0f} {}
2929

3030
float get_percentage() const { return percentage_; }
3131
};

0 commit comments

Comments
 (0)