Skip to content

Instantly share code, notes, and snippets.

@Blizzardo1
Created June 13, 2023 05:55
Show Gist options
  • Save Blizzardo1/1293ba2cb3e57b76e35af6d09246ae9a to your computer and use it in GitHub Desktop.
Save Blizzardo1/1293ba2cb3e57b76e35af6d09246ae9a to your computer and use it in GitHub Desktop.
#include <cmath>
#include <cstdio>
#include <iostream>
#include <string>
#include "include/SDL.h"
enum
{
/**
* \brief Window Width
*/
width = 1366,
/**
* \brief Window Height
*/
height = 768
};
void draw_triangle(SDL_Renderer* renderer, const float x, const float y, const float size) {
const float half_size = size / 2.0f;
const float height = half_size * (std::sqrt(3.0f) / 2.0f);
const int start_x = static_cast<int>(roundf(x));
const int start_y = static_cast<int>(roundf(y + half_size + 4));
const int left_x = static_cast<int>(roundf(x - half_size));
const int left_y = static_cast<int>(roundf(y - height));
const int right_x = static_cast<int>(roundf(x + half_size));
const int right_y = static_cast<int>(roundf(y - height));
SDL_RenderDrawLine(renderer, left_x, left_y, right_x, right_y);
SDL_RenderDrawLine(renderer, right_x, right_y, start_x, start_y);
SDL_RenderDrawLine(renderer, start_x, start_y, left_x, left_y);
}
void sierpinski_sieve(SDL_Renderer* renderer, const int n, const float x, const float y, const float size) {
if (n == 0) {
draw_triangle(renderer, x, y, size);
}
else {
const float new_size = size / 2;
sierpinski_sieve(renderer, n - 1, x, y, new_size);
sierpinski_sieve(renderer, n - 1, x + new_size, y, new_size);
sierpinski_sieve(renderer, n - 1, x + new_size / 2, y + new_size, new_size);
}
}
void clear_screen(SDL_Renderer* renderer) {
SDL_SetRenderDrawColor(renderer, 23, 23, 23, 255);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
int main(int argc, char* argv[]) {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("Sierpinski Triangle", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
clear_screen(renderer);
int n = 3;
int ret = 0;
constexpr SDL_RendererFlip flip = SDL_FLIP_VERTICAL;
SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height);
printf("Enter the number of iterations for the Sierpinski Triangle: ");
std::cin >> n;
SDL_Event ev;
while(SDL_WaitEvent(&ev)) {
if (ev.type == SDL_QUIT) break;
SDL_SetRenderTarget(renderer, texture);
// Continue to draw
clear_screen(renderer);
SDL_SetRenderDrawColor(renderer, 190, 190, 190, 255);
sierpinski_sieve(renderer, n, static_cast<float>(width) / 2 - static_cast<float>(width) / 4, 64, static_cast<float>(width) / 2);
SDL_SetRenderTarget(renderer, nullptr);
SDL_RenderCopyEx(renderer, texture, nullptr, nullptr, 0, nullptr, flip);
SDL_RenderPresent(renderer);
SDL_Delay(500);
}
SDL_Surface* surface = SDL_GetWindowSurface(window);
SDL_RenderReadPixels(renderer, nullptr, surface->format->format, surface->pixels, surface->pitch);
const std::string filename = "sierpinski-"+ std::to_string(n) + " levels.png";
SDL_SaveBMP(surface, filename.c_str());
SDL_DestroyTexture(texture);
SDL_FreeSurface(surface);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
std::cout << "Sierpinski Triangle saved as " << filename << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment