【问题标题】:Drawing polygons using random points?使用随机点绘制多边形?
【发布时间】:2015-07-07 03:22:43
【问题描述】:

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

我试图通过随机推导径向坐标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;

}

【问题讨论】:

  • sincos 需要弧度作为双精度。你给它的学位是一个 int。
  • 我试过了,但还是否定的
  • 您正在使用基于随机点的(整数截断的)半径,并以 (0, 0) 为中心绘制一个圆,因此您当然会有负值。
  • 我建议你学习unit circle

标签: c++ math calculus


【解决方案1】:

sincos 返回以 (0, 0) 为中心的单位圆上的点,正如 paddy 指出的那样。要在您自己的多边形上的点中没有负值,您需要移动该圆的原点。你已经用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 绕单位圆一周。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多