我使用的是正方形网格,我有几个效果是针对R中的所有方块的,换句话说,是一个圆形(或球形)效应。
但是,圆圈是圆形的,正方形是.不那么简单,事情显然必须是近似的。例如:
但!我觉得有些近似没有给出我想要的近似。例如,考虑一下这个正方形:
很明显,大多数正方形都在圆圈内,但是使用一种纯粹的“平方计数”方法(即原点R中的所有平方),它就被忽略了。
是否有更好的算法来抓取其大部分区域位于圆圈内的所有正方形?
发布于 2014-03-31 02:46:38
发布于 2014-04-10 22:27:00
因为所有其他的答案都把答案的一部分留给了读者。
传统的中点圆算法的实现看起来像下面的样子,只勾勒出圆圈。
draw_circle(int x0, int y0, int radius)
{
int x = radius, y = 0;
int radiusError = 1-x;
while(x >= y)
{
set_pixel(x + x0, y + y0);
set_pixel(y + x0, x + y0);
set_pixel(-x + x0, y + y0);
set_pixel(-y + x0, x + y0);
set_pixel(-x + x0, -y + y0);
set_pixel(-y + x0, -x + y0);
set_pixel(x + x0, -y + y0);
set_pixel(y + x0, -x + y0);
y++;
if (radiusError<0)
{
radiusError += 2 * y + 1;
} else {
x--;
radiusError+= 2 * (y - x + 1);
}
}
}
这是一种蛮力方法,它将物体从O(N)增加到O(N2),但由于不使用余弦或平方函数而受益。它实际上也填充在圆圈中,而不是勾勒出它。
void draw_circle (int radius)
{
int x, y;
for (y = -radius; y <= radius; y++)
for (x = -radius; x <= radius; x++)
if ((x * x) + (y * y) <= (radius * radius))
set_pixel(x, y);
}
发布于 2022-02-06 06:23:46
最后的答案通常是:硬编码。也就是说,如果您要以任何性能受限的方式使用这一点,例如与帧呈现交织在一起,并且假设您可以将问题绑定到某个合理的半径集,那么迭代对每个预定输出的引用将完全跳过计算阶段。
我建议拿出一些图表文件,然后把你想要选择的圆圈半径的正方形翻译出来,然后再使用这样的方法(c#)。
relativeAddress(s字节x= 0,s字节z= 0) { var _address = data.rootAddress;_address.X += x;_address.Z += z;addresses.Add(_address);}
然后,对于每一种半径,随着它们的尺寸的增长,你可以添加更多的环。我建议如果(半径
https://gamedev.stackexchange.com/questions/72708
复制相似问题