我正面临一个概念问题。我想实现一个Android游戏,其中一个功能是:每当我触摸一个正方形时,它被划分为4个相同大小的小正方形。每个下一个方块都以相同的方式分区,最多可达原始大小的1/1024。这是一个小例子:
问题是,我不确定如何以最佳方式存储这些数据。我需要存储每件的尺寸,以便知道在分割后它应缩小到什么尺寸。例如,如果在第一次触摸和第一次分割之后,我的数组(对于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
或者至少这是我能想到的。然而,这实现起来很复杂,在每次下一次迭代中引入了额外的维度,而我真的不确定如何正确执行。有什么想法吗?
答案 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)}