Одна из возможных реализаций для генерации набора координат для правильного многоугольника:
Определить центр многоугольника , радиус и первая вершина 1 .
Повернуть вершину n раз 2 на угол: 360 / n.
В этой реализации я использую вектор для хранения сгенерированных координат и рекурсивную функцию для их генерации:
void generateRegularPolygon(vector<Point>& v, Point& center, int sidesNumber, int radius){
// converted to radians
double angRads = 2 * PI / double(sidesNumber);
// first vertex
Point initial(center.x, center.y - radius);
rotateCoordinate(v, center, initial, angRads, sidesNumber);
}
где:
void rotateCoordinate(vector<Point>& v, Point& axisOfRotation, Point& initial, double angRads, int numberOfRotations){
// base case: number of transformations < 0
if(numberOfRotations <= 0) return;
else{
// apply rotation to: initial, around pivot point: axisOfRotation
double x = cos(angRads) * (initial.x - axisOfRotation.x) - sin(angRads) * (initial.y - axisOfRotation.y) + axisOfRotation.x;
double y = sin(angRads) * (initial.x - axisOfRotation.x) + cos(angRads) * (initial.y - axisOfRotation.y) + axisOfRotation.y;
// store the result
v.push_back(Point(x, y));
rotateCoordinate(v, axisOfRotation, Point(x,y), angRads, --numberOfRotations);
}
}
Примечание:
Точка - это простой класс для переноса координаты в единую структуру данных:
class Point{
public:
Point(): x(0), y(0){ }
Point(int xx, int yy): x(xx), y(yy) { }
private:
int x;
int y;
};
1 с точки зрения (относительно) центра, радиуса.В моем случае первая вершина переводится из центра вверх по горизонтали на длину радиуса.
2 n-правильного многоугольника имеет n вершин.