Рисование полигонов с использованием случайных точек?

Я пытаюсь создать набор точек, которые я буду соединять, чтобы создать многоугольник. Данные должны генерироваться систематически.

Я пытаюсь сгенерировать заданную точку путем случайного получения радиальной координаты. r и равномерно увеличивая угловую координату theta так, чтобы все точки были связаны упорядоченно, не пересекаясь друг с другом. Я следовал правильным формулам и увеличивал угол, но данные получались отрицательными из-за sin а также cos, Я хотел знать, правильно ли я это делаю.

struct Point2D {
int x;
int y;
};

Point2D poly[10];
int N = 80;

int x = (rand() % N + 1) * 5;
int y = (rand() % N + 1) * 5;
int r = sqrt(x*x + y*y);
int theta = int(atan ((float)y/(float)x) * 180 / PI);

cout << "x " << x << " y " << y << " r " << r << " theta " << theta << endl;

for (int i = 0; i < 10; i++) {

Point2D p;
p.x = x;
p.y = y;
poly[i] = p;

theta += 20;
x = r * sin(theta);
y = r * cos(theta);

cout << "x " << x << " y " << y << endl;

}

0

Решение

sin а также cos возвратные точки на единичной окружности с центром вокруг (0, 0), как указал Пэдди. Чтобы не иметь отрицательных значений в точках на вашем собственном многоугольнике, вам нужно сместить начало этого круга. Вы уже меняете его размер, с r * sin(theta); Вы можете выполнить минимальный перевод с:

x = r * cos(theta) + r;
y = r * cos(theta) + r;

Когда я делаю это изменение в вашей программе, я больше не получаю отрицательных значений.

Сказав это, я подозреваю, что вы не увеличиваете theta так, как вы собираетесь. Если вы пытаетесь разделить круг на 10 равных углов, то theta должен быть float или же double и увеличивается так:

theta += (2 * M_PI / 10);

theta в радианах, так 2 * M_PI один раз вокруг круга единицы.

1

Другие решения