计算正多边形顶点的坐标

Nob*_*ody 28 c# algorithm math geometry polygon

我正在编写一个程序,我需要绘制任意数量边的多边形,每个边都由一个动态变化的给定公式进行翻译.有一些相当有趣的数学,但我被困在这个问题上.

如何只给出边数,并且理想地(但不是必须)将原点放在中心,我如何计算正多边形的顶点坐标(所有角度相等的顶点)?

例如:六边形可能有以下几点(都是floats):

( 1.5  ,  0.5 *Math.Sqrt(3) )
( 0    ,  1   *Math.Sqrt(3) )
(-1.5  ,  0.5 *Math.Sqrt(3) )
(-1.5  , -0.5 *Math.Sqrt(3) )
( 0    , -1   *Math.Sqrt(3) )
( 1.5  , -0.5 *Math.Sqrt(3) )
Run Code Online (Sandbox Code Playgroud)

我的方法看起来像这样:

void InitPolygonVertexCoords(RegularPolygon poly)
Run Code Online (Sandbox Code Playgroud)

并且需要将坐标添加到此(或类似的东西,如列表):

Point[] _polygonVertexPoints;
Run Code Online (Sandbox Code Playgroud)

我主要对这里的算法感兴趣,但C#中的例子会很有用.我甚至不知道从哪里开始.我该如何实施呢?它甚至可能吗?!

谢谢.

dei*_*nst 55

for (i = 0; i < n; i++) {
  printf("%f %f\n",r * Math.cos(2 * Math.PI * i / n), r * Math.sin(2 * Math.PI * i / n));
}
Run Code Online (Sandbox Code Playgroud)

这里r是circumsribing圆的半径.抱歉错误的语言No Habla C#.

基本上任意两个顶点之间的角度是2 pi/n,并且所有顶点都与原点相距r.

编辑: 如果你想让中心不是原点,那就说(x,y)

for (i = 0; i < n; i++) {
  printf("%f %f\n",x + r * Math.cos(2 * Math.PI * i / n), y + r * Math.sin(2 * Math.PI * i / n));
}
Run Code Online (Sandbox Code Playgroud)

  • 为了概括,我将XC和YC(圆的中心的坐标)和第一个顶点A的角度添加到cos/sin项中:px = xc + r*cos(2*pi*i/n + A ); py = yc + r*sin(2*pi*i/n + A); (3认同)
  • @rmx:嗯,这是一个数学问题,而不是编程问题.我想你知道圆的方程是'x ^ 2 + y ^ 2 = r ^ 2`.但是,为了使它成为一个程序,你必须分开`x`和`y`.该参数方程式执行此操作:`{x = r*cos(theta),y = r*sin(theta),其中0 <= theta <2*PI}`.要制作n侧多边形,只需为theta分配n个不同的值.要制作正多边形,只需做2*PI/n*i,其中0 <= i <n.有关更多信息,请参阅[Parametric equation - Wikipedia](http://en.wikipedia.org/wiki/Parametric_equation). (2认同)

Chr*_*isF 21

点数等于边数.

你需要的角度是angle = 2 * pi / numPoints.

然后从原点垂直上方开始,多边形的大小由下式给出radius:

for (int i = 0; i < numPoints; i++)
{
    x = centreX + radius * sin(i * angle);
    y = centreY + radius * cos(i * angle);
}
Run Code Online (Sandbox Code Playgroud)

如果您的中心是原点,那么只需忽略centreXcentreY条款,因为它们将是0,0.

交换cos和重叠sin会将第一个点水平指向原点的右侧.