33 apply_sprator_algorithm(
BoolTable* half_side,
int number_of_steps)
40 [](
bool current,
const WallCounter& wc) -> std::optional<bool>
50 if(c == 2 || c == 3 ) {
return true; }
51 else {
return false; }
55 if(c <= 1) {
return true; }
56 else {
return false; }
68 while(
false == cell.is_done()) { cell.
update(); }
76 const auto half_width = half_side.
get_width();
77 const auto width = half_width * 2;
80 constexpr
auto offset = 1;
81 constexpr
auto extra_size = 2;
90 for(
int y=0;
y<height;
y+=1)
92 for(
int x=0;
x<half_width;
x+=1)
94 const auto src = half_side[{
x,
y}];
95 const auto x_mirror = width - (
x + 1);
96 result_table[{
x + offset,
y + offset}] = src;
97 result_table[{x_mirror + offset,
y + offset}] = src;
108 auto calculate_scale = [](
int image_scale,
int table_scale) ->
int
110 const auto image_scale_float =
static_cast<float>(image_scale);
111 const auto table_scale_float =
static_cast<float>(table_scale);
112 const auto scale_factor = image_scale_float / table_scale_float;
118 calculate_scale(image.width, table.
get_width()),
119 calculate_scale(image.height, table.
get_height())
127 draw_image_with_border
131 const Rgbai& background_color,
132 const Rgbai& foreground_color,
133 const Rgbai& border_color
136 clear(image, background_color);
142 calculate_scale(*image, result_table),
154 randomize_world(
BoolTable* half_side, TGenerator* generator)
160 [&]() ->
bool {
return generator->get_next_float01() < 0.5f; }
175 const Rgbai& foreground_color,
176 const std::optional<Rgbai> border_color_arg,
177 const Rgbai& background_color
180 constexpr
int half_width = 4;
181 constexpr
int height = 8;
182 const int number_of_steps = 3;
184 const Rgbai border_color = border_color_arg.value_or
186 calculate_border_color(foreground_color)
191 auto generator = TGenerator{code};
194 randomize_world<TGenerator>(&half_side, &generator);
197 apply_sprator_algorithm(&half_side, number_of_steps);
200 const auto result_table =
mirror(half_side);
203 draw_image_with_border(image, result_table, background_color, foreground_color, border_color);
215 std::vector<Image>* images,
217 const Rgbai& foreground_color,
218 const std::optional<Rgbai> border_color_arg,
219 const Rgbai& background_color
222 constexpr
int half_width = 4;
223 constexpr
int height = 8;
224 const int number_of_steps = 3;
226 const Rgbai border_color = border_color_arg.value_or
228 calculate_border_color(foreground_color)
233 auto generator = TGenerator{code};
236 randomize_world<TGenerator>(&half_side, &generator);
239 apply_sprator_algorithm(&half_side, number_of_steps - 1);
243 auto orig_half_side = half_side;
245 for(
auto& image: *images)
247 if(first) { first =
false; }
250 half_side = orig_half_side;
254 for(
int animation_frame=0; animation_frame<2; animation_frame+=1)
262 }
while(hit[{
x,
y}]);
264 half_side[{
x,
y}] = !half_side[{
x,
y}];
269 apply_sprator_algorithm(&half_side, 1);
272 const auto result_table =
mirror(half_side);
275 draw_image_with_border(&image, result_table, background_color, foreground_color, border_color);
288 const Rgbai& foreground_color,
289 std::optional<Rgbai> border_color_arg,
290 const Rgbai& background_color
293 render_sprator_impl<RandomXorShift32>
307 std::vector<Image>* images,
309 const Rgbai& foreground_color,
310 std::optional<Rgbai> border_color_arg,
311 const Rgbai& background_color
314 render_sprator_impl<RandomXorShift32>
void add_complex_rules(Rules *ca, int times, ChangeFunction change)
void clear(Image *image, const Rgbai &color)
void set_white_noise(BoolTable *world, Lrud< BorderSetupRule > border_control, std::function< bool()> rng)
void render_sprator(Image *image, U32 code, const Rgbai &foreground_color={NamedColor::white}, std::optional< Rgbai > border_color_arg=std::nullopt, const Rgbai &background_color={NamedColor::black, 0})
Image draw(const BoolTable &world, Rgbai wall_color, Rgbai space_color, int scale, std::optional< BorderSettings > border)
void paste_image(Image *dest_image, const vec2i &position, const Image &source_image, BlendMode blend_mode, PixelsOutside clip)
Rgbi to_rgbi(const Rgb &c)
Rgb to_rgb(const Rgbi &c)
size2f min(const size2f lhs, const size2f rhs)
size2f max(const size2f lhs, const size2f rhs)
int floor_to_int(float v)
constexpr static Angle from_degrees(float degrees)
Generic version of a CSS like padding type.
static Table from_width_height(Idx width, Idx height, T d=T())
int count(int step, bool include_self, NeighborhoodAlgorithm algorithm) const