Created
November 17, 2013 21:17
-
-
Save jameslzhu/7518375 to your computer and use it in GitHub Desktop.
Outputs a pixelated circle to the console.
Useful for graphics or Minecraft.
This file contains 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 <iostream> | |
#include <vector> | |
#include <array> | |
typedef std::array<float, 2> xyCoord; | |
float isInCircle(float x, float y, float radius); | |
void setSquareCoords(int row, int column, std::array<xyCoord, 4>& square); | |
int main() | |
{ | |
enum {x, y}; | |
float radius; | |
int dia; | |
std::vector<std::vector<bool>> squares; | |
std::array<xyCoord, 4> squareCorners; // coords for square's corners | |
squareCorners.fill({{0.0f, 0.0f}}); | |
// Input diameter | |
std::cout << "Diameter: "; | |
std::cin >> dia; | |
std::cin.ignore(); | |
std::cout << std::endl; | |
squares.resize(dia); | |
radius = static_cast<float>(dia) / 2.0f; | |
// Generate circle by looping through each row / col position | |
for (int row = 0; row < dia; row++) | |
{ | |
for (int col = 0; col < dia; col++) | |
{ | |
int sum = 0; | |
setSquareCoords(row, col, squareCorners); | |
// If 2/4 corners of block are inside circle radius, block is inside circles | |
for (auto corner : squareCorners) | |
{ | |
if (isInCircle(corner[x], corner[y], radius)) | |
sum++; | |
} | |
if (sum >= 2) | |
squares[row].push_back(true); | |
else | |
squares[row].push_back(false); | |
} | |
} | |
// output to console | |
for (auto row : squares) | |
{ | |
for (auto position : row) | |
{ | |
if (position == true) | |
std::cout << '#'; | |
else | |
std::cout << ' '; | |
} | |
std::cout << std::endl; | |
} | |
std::cin.ignore(); | |
return 0; | |
} | |
float isInCircle(float x, float y, float radius) | |
{ | |
x -= radius; | |
y -= radius; | |
return (x * x + y * y <= radius * radius); | |
} | |
void setSquareCoords(int row, int column, std::array<xyCoord, 4>& square) | |
{ | |
enum {top_left, top_right, bottom_left, bottom_right}; | |
enum {x, y}; | |
for (unsigned corner = 0; corner < square.size(); corner++) | |
{ | |
switch (corner) | |
{ | |
case top_left: | |
square[corner][x] = static_cast<float>(row); | |
square[corner][y] = static_cast<float>(column); | |
break; | |
case top_right: | |
square[corner][x] = static_cast<float>(row); | |
square[corner][y] = static_cast<float>(column) + 1.0f; | |
break; | |
case bottom_left: | |
square[corner][x] = static_cast<float>(row) + 1.0f; | |
square[corner][y] = static_cast<float>(column); | |
break; | |
case bottom_right: | |
square[corner][x] = static_cast<float>(row) + 1.0f; | |
square[corner][y] = static_cast<float>(column) + 1.0f; | |
break; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment