首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >怎样才能以自然的方式计算“R中的所有方格”?

怎样才能以自然的方式计算“R中的所有方格”?
EN

Game Development用户
提问于 2014-03-31 01:28:26
回答 3查看 4.8K关注 0票数 8

我使用的是正方形网格,我有几个效果是针对R中的所有方块的,换句话说,是一个圆形(或球形)效应。

但是,圆圈是圆形的,正方形是.不那么简单,事情显然必须是近似的。例如:

但!我觉得有些近似没有给出我想要的近似。例如,考虑一下这个正方形:

很明显,大多数正方形都在圆圈内,但是使用一种纯粹的“平方计数”方法(即原点R中的所有平方),它就被忽略了。

是否有更好的算法来抓取其大部分区域位于圆圈内的所有正方形?

EN

回答 3

Game Development用户

回答已采纳

发布于 2014-03-31 02:46:38

如果没有现有算法的详细信息,很难说,但在任何涉及网格上的直线的情况下,我都发现答案是布列森姆氏,或者它的一个变体。在这种情况下,我建议查看中点圆算法。它可以给你一组外界瓷砖,然后从那里填充它。

票数 6
EN

Game Development用户

发布于 2014-04-10 22:27:00

因为所有其他的答案都把答案的一部分留给了读者。

传统的中点圆算法的实现看起来像下面的样子,只勾勒出圆圈。

代码语言:javascript
复制
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),但由于不使用余弦或平方函数而受益。它实际上也填充在圆圈中,而不是勾勒出它。

代码语言:javascript
复制
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);
}

更多关于圆圈的事。

票数 0
EN

Game Development用户

发布于 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);}

然后,对于每一种半径,随着它们的尺寸的增长,你可以添加更多的环。我建议如果(半径

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/72708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档