C# 设计选择-二维房屋平面图
我正试图找出构建我的程序的最佳方式 我计划用墙、门、窗和柱来表示二维房屋平面。墙的大小是固定的,并逐个添加。柱只能放置在墙的侧面。门/窗与柱位于同一位置 此外,将来我计划将计划存储在数据库中。我不介意进行某种数据转换来保存/加载计划,只要它有助于在程序中操纵计划 例如: 我目前的想法:C# 设计选择-二维房屋平面图,c#,data-structures,2d,C#,Data Structures,2d,我正试图找出构建我的程序的最佳方式 我计划用墙、门、窗和柱来表示二维房屋平面。墙的大小是固定的,并逐个添加。柱只能放置在墙的侧面。门/窗与柱位于同一位置 此外,将来我计划将计划存储在数据库中。我不介意进行某种数据转换来保存/加载计划,只要它有助于在程序中操纵计划 例如: 我目前的想法: 使用两个矩阵,一个表示墙,另一个表示柱/窗/门缺点:墙矩阵将是奇数,您可以在平面的单个“行”中安装比水平墙更多的垂直墙 使用存储对其相邻对象的引用的对象缺点:非常违反直觉,可能会使在屏幕上打印计划变得困难
- 使用两个矩阵,一个表示墙,另一个表示柱/窗/门缺点:墙矩阵将是奇数,您可以在平面的单个“行”中安装比水平墙更多的垂直墙
- 使用存储对其相邻对象的引用的对象缺点:非常违反直觉,可能会使在屏幕上打印计划变得困难
我很确定这是一个非常常见的场景,希望我能找到正确的方向,知道我可以用什么样的数据结构在内部表示这一点。使用存储对相邻对象引用的对象可能是更好的选择。以下是一些好处:
- 要保存/加载的数据量较小;大多数矩阵都是空的,仅取出实际对象进行保存而不是保存整个矩阵会更小(理论上,如果保存的对象很大,则可能无法实现此好处)
- 它是灵活的;与刚性矩阵结构相比,添加新类型的对象或更改这些对象的装配方式更容易。这将使您的代码更易于维护和扩展,这是一个长期的好处。例如,如果要添加不同长度的墙,则在基于对象的系统中实现这一点要比完全更改矩阵设计容易得多
- 您可以避免画布大小问题;如果用户想要扩展他们的设计,在矩阵解决方案中,你必须增加矩阵的大小,这可能是昂贵的(特别是考虑到第1点)和烦人的。对于对象系统,您可以定义它们相对于某个原点的位置,并在以后确定画布大小(例如,如果我们迭代每个对象并在整个集合中找到最小/最大x和y,画布大小就是这些最小/最大值之间的差)
- 每个对象都有一个x,y位置
- 要绘制画布,首先在每个对象上循环,找到最小的x,y值和最大的x,y值
- e、 g.如果我们有3个具有以下坐标的对象,那么我们的最小x=-4,最小y=0,最大x=3,最大y=8,因此我们的画布是一个从到的矩形
- 将整个矩形移到正方向;例如,在上面的示例中,我们将添加到每个对象的位置
- 创建一个画布,其中包含您找到的长方体的x长和y高(在本例中,它将是7宽8高,乘以某些像素比例,例如10px/单位)
- 在每个对象上循环,并在其移动位置绘制(例如,我们将绘制位置为的对象)
- 你可以自由使用坐标,元素不必“锁定”到给定的网格上,你可以旋转对象(对角表、墙等)
- 检查碰撞相对比较容易,只需在对象(或其一个角)上执行范围查询(留有小的空白),它将返回所有邻居
- 我会使用多维索引,如四叉树或R*树。优点: