#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
struct Point
{
int x;
int y;
};
//Алгоритм Брезенхема
void line(char * screen, size_t xMax, Point p0, Point p1)
{
bool steep = std::abs(p1.y - p0.y) > std::abs(p1.x - p0.x);
if(steep)
{
std::swap(p0.x, p0.y);
std::swap(p1.x, p1.y);
}
if(p0.x > p1.x)
{
std::swap(p0.x, p1.x);
std::swap(p0.y, p1.y);
}
int dx = p1.x - p0.x;
int dy = std::abs(p1.y - p0.y);
int error = dx / 2;
int ystep = (p0.y < p1.y) ? 1 : -1;
int y = p0.y;
for(int x = p0.x; x <= p1.x; ++x)
{
screen[steep ? y + x * xMax : x + y * xMax] = '*';
error -= dy;
if(error < 0)
{
y += ystep;
error += dx;
}
}
}
template <size_t (*next)(size_t, size_t), size_t M>
void paintFigure(char (&screen)[M], size_t xMax, Point * points, size_t size)
{
for(size_t idx = 0; idx < size; ++idx)
{
line(screen, xMax, points[idx], points[next(idx, size)]);
}
std::fwrite(screen, sizeof(char), M / sizeof(char), stdout);
}
size_t nextPoint(size_t idx, size_t limit)
{
return (idx += 1) >= limit ? idx - limit : idx;
}
int main()
{
enum
{
Chars = 20
, Lines = 20
};
char screen[(Chars + 1) * Lines];
std::memset(screen, ' ', sizeof(screen));
for(size_t lines = 0; lines < Lines; ++lines)
{
screen[Chars + lines * (Chars + 1)] = '\n';
}
Point center = {Chars / 2, Lines / 2};
int side;
std::cout << "Enter side: 5";
side = 5;
//std::cin >> side;
if(side <= Lines && side <= Chars && side > 0)
{
const size_t numPoints = 4;
const bool a = side % 2 == 0;
side /= 2;
Point points[numPoints] =
{
{center.x + (side - a), center.y + (side - a)}
,{center.x - side, center.y + (side - a)}
,{center.x - side, center.y - side}
,{center.x + (side - a), center.y - side}
};
paintFigure<&nextPoint>(screen, Chars + 1, points, numPoints);
}
else
{
std::cerr << "Side is not in [1:20]\n";
}
}