Я пытаюсь создать набор точек, которые я буду соединять, чтобы создать многоугольник. Данные должны генерироваться систематически.
Я пытаюсь сгенерировать заданную точку путем случайного получения радиальной координаты. 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;
}
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
один раз вокруг круга единицы.