在给定边数的情况下找到多边形的顶点?

时间:2013-08-28 22:54:21

标签: c++ opengl

我正在尝试一个函数,它将找到给定X个边和半径r的多边形的所有顶点。我的总体目标是制作一个圆圈,但由于你只能绘制直线,我必须制作一个多边形。所以所有的多边形都将以点(0,0)为中心。我想找到6边和半径的多边形的所有坐标,它将从.1迭代到1.0。这应该在彼此内部形成10个圆圈。 以下是我到目前为止的情况:

以下是我的错误:

52:33: error: variable-sized object ‘vertices’ may not be initialized
57:17: error: request for member ‘insert’ in ‘vertices’, which is of non-class type ‘iPoint [(((long unsigned int)(((long int)nVertices) + -0x00000000000000001)) + 1)]’

for循环的目标是获取给定半径的单个多边形的所有坐标,并将它们作为二维点(x坐标和y坐标)粘贴在verticies数组中。

3 个答案:

答案 0 :(得分:1)

  

有什么建议吗?

常规平面2D多边形上两点之间的角距离为2pi / N

由于评论而更新

我的写法略有不同。

 #include <math.h> // for M_PI

 void circle_points(
     double const radius,
     int const n_points,
     std::vector<Point<double>> &out_points )
 {
     out_points.resize(n_points);

     double const angular_distance = M_PI / (double)n_points;
     for( int i = 0; i < n_points; i++ ) {
          double const x = radius * sin(i * angular_distance);
          double const y = radius * cos(i * angular_distance);
          out_points[i] = Point<double>(x,y);
     }
 }

 void concentric_circles(
     double const radius_start,
     double const radius_end,
     int const n_circles,
     int const n_points_per_circle,
     std::vector<std::vector<Point<double>> &out_circles )
 {
     out_circles.resize(n_circles);
     double const radius_increment = (radius_end - radius_start) / n_circles;
     for( int i = 0; i < n_circles; i++ ) {
         circle_points(
             radius_start + radius_increment*i,
             n_points_per_circle,
             out_circles[i] );
     }
 }

我在这里通过引用传递向量,以避免在进入/离开函数范围时出现深拷贝。

答案 1 :(得分:1)

我会将Point vertices[nVerticies] = {};带出循环(for之前)。我还会将verticies更正为vertices。此外,数学函数sincos通常以弧度为单位,而不是度数。最后,角度增量不能是常数,而是依赖于({反})nVertices

全力以赴:

double radius = 0.1;
int nVertices = 6;
double angle = pi()*2/nVertices ;
while(radius <= 1.0)
{
     iPoint vertices[nVertices];
     for (int i = 0; i < nVertices; i++)
     {
          double x = 0 + radius * sin(i * angle);
          double y = 0 + radius * cos(i * angle);
          vertices[i]= iPoint(x,y) ;
     }
     radius = radius + 0.1;
}

答案 2 :(得分:0)

如果您希望顶点是静态数组并初始化它,请将'nVertices'声明为宏或const int。

const int nVertices = 6;