c#summarize Grid类似结构中的块

时间:2014-09-13 10:46:23

标签: c# algorithm unity3d game-engine

我正在寻找一种可以找到网格中最大区域的算法。

如果我有这样的事情:

http://i60.tinypic.com/14v1lbo.png

红色区块=有碰撞的区块

我必须检查28次碰撞Objekts。

我需要一种可以找到它的算法:

http://i57.tinypic.com/sy3spi.png

现在我只需要检查5个Objekts。

是否有一个简单的c#算法?

2 个答案:

答案 0 :(得分:1)

如果您想要绝对最小数量的矩形,那么我建议你this answer。既然你想要轻松,我的建议就是这样,这是最小的2竞争。首先,通过逐行扫描行,找到最小的精确覆盖,矩形只有一行高。

00000000
1      2
3  44  5
6  77  8
99999999

现在依次为每对相邻行尝试合并它们的矩形。假设它们按水平位置排序,则循环看起来像排序合并。

00000000
--------
1      2

不可能合并。

1      2
--------
3  44  5

合并1, 32, 5

1      2
1  44  2
--------
6  77  8

合并1, 64, 7以及2, 8

1      2
1  44  2
1  44  2
--------
99999999

无法合并。最终结果如下。

00000000
1      2
1  44  2
1  44  2
99999999

答案 1 :(得分:-2)

这是Unity的解决方案

using UnityEngine;
using System.Collections;

public  class CollisionTileMerger:MonoBehaviour{

    ArrayList rects = new ArrayList();

    public int[,] rowCheck(int[,]array)
    {
        int y = array.GetLength(0);
        int x = array.Length /y ;

        int count = 1;
        ArrayList rec = new ArrayList ();

        for(int i=0; i< y ;i++){

            for(int j=0; j< x ;j++)
            {
                if(array[i,j] == -1)
                {
                    array[i,j] = count;
                    rec.Add(i);
                    rec.Add(j);
                }
                else
                {   
                    if(rec.Count>0)
                    {
                        rects.Add (rec);
                        rec = new ArrayList();
                        count++;
                    }
                }
            }
            if(rec.Count>0)
            {
                rects.Add (rec);
                rec = new ArrayList();
                count++;
            }
        }

        return array;
    }

    public int[,] Merger(int[,]array)
    {
        int y = array.GetLength(0);
        int x = array.Length /y ;
        int[,] coppy = (int[,])array.Clone ();

        for (int i=0; i< y-1; i++) 
        {
        int row = i;
        for (int j=0; j< x; j++) 
        {
            if(coppy[row,j]>0&&coppy[row+1,j]>0)
            {
                if(j==0)
                {
                    coppy[row+1,j] = coppy[row,j];
                }
                else
                {
                    if((coppy[row,j-1]>0&&coppy[row+1,j-1]>0)||(coppy[row,j-1]==0&&coppy[row+1,j-1]==0))
                    {
                        coppy[row+1,j] = coppy[row,j];

                            if(j==x-1)
                            {
                                //letzte Zeile
                                //speichern
                                array = (int[,])coppy.Clone ();

                            }
                    }
                    else
                    {
                        //zurücksetzen
                        coppy = (int[,])array.Clone ();
                    }
                }
            }
            else if(coppy[row,j]==0&&coppy[row+1,j]==0)
            {
                //speichern
                array = (int[,])coppy.Clone ();
            }
            else
            {
                //zurücksetzen
                coppy = (int[,])array.Clone ();
            }

        }

        }
        //speichern
        array = (int[,])coppy.Clone ();


        return array;
    }

    // Use this for initialization
    void Start () {
        int[,] a  = new int[,] {
                    {-1,-1,-1,-1,-1,-1,-1,-1},
                    {-1, 0, 0, 0, 0, 0, 0,-1},
                    {-1, 0, 0, -1, 0, 0, 0,-1},
                    {-1, 0, 0, -1, 0, 0, 0,-1},
                    {-1, 0, 0, -1, 0, 0, 0,-1},
                    {-1, 0, 0,-1,-1, 0, 0,-1},
                    {-1, 0, 0,-1,-1, 0, 0,-1},
                    {-1, 0, 0,-1,-1, 0, 0,-1},
                    {-1,-1,-1,-1,-1,-1,-1,-1}};

        displayArray (Merger(rowCheck (a)));
    }

    // Update is called once per frame
    void Update () {

    }
    public void displayArray(int[,]array)
    {
        int y = array.GetLength(0);
        int x = array.Length /y ;
        string row="";
        for (int i = 0; i< y; i++) 
        {

            for(int j = 0; j<x;j++)
            {
                row+= array[i,j]+" ";

            }
            row+= "\r\n";
        }
        Debug.Log(row);
        /*foreach( int a in array )
        {

            Debug.Log( array.GetLength(0) );
            Debug.Log( array.Length );

        }*/


    }


}