Created
June 13, 2023 05:55
-
-
Save Blizzardo1/1293ba2cb3e57b76e35af6d09246ae9a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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