一种在网格上生成随机孔的算法

An algorithm for Generating Random Holes on a grid

我正在尝试制作“网格上的爆炸效果”,我需要一种算法来执行以下操作:

注意:网格代表一个List,我是想过滤掉红点

所以我们从给定的带有黑点的网格开始(在我们的例子中,黑点代表我们网格上的实心点,红点代表我们从列表中删除的点)

最终,我们的ractangle变成了这个边缘有孔的随机形状(蓝色区域)

我的尝试:

问题: 有时我的 star/circle 形状的半径很大,输出没有给我想要的“爆炸”效果(基本上,不可预测的输出),而且它确实限制了形状。

您有什么想法或知道一些可以提供帮助的数学算法吗?谢谢阅读! :)

对不起,如果我不够清楚,但这基本上就是我要找的:

这是获取模板的直接方法:

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {

            int size = 10;
            var grid = GetExplosionTemplate(size, new Random(),1);

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    Console.Write(grid[i + j * size] ? "X" : "O");
                }
                Console.WriteLine();
            }

        }

        private static bool[] GetExplosionTemplate(int size, Random rnd = null, float explosionRoughness = 0)
        {
            var grid = new bool[size * size];
            var rr = (size + 1) / 2f;
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                        var cellId = i + j * size;
                        var r = Math.Sqrt(Math.Pow(i - size / 2, 2) + Math.Pow(j - size / 2, 2)) + rnd?.NextDouble()*explosionRoughness ?? 0;
                        grid[cellId] = r > rr;
                }
            }
            return grid;
        }
    }
}

粗糙度大于1会产生分散的内部爆炸,小于1会产生更多的圆形爆炸。 0.5 到 1.5 左右的值非常适合寻找两个 even/non-even 值。你可以尝试让它看起来更好看,老实说,对于爆炸物理学,我宁愿选择基于细胞中 material 的粗糙度(例如,沙子渗透比石头更好),因为你不想要完全成熟的物理学你计算通过阻力单元加权的爆炸力(例如,洞穴中的爆炸将沿着空路径传播并轻微破坏环境,而不是在半径内产生真空)

实际模拟爆炸物理的另一种简单方法是使用递归。你从中心开始,爆炸力等于某个值,当你走得更远时,每个单元格都会消耗一部分能量(并且可能在过程中被摧毁),然后等量地向相邻单元格发射剩余部分能量(甚至访问过,所以你模拟爆炸波)。这样就 materials 而言将更加现实。您甚至可以通过电阻 materials 模拟部分空的单元格(例如,铁栅栏,它具有电阻但发射更好并摧毁周围的一切)