使用随机点绘制多边形?

时间:2015-07-07 03:22:44

标签: c++ math calculus

我正在尝试生成一组我将连接以制作多边形的点。必须以系统的方式生成数据。

我试图通过随机导出径向坐标r并均匀地增加角坐标theta来生成点集,使得所有点都有序地链接而不相互交叉。我遵循了正确的公式并且我增加了角度,但由于sincos,数据显示为负数。我想知道我是否正确这样做。

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;

}

1 个答案:

答案 0 :(得分:1)

paddy指出,以sin为中心的单位圆上的

cos(0, 0)返回点。要在您自己的多边形上的点中没有负值,您需要移动该圆的原点。您已使用r * sin(theta)更改其大小;您可以通过以下方式完成最低限度的翻译:

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

当我对您的程序进行此更改时,我不再获得负值。

话虽如此,我怀疑你没有以你想要的方式递增theta。如果您尝试将圆圈划分为10个相等的角度,那么theta应该是floatdouble,并且会增加如下:

theta += (2 * M_PI / 10);

theta以弧度为单位,因此2 * M_PI一度围绕单位圆圈。