Initialisation du dépôt
DM d'intro
This commit is contained in:
commit
7f04a31779
3 changed files with 171 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
**/.idea/
|
||||||
|
**/cmake-build*/
|
20
snippets/CMakeLists.txt
Normal file
20
snippets/CMakeLists.txt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
project(snippets)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
|
add_executable(pM pietMondrian.cpp)
|
||||||
|
|
||||||
|
|
||||||
|
# Detect and add SFML
|
||||||
|
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
|
find_package(SFML COMPONENTS system window graphics network audio REQUIRED)
|
||||||
|
if(SFML_FOUND)
|
||||||
|
set(SFML_MODULES sfml-system sfml-window sfml-graphics sfml-network sfml-audio)
|
||||||
|
target_link_libraries(pM ${SFML_MODULES})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT SFML_FOUND)
|
||||||
|
message(FATAL_ERROR "SFML couldn't be located!")
|
||||||
|
endif()
|
149
snippets/pietMondrian.cpp
Normal file
149
snippets/pietMondrian.cpp
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <random>
|
||||||
|
#include <time.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
static constexpr int minSideLength = 15;
|
||||||
|
static constexpr float densityDecay = 0.6;
|
||||||
|
|
||||||
|
void drawRectangle(sf::RectangleShape& rectangle, sf::RenderWindow& window, const float colorMean = 0.8)
|
||||||
|
{
|
||||||
|
static std::random_device randomDevice;
|
||||||
|
static std::default_random_engine engine(randomDevice());
|
||||||
|
static std::poisson_distribution<uint8_t> colorDistribution(colorMean);
|
||||||
|
|
||||||
|
sf::Color rectangleColor;
|
||||||
|
switch (colorDistribution(engine))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
rectangleColor = sf::Color::White;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rectangleColor = sf::Color::Blue;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rectangleColor = sf::Color::Red;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
rectangleColor = sf::Color::Yellow;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rectangleColor = sf::Color::White;
|
||||||
|
}
|
||||||
|
|
||||||
|
rectangle.setFillColor(rectangleColor);
|
||||||
|
rectangle.setOutlineThickness(1);
|
||||||
|
rectangle.setOutlineColor(sf::Color::Black);
|
||||||
|
|
||||||
|
window.draw(rectangle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void divide(sf::RenderWindow& window, sf::RectangleShape* area, const float density=1, const float colorMean=0.8)
|
||||||
|
{
|
||||||
|
static std::random_device randomDevice;
|
||||||
|
static std::default_random_engine engine(randomDevice());
|
||||||
|
std::bernoulli_distribution divisionDistribution(density);
|
||||||
|
|
||||||
|
if(area->getSize().x == 0 || area->getSize().y == 0)
|
||||||
|
{
|
||||||
|
delete(area);
|
||||||
|
}
|
||||||
|
else if(area->getSize().x <= 2*minSideLength && area->getSize().y <= 2*minSideLength)
|
||||||
|
{
|
||||||
|
drawRectangle(*area,window,colorMean);
|
||||||
|
delete(area);
|
||||||
|
}
|
||||||
|
else if(divisionDistribution(engine))
|
||||||
|
{
|
||||||
|
const sf::Vector2f originalSize = area->getSize();
|
||||||
|
const sf::Vector2f originalPosition = area->getPosition();
|
||||||
|
|
||||||
|
delete(area);
|
||||||
|
|
||||||
|
uint16_t maxX = originalSize.x - minSideLength + 1; // Add one to let the rectangle occupy all the space
|
||||||
|
uint16_t maxY = originalSize.y - minSideLength + 1;
|
||||||
|
|
||||||
|
uint16_t newLength = 0;
|
||||||
|
if (maxX > minSideLength)
|
||||||
|
{
|
||||||
|
std::uniform_int_distribution<uint16_t> lengthDistribution(minSideLength,maxX);
|
||||||
|
newLength = lengthDistribution(engine);
|
||||||
|
if(newLength == originalSize.x - minSideLength + 1)
|
||||||
|
{
|
||||||
|
newLength = originalSize.x;
|
||||||
|
maxY--; // If the rectangle already occupies all x space, prevent it from occupying all y space
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newLength = originalSize.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t newWidth = 0;
|
||||||
|
if (maxY > minSideLength)
|
||||||
|
{
|
||||||
|
std::uniform_int_distribution<uint16_t> widthDistribution(minSideLength,maxY);
|
||||||
|
newWidth = widthDistribution(engine);
|
||||||
|
if(newWidth == originalSize.y - minSideLength + 1)
|
||||||
|
{
|
||||||
|
newWidth = originalSize.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newWidth = originalSize.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sf::RectangleShape* firstRectangle = new sf::RectangleShape(sf::Vector2f(newLength,newWidth));
|
||||||
|
firstRectangle->setPosition(originalPosition.x,originalPosition.y);
|
||||||
|
divide(window,firstRectangle,density*densityDecay,colorMean);
|
||||||
|
|
||||||
|
sf::RectangleShape* secondRectangle = new sf::RectangleShape(sf::Vector2f(newLength,originalSize.y-newWidth));
|
||||||
|
secondRectangle->setPosition(originalPosition.x,originalPosition.y+newWidth);
|
||||||
|
divide(window,secondRectangle,density*densityDecay,colorMean);
|
||||||
|
|
||||||
|
sf::RectangleShape* thirdRectangle = new sf::RectangleShape(sf::Vector2f(originalSize.x-newLength,newWidth));
|
||||||
|
thirdRectangle->setPosition(originalPosition.x+newLength,originalPosition.y);
|
||||||
|
divide(window,thirdRectangle,density*densityDecay,colorMean);
|
||||||
|
|
||||||
|
sf::RectangleShape* fourthRectangle = new sf::RectangleShape(sf::Vector2f(originalSize.x-newLength,originalSize.y-newWidth));
|
||||||
|
fourthRectangle->setPosition(originalPosition.x+newLength,originalPosition.y+newWidth);
|
||||||
|
divide(window,fourthRectangle,density*densityDecay,colorMean);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drawRectangle(*area,window,colorMean);
|
||||||
|
delete(area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
sf::RenderWindow window(sf::VideoMode(1067, 600), "Piet Mondrain style");
|
||||||
|
|
||||||
|
sf::RectangleShape* originalRectangle;
|
||||||
|
window.display();
|
||||||
|
|
||||||
|
while (window.isOpen())
|
||||||
|
{
|
||||||
|
sf::Event event;
|
||||||
|
while (window.pollEvent(event))
|
||||||
|
{
|
||||||
|
if (event.type == sf::Event::Closed)
|
||||||
|
window.close();
|
||||||
|
if (event.type == sf::Event::KeyPressed)
|
||||||
|
{
|
||||||
|
if (event.key.code == sf::Keyboard::Key::Space)
|
||||||
|
{
|
||||||
|
window.clear();
|
||||||
|
originalRectangle = new sf::RectangleShape(sf::Vector2f(window.getSize().x,window.getSize().y));
|
||||||
|
divide(window,originalRectangle,1,0.6);
|
||||||
|
window.display();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue