【问题标题】:How to represent a pattern within a Rectangle's area如何在矩形区域内表示图案
【发布时间】:2014-12-21 18:28:19
【问题描述】:

目标是拥有一个表示布尔值的二维集合的对象。

我有一个 Size(x, y) 的点网格

对象放置在网格上的 Point(x, y) 位置,边界为 Rectangle(new Size(w, h), new Point(x, y))

目标是将对象表示为 bool[,],其中数组位置的索引表示 Rectangles 边界中的偏移量。

我可能有点想多了,所以我会解释我使用 Rectangle 是因为 IntersectsWith 非常方便。

物体可以向任意方向移动一个单位,但不能移动到已经被另一个物体占据的位置。

我希望最终用法类似于:

Pattern p1 = new Pattern(Point location1, bool[,] pattern);
Pattern p2 = new Pattern(Point location2, bool[,] pattern);

if(p1.Intersects(p2))
  throw new ...

我只关心模式重叠。我希望图案的一般大小和形状是可变的。

我正在想办法用基于总面积的某些规则重新定义模式。

我正在寻找解决此问题的最佳方法的建议。

【问题讨论】:

  • 也许这个问题更适合programmers.stackexchange.com
  • 你的问题是有视觉表现还是只使用矩形的概念?
  • 所以如果矩形相交,那么形状可能相交。矩形方法是快速确定是否需要进一步检查的好方法。为了最终确定,您必须遍历数组并查看其中的任何相同位置是否都设置为 true。显然,如果两种模式具有不同大小的“边界矩形”,您需要明确检查以确保不超过其他形状的行/列。
  • 您可能对我不久前创建的Project 感兴趣(下面的 cmets 中的源代码链接)。我将这些片段表示为一个位置,其中包含图案每个部分的偏移列表。不知道这是否是最好的设计,但它非常适合我的需求。
  • Idle_Mind - 非常不错的应用程序,干得好!谢谢!

标签: c# arrays rectangles


【解决方案1】:

您可以尝试使用树状图。对矩形进行排序并将第一个矩形放入二维树中。 在两个轴上拆分树并将下一个矩形放在适合的位置。冲洗并重复。

【讨论】:

    【解决方案2】:

    我决定使用一个简单的积分列表。我觉得我可能是想太多了。每个对象都有一个点列表,一个确定新添加的点是否是现有点的邻居的方法,以及一个确定一个点是否属于该对象的方法。

    这是一个准中介模式,根对象包含许多子对象的列表,子对象查询根对象的点可用性,根对象查询所有子对象。

    这应该有助于维护 SOLID/SRP。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 2014-07-30
      • 2018-10-30
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多