我只能给你一个大概的示意。比如说画布被分割为m行列的网格,每一个(矩形)图片占有一个或者多个网格。假设我们用public class 网格 { public int 行; public int 列; public bool 是否被占; }来描述单个网格,而用List<网格> canvas;来描述画布。假设要从画布上找出一个可以容纳m行n列的空间,大致可以写:var 目标位置 = (from lt in canvas from i in Enumerable.Range(lt.行, m) from j in Enumerable.Range(lt.列, n) let cell = canvas.FirstOrDefault(c => c.行 == i && c.列 == j) where cell != null && cell.是否被占 == false select lt).First(); 实际上如果你需要排序,例如距离0行0列越近的空间优先级越高,那么还可以在select之前加上一个order by语句。学会linq吧。不然许多程序员会再将来被一些软件公司作为“算法傻瓜”而看待来的。
比如说画布被分割为m行列的网格 --> 比如说画布被分割为“行列”的网格
每当要向画布放入一个m行n列的图片(例如windows8的“磁贴”那种布局),使用上诉一行语句计算出“目标位置”,这就是要放置图片的左上角的网格坐标。然后把图片放到实际的画布的这个坐标位置,并且在canvas中将这个m行n列所遮盖的网格 foreach(var cell in from i in Enumerable.Range(lt.行, m) from j in Enumerable.Range(lt.列, n) select canvas.First(c=>c.行==i && c.列==j)) { ......... } 设置上“被占用”的标记防止以后被覆盖。
{
public int 行;
public int 列;
public bool 是否被占;
}来描述单个网格,而用List<网格> canvas;来描述画布。假设要从画布上找出一个可以容纳m行n列的空间,大致可以写:var 目标位置 = (from lt in canvas
from i in Enumerable.Range(lt.行, m)
from j in Enumerable.Range(lt.列, n)
let cell = canvas.FirstOrDefault(c => c.行 == i && c.列 == j)
where cell != null && cell.是否被占 == false
select lt).First();
实际上如果你需要排序,例如距离0行0列越近的空间优先级越高,那么还可以在select之前加上一个order by语句。学会linq吧。不然许多程序员会再将来被一些软件公司作为“算法傻瓜”而看待来的。
foreach(var cell in from i in Enumerable.Range(lt.行, m)
from j in Enumerable.Range(lt.列, n)
select canvas.First(c=>c.行==i && c.列==j))
{
.........
}
设置上“被占用”的标记防止以后被覆盖。