【问题标题】:access coordinates in circle range访问圆范围内的坐标
【发布时间】:2019-03-11 23:58:17
【问题描述】:

我需要一种方法来遍历围绕给定坐标形成一个圆圈的所有坐标。 例如(看图),如果我给出灰色瓦片的坐标和半径 9,我需要得到所有红色瓦片的坐标。

这有点像 Bresenham 的圆算法,但我还真没看懂。

就我而言,我将使用它来擦除图块集中的圆形孔。 提前致谢!

【问题讨论】:

  • 如果你将每个图块映射到 x,y(Bitmap) 那么你可以遍历它们并查看它们是否在给定的 Circle(Center, Radius) 内...
  • 一种天真的方法是遍历方形边界框并检查从点到中心的距离是否低于您的半径。如果没有,什么也不做。
  • 您可以使用圆形论坛:mathwarehouse.com/geometry/circle/equation-of-a-circle.php 然后遍历像素并插入坐标。如果答案小于半径的平方,则像素在圆中。这避免了距离计算中常见的 sqrt()。 sqrt() 是一个昂贵的操作(相对而言)。

标签: c# unity3d


【解决方案1】:

使用 for 循环遍历所有图块 OR 递归

为:

public List<Tile> Circle (Tile center, float radius)
{
    List<Tile> inside = new List<Tile>();
    foreach (Tile[] tilerow in Tilemap)
        foreach (Tile tile in tilerow)
            if (Vector2.Distance(center.position, tile.position) <= radius) inside.Add(tile);
    return inside;
}

你也可以尝试使用递归(当你在圆圈内时从中心到所有邻居)——在小地图上会更快

【讨论】:

  • 使用循环时,您还可以考虑仅检查半径内的图块。所以 (center.position.X - radius) 到 (center.position.X + radius)。当您需要限制检查性能的图块数量时很有用。
猜你喜欢
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2013-01-31
  • 1970-01-01
  • 2023-03-16
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多