我一直在尝试将C ++ DirectX代码重新编码为C#,这将有助于我绘制一个完美的圆圈。目前我有这个代码,我自己翻译:
private void Circle(int X, int Y, int radius, int numSides, Color color)
{
Vector2[] Line = new Vector2[128];
float Step = (float)(Math.PI * 2.0 / numSides);
int Count = 0;
for (float a = 0; a < Math.PI * 2.0; a += Step)
{
float X1 = (float)(radius * Math.Cos(a) + X);
float Y1 = (float)(radius * Math.Sin(a) + Y);
float X2 = (float)(radius * Math.Cos(a + Step) + X);
float Y2 = (float)(radius * Math.Sin(a + Step) + Y);
Line[Count].X = X1;
Line[Count].Y = Y1;
Line[Count + 1].X = X2;
Line[Count + 1].Y = Y2;
Count += 2;
}
line.Begin();
line.Draw(Line, color);
line.End();
}
问题在于绘制了圆形,但也是从圆形中的一个点到左上角的直线,就像这样。
答案 0 :(得分:1)
不要使用浮点变量进行迭代。它们可能在迭代期间变得不精确。在你的情况下,最后一步可能非常接近上限(而不是完全击中它)。因此它不会被计算并保留为默认(0, 0)
。
所以使用整数迭代变量:
for (int i = 0; i < numSides; ++i)
{
float a = i * Step;
...
}
然后,你也可以摆脱Count
。
此外,您应该使坐标缓冲区动态化:
Vector2[] Line = new Vector2[2 * numSides];