设计选择 - 2D住宅计划

时间:2018-05-11 18:19:06

标签: c# data-structures 2d

我试图找出构建程序的最佳方法。

我计划用墙,门,窗和柱来代表2D房屋计划。墙壁大小固定,并逐一添加。柱子只能放在墙的两侧。门/窗与列相同。

此外,我将来计划将计划存储在数据库中。我不介意进行某种数据转换来保存/加载计划,只要它有助于在程序中操纵计划。

实施例: Example plan

到目前为止我的想法:

  • 使用两个矩阵,一个代表墙壁,另一个代表柱子/窗户/门。 缺点:墙面矩阵是奇数,你可以在一个"行中安装比水平墙更多的垂直墙壁。计划
  • 使用存储对其相邻对象的引用的对象。 缺点:非常直观,可能会使计划难以在屏幕上打印

我非常确定这是一个非常常见的情况,希望我能指出正确的方向,我可以用什么样的数据结构在内部表示。

2 个答案:

答案 0 :(得分:0)

使用存储对其相邻对象的引用的对象可能是更好的选择。以下是一些好处:

  • 要保存/加载的数据量较小;你的大多数矩阵都是空的空间,而只是将实际的物体保存起来而不是保存整个矩阵会更小(理论上;如果你保存的物体笨重,这种好处可能无法实现)。
  • 灵活;与刚性矩阵结构相比,更容易添加新类型的对象或更改这些对象如何组合在一起。这将使您的代码更易于维护和扩展,这是一个长期的好处。例如,如果您想添加不同长度的墙,在基于对象的系统中实现这一点比完全更改矩阵设计要容易得多。
  • 您可以避免画布尺寸问题;如果用户想要扩展他们的设计,在矩阵解决方案中,你必须增加矩阵的大小,这可能是昂贵的(特别是关于第1点)和恼人的。使用对象系统,您可以定义它们相对于某个原点的位置并稍后决定画布大小(例如,如果我们遍历每个对象并在整个集合上找到最小/最大x和y,则画布大小是它们之间的差异最小/最大值)。

实现此目的的一种简单方法如下:

  • 每个对象都有x,y位置
  • 要绘制画布,首先遍历每个对象并找到最小的x,y值和最大的x,y值
  • e.g。如果我们有3个具有以下坐标的对象< 3,4> < 0,8> < -4,0>那么我们的min x = -4,min y = 0,max x = 3,max y = 8,所以我们的画布是一个来自< -4,0>的矩形。至< 3,8>
  • 将整个矩形移动到正面;例如,在上面的示例中,我们添加< 4,0>到每个对象的位置。
  • 创建一个画布,其中包含您找到的框的x长度和y高度(在示例中,它是7宽和8高,是一些像素比例,例如10px /单位)< / LI>
  • 遍历每个对象并在其移位位置绘制它(例如,我们在&lt; 7,4&gt;处绘制位置&lt; 3,4&gt;的对象)

答案 1 :(得分:0)

我会使用多维索引,例如quadtree或R * Tree。优点:

  • 您的坐标非常自由,元素不必“锁定”到给定的网格上,您可以转动对象(对角线表,墙,......)
  • 检查碰撞相对容易,只需对对象(或其中一个角落)执行范围查询(边​​距较小),它将返回所有邻居