C# 中点圆画圆问题
我试图用C语言实现中点绘制算法,从一个点向外扫描。 我有以下代码:C# 中点圆画圆问题,c#,algorithm,graphics,C#,Algorithm,Graphics,我试图用C语言实现中点绘制算法,从一个点向外扫描。 我有以下代码: private bool[,] squares; public Bitmap(int br, int h) { squares = new bool[br, h]; MakeCircle(9, 10, 10); MakeCircle(8, 10, 10); MakeCircle(7, 10, 10); MakeCircle(6, 10, 10); MakeCircle(5,
private bool[,] squares;
public Bitmap(int br, int h)
{
squares = new bool[br, h];
MakeCircle(9, 10, 10);
MakeCircle(8, 10, 10);
MakeCircle(7, 10, 10);
MakeCircle(6, 10, 10);
MakeCircle(5, 10, 10);
MakeCircle(4, 10, 10);
MakeCircle(3, 10, 10);
MakeCircle(2, 10, 10);
MakeCircle(1, 10, 10);
MakeCircle(0, 10, 10);
}
public void SelectSymmetry(int x, int y, int x0, int y0)
{
TryPlace(x + x0, y + y0);
TryPlace(-x + x0, y + y0);
TryPlace(x + x0, -y + y0);
TryPlace(-x + x0, -y + y0);
TryPlace(y + x0, x + y0);
TryPlace(-y + x0, x + y0);
TryPlace(y + x0, -x + y0);
TryPlace(-y + x0, -x + y0);
}
public void TryPlace(int x, int y)
{
if (x >= 0 && x < vakjes.GetLength(0) && y >= 0 && y < vakjes.GetLength(1))
{
squares[x, y] = true;
}
}
public void MakeCircle(int radius, int x0, int y0)
{
int x = 0;
int y = radius;
double d = 5 / 4.0 - radius;
SelectSymmetry(x, y, x0, y0);
while (x < y)
{
x++;
if (d < 0)
{
d += 2 * x + 1;
}
else
{
y--;
d += 2 * (x - y) + 1;
}
SelectSymmetry(x, y, x0, y0);
}
}
这将创建以下图像:
这就是问题所在。据我所知,没有两个圆圈占据同一个像素,但有一些像素没有被任何圆圈填充。有没有办法改变我的代码,使这些像素属于一个圆?任何帮助都将不胜感激
顺便说一句,很抱歉代码转储,但我觉得这是显示我问题的最直接的方式。只是不要试图用圆圈制作磁盘。不要调用MakeCircle 10次,只调用一次:
public void MakeDisk(int radius, int x0, int y0)
{
int x = 0;
int y = radius;
double d = 5 / 4.0 - radius;
for (int ty=y; ty>=x; --ty) {
SelectSymmetry(x, ty, x0, y0);
}
while (x < y)
{
x++;
if (d < 0)
{
d += 2 * x + 1;
}
else
{
y--;
d += 2 * (x - y) + 1;
}
for (int ty=y; ty>=x; --ty) {
SelectSymmetry(x, ty, x0, y0);
}
}
}
整数和三角学真的不会混合。画一个圆意味着使用正弦和余弦函数以及数字pi。这些都不能很好地处理整数。如果你有足够大的整数,那么你不会注意到整数数学带来的问题。但是您正在一个非常小的绘图面上工作。如果你想看到另一个类似的问题,拿一个小的位图图像,然后逐渐缩小它。该算法不能保证同心圆会完全填满空间。它只会创建好看的圆。当坡度超过1/2时,只通过一个坐标将创建孔。用一种方法检查两个操作系统来避免这种情况。