在Java中实现方形分区

时间:2015-11-10 11:27:47

标签: java android algorithm shape

我正面临一个概念问题。我想实现一个Android游戏,其中一个功能是:每当我触摸一个正方形时,它被划分为4个相同大小的小正方形。每个下一个方块都以相同的方式分区,最多可达原始大小的1/1024。这是一个小例子:

enter image description here

问题是,我不确定如何以最佳方式存储这些数据。我需要存储每件的尺寸,以便知道在分割后它应缩小到什么尺寸。例如,如果在第一次触摸和第一次分割之后,我的数组(对于16个元素限制)看起来像:

 $yourQuery = "select  h.Kelas_ID KelasAlias, h.Ruangan_ID RuanganAlias,      
     j.Jadwal_ID, j.Ruangan_ID, j.Kelas_ID, c.Kelas, r.Ruangan 
     From kehadiran h LEFT join jadwal j on h.Guru_ID = j.Guru_ID 
     and h.Kelas_ID = j.Kelas_ID and h.Ruangan_ID = j.Ruangan_ID
     left join kelas c on c.Kelas_ID=h.Kelas_ID 
     LEFT join ruangan r on r.Ruangan_ID=h.Ruangan_ID
     where h.Guru_ID = '1'
     group by c.Kelas_ID, r.Ruangan_ID 
     union all
    SELECT  j.Kelas_ID KelasAlias, j.Ruangan_ID RuanganAlias, j.Jadwal_ID,    
    j.Ruangan_ID, j.Kelas_ID, c.Kelas, r.Ruangan 
    FROM jadwal j LEFT JOIN kelas c ON c.Kelas_ID=j.Kelas_ID 
    LEFT JOIN ruangan r ON r.Ruangan_ID=j.Ruangan_ID  
    WHERE j.Guru_ID = '1'
    GROUP BY c.Kelas_ID, r.Ruangan_ID "


$results =YourModel::model()->findAllBySql( $yourQuery); 

然后,如果我触摸左上角的方块,下一个数组就像是:

0 0 1 1 
0 0 1 1
2 2 3 3 
2 2 3 3 

或者至少这是我能想到的。然而,这实现起来很复杂,在每次下一次迭代中引入了额外的维度,而我真的不确定如何正确执行。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用四叉树。伪代码如下:

public class QuadTree {
    private QuadTree[] children;
    private double x;
    private double y;
    private double size;

    public QuadTree(double x, double y, double size) {
        this.x = x;
        this.y = y;
        this.size = size;
    }

    public void divide() {
        if (children == null) {
            children = new QuadTree[4];
            double s = 0.5 * size;
            children[0] = new QuadTree(x, y, s);
            children[1] = new QuadTree(x + s, y, s);
            children[2] = new QuadTree(x, y + s, s);
            children[3] = new QuadTree(x + s, y + s, s);
        }
    }

    public QuadTree getChild(int index) {
        if (children == null)
            return null;
        else
            return children[index];
    }

答案 1 :(得分:0)

如果是关于保存正方形坐标的最佳方法,我更喜欢定义一个具有4个属性的自定义类,Xtopleft,Ytopleft,Xbottomright,Ybottomright(让我们称之为SquarePosition)并将所有正方形位置对象放入像SquarePosition一样的集合

当然,您需要覆盖自定义类

的equals方法 例如,你有这样的方板:

1 2 3 3

4 5 3 3

6 6 7 7

6 6 7 7

你可以像这样设置集合: {(1,1),(1,1)},{(2,1),(2,1)},{(3,1),(4,2)},{(1,2),( 1,2)},{(2,2),(2,2)},{(1,3),(2,4)},{(3,3),(4,4)}