我如何用随机大小的正方形和矩形填充正方形
How can i fill a square with randomly sized squares and rectangles
所以我需要知道如何用随机大小的矩形和正方形填充一个区域 - 例如这样:
我已经有一个部分工作的演示,但是它有很多实例无法工作,除此之外,它需要uires 大量的手动检查,这不是最容易编程的事情,也不是效率高吗
除了手头的挑战之外,我还想避免使用需要ui重新检查碰撞的方法,例如在我使用 [=35= 时使用附加的 RigidBody2D 或射线投射] 并想简单地生成一个 table 的位置和大小以便于访问(但是,如果这是不可避免的,我理解,如果是这种情况,请仍然分享您的答案)
我希望在 table 的意义上模拟它,您可以在其中将单元格合并在一起,但我不确定这是如何实现的 - 如果有的话。
提前谢谢你! :)
编辑:
关于 UnholySheep 的评论,我发现 this。 Kd-Tree 看起来很有前途但是(如果我错了请纠正我)我不相信它可以在不超出范围的编程的情况下在 csharp 中实现,我认为它实际上是绘制正方形而不是实现具有大小的游戏对象或 Rect 对象和位置。
此外还有 this 线程,但它再次提到使用 Kd-Tree 或我想避免的方法,或者正如 Brian 所说,使用合并方法,我认为如果不编程整个 table 模块再次超出范围。另外有人提到使用螺旋,尽管这是一种有趣的方法,但它不会导致我想要实现的随机性。
澄清一下,我正在寻找一种相当简单的算法 - 我不相信 Kd 树适合这个,但对于其他人来说,这可能是一个选择,因为有 unity modules for this。
你的问题是一个挑战,而且编写完美生成图像的代码需要大量时间和耐心。但在这里我写了代码,将各种字母的字段放在一个二维数组中。只要此数组为空,它就会允许自己用随机矩形填充它们。
public enum squareType { none, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, Y, W, X, Z }
public squareType[,] cases = new squareType[4,4];
public void Start()
{
var lengthX = cases.GetLength(0);
var lengthY = cases.GetLength(1);
var index = 0;
for (var i = 0; i < lengthX; i++)
{
for (var j = 0; j < lengthY; j++)
{
if (cases[i,j] != squareType.none) continue;
var randomX = Random.Range(i, Mathf.Min(i+3, lengthX));
var randomY = Random.Range(j, Mathf.Min(j+3, lengthY));
var color = (squareType) Enum.ToObject(typeof(squareType), ++index);
for (var x = i; x <= randomX; x++)
{
for (var y = j; y <= randomY; y++) cases[x, y] = color;
}
}
}
// Debug table
for (var i = 0; i < lengthX; i++)
{
var xField = "";
for (var j = 0; j < lengthY; j++) xField += " | " + cases[i, j];
Debug.Log(xField);
}
}
示例结果 4x4:
示例结果 6x6:
所以我需要知道如何用随机大小的矩形和正方形填充一个区域 - 例如这样:
我已经有一个部分工作的演示,但是它有很多实例无法工作,除此之外,它需要uires 大量的手动检查,这不是最容易编程的事情,也不是效率高吗
除了手头的挑战之外,我还想避免使用需要ui重新检查碰撞的方法,例如在我使用 [=35= 时使用附加的 RigidBody2D 或射线投射] 并想简单地生成一个 table 的位置和大小以便于访问(但是,如果这是不可避免的,我理解,如果是这种情况,请仍然分享您的答案)
我希望在 table 的意义上模拟它,您可以在其中将单元格合并在一起,但我不确定这是如何实现的 - 如果有的话。
提前谢谢你! :)
编辑:
关于 UnholySheep 的评论,我发现 this。 Kd-Tree 看起来很有前途但是(如果我错了请纠正我)我不相信它可以在不超出范围的编程的情况下在 csharp 中实现,我认为它实际上是绘制正方形而不是实现具有大小的游戏对象或 Rect 对象和位置。
此外还有 this 线程,但它再次提到使用 Kd-Tree 或我想避免的方法,或者正如 Brian 所说,使用合并方法,我认为如果不编程整个 table 模块再次超出范围。另外有人提到使用螺旋,尽管这是一种有趣的方法,但它不会导致我想要实现的随机性。
澄清一下,我正在寻找一种相当简单的算法 - 我不相信 Kd 树适合这个,但对于其他人来说,这可能是一个选择,因为有 unity modules for this。
你的问题是一个挑战,而且编写完美生成图像的代码需要大量时间和耐心。但在这里我写了代码,将各种字母的字段放在一个二维数组中。只要此数组为空,它就会允许自己用随机矩形填充它们。
public enum squareType { none, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, Y, W, X, Z }
public squareType[,] cases = new squareType[4,4];
public void Start()
{
var lengthX = cases.GetLength(0);
var lengthY = cases.GetLength(1);
var index = 0;
for (var i = 0; i < lengthX; i++)
{
for (var j = 0; j < lengthY; j++)
{
if (cases[i,j] != squareType.none) continue;
var randomX = Random.Range(i, Mathf.Min(i+3, lengthX));
var randomY = Random.Range(j, Mathf.Min(j+3, lengthY));
var color = (squareType) Enum.ToObject(typeof(squareType), ++index);
for (var x = i; x <= randomX; x++)
{
for (var y = j; y <= randomY; y++) cases[x, y] = color;
}
}
}
// Debug table
for (var i = 0; i < lengthX; i++)
{
var xField = "";
for (var j = 0; j < lengthY; j++) xField += " | " + cases[i, j];
Debug.Log(xField);
}
}