2015-07-07 2 views
0

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

Я пытаюсь сгенерировать точку с помощью случайного вывода радиальной координаты 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' требуют радианов как двойной. Вы даете ему степень как int. – paddy

+0

Я попытался, но его все еще отрицательный – Pete

+0

Вы используете (целочисленный усеченный) радиус на основе случайной точки и рисуете окружность с центром (0, 0), поэтому, конечно, у вас будут отрицательные значения. – paddy

ответ

1

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 это один раз вокруг единичного круга.

Смежные вопросы