簡體   English   中英

如何用隨機大小的正方形和矩形填充正方形

[英]How can i fill a square with randomly sized squares and rectangles

所以我需要知道如何用隨機大小的矩形和正方形填充一個區域——例如:

我已經有一個部分工作的演示,但是它有很多無法工作的實例,除此之外,它需要大量的手動檢查,這不是最容易編程的事情,也不是有效的。

除了手頭的挑戰之外,我還想避免使用需要檢查碰撞的方法,例如在使用 ui 時使用附加的 RigidBody2D 或 Ray cast,並且想簡單地生成位置和大小表以便更輕松訪問(但是,如果這是不可避免的,我理解,如果是這種情況,請仍然分享您的答案)

我希望在表格的意義上模擬它,您可以將單元格合並在一起,但我不確定這是如何實現的 - 如果有的話。

先感謝您! :)

編輯:

關於 UnholySheep 的評論,我發現了這個 Kd-Tree 看起來很有希望,但是(如果我錯了,請糾正我)我不相信它可以在 csharp 中實現而不編程超出范圍,我認為它實際上繪制正方形而不是實現游戲對象或具有大小的 Rect 對象和位置。

此外,還有這個線程,但它再次提到使用 Kd-Tree 或我想避免的方法,或者正如 Brian 所說的使用合並方法,我認為在不編程再次超出范圍的整個表模塊的情況下無法統一實現. 此外,有人提到使用螺旋雖然是一種有趣的方法,但它不會導致我想要實現的隨機性。

為了澄清,我正在尋找一個相當簡單的算法——我不相信 Kd-tree 適合這個,但對於其他任何人來說,這可能是一個選項,因為有統一模塊

您的問題是一個挑戰,加上編寫完美生成圖像的代碼需要大量時間和耐心。 但在這里,我編寫了將各種字母字段放入二維數組的代碼。 只要這個數組是空的,它就會允許自己用隨機的矩形填充它們。

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:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM