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)
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)
如果您的中心是原点,那么只需忽略centreX和centreY条款,因为它们将是0,0.
交换cos和重叠sin会将第一个点水平指向原点的右侧.