Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计选择-二维房屋平面图_C#_Data Structures_2d - Fatal编程技术网

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*树。优点:

      • 你可以自由使用坐标,元素不必“锁定”到给定的网格上,你可以旋转对象(对角表、墙等)
      • 检查碰撞相对比较容易,只需在对象(或其一个角)上执行范围查询(留有小的空白),它将返回所有邻居

      你应该搜索类似的开源软件,并从中获得一些灵感。我认为这是离题的,但我还是会插嘴。。。您不应该考虑如何根据数据的显示方式来构造数据。想想它将如何被安排在内存中、磁盘上,并根据实际情况进行建模。展示部分将在后面。@RonBeyer嗯,我会从多个角度来考虑。。但最重要的是,它将如何以一种简单直观的方式安排在内存中manipulation@Aybe这是个好主意,但我怀疑是否有任何东西与我的场景的简单性有关。任何平面图绘制软件都很可能没有固定大小的墙,等等。这是一个不错的问题,我想说回答这个问题会很有趣,但不幸的是,它不适合stackoverflow。你可能应该在上发帖。我投票决定结束。你能提供一个有几面墙/柱的平面图和它们各自的坐标吗?我同意这种结构非常灵活,可以为更复杂的系统提供许多优势。但我的问题非常简单(没有旋转,锁定到网格,固定大小),我想利用它的简单性,使用类似于您所建议的方法是过度的