我正在尝试生成一组我将连接以制作多边形的点。必须以系统的方式生成数据。
我试图通过随机导出径向坐标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 :(得分: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
一度围绕单位圆圈。