一种在网格上生成随机孔的算法
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 模拟部分空的单元格(例如,铁栅栏,它具有电阻但发射更好并摧毁周围的一切)
我正在尝试制作“网格上的爆炸效果”,我需要一种算法来执行以下操作:
注意:网格代表一个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 模拟部分空的单元格(例如,铁栅栏,它具有电阻但发射更好并摧毁周围的一切)