【问题标题】:How to know if a list of coordinates forms a rectangle?如何知道坐标列表是否形成矩形?
【发布时间】:2017-01-06 23:43:56
【问题描述】:

我目前正在尝试弄清楚如何检查我的列表,例如:

[[0, 0], [0, 1], [1, 0], [1, 1]]

形成一个这样的矩形:

A B
C D

与 A、B、C 和 D 分别为 [0, 0]、[0, 1]、[1, 0] 和 [1, 1] 的列表。 这个想法当然是做一些通用的事情,所以像:

[[0, 0], [0, 1], [0, 2], [0, 3], [1, 0]]

==> X X X X
    X

应该返回 false。

我可以使用任何数学概念吗?或者也许我以错误的方式问这个问题,并且有一个我看不到的明显方式!无论如何,非常感谢任何帮助!

【问题讨论】:

  • 也许这对数学 stackexchange 来说是一个更好的问题...?
  • 我想过。但正如我所说,也许有一个简单的解决方案,不需要任何“”“”高级“”“”数学概念。
  • 必须有一种解决方案,[a c] [a d] [b c] [b d] 成立。如果您在比较之前对它们进行排序,那么查看这些点是否符合该标准应该是微不足道的。
  • 从一些基本的想法开始。如果坐标的数量是奇数,那么它们将在某处落后,即它不会是矩形。然后检查成对,如果不是每个坐标都在成对中,那么会有一个散乱的,它不会是矩形的。类似的东西

标签: python list matrix coordinates


【解决方案1】:

是的,您可以利用几个属性来完成这项工作。

首先,当然是一个矩形正好有四个顶点;你的第二份名单应该仅以这些理由被拒绝。 :-)

否则,您可以检查侧面的坡度。平行四边形的对边平行。从 (x1, y1) 到 (x2, y2) 的线段的斜率是

m = (y2 - y1) / (x2 - x1)

确认您有一个平行四边形后,您需要检查相邻边是否垂直。此类线的斜率的乘积为 -1。因此,如果您计算了 m1 到 m4 的四个斜率,并验证了 m1=m3 和 m2=m4,那么剩下的就是检查任何一个角:

if m1*m2 = -1:
    ...

请注意,此处的相等性检查不需要精确匹配;浮点舍入可以给你微小的差异。相反,也许

if abs(m1*m2 + 1) < 0.000001:

另一个可能给您更直接结果的属性是,当且仅当对角线彼此平分时,图形才是矩形。取两条对角线并找到中点。

xmid = (x1 + x2)/2
ymid = (y1 + y2)/2

如果两个中点相同(或非常接近),则您有一个矩形。

【讨论】:

    【解决方案2】:

    如果它们必须与坐标平面内联:

    def isRect(coords):
        if len(coords) != 4:
            return False
        tA, tB, tC, tD = sorted(coords)
        return tA[0] == tB[0] and tC[0] == tD[0] and tA[1] == tC[1] and tB[1] == tD[1]
    

    这是强制执行[a c] [a d] [b c] [b d],按x排序,然后y,然后进行布尔比较。

    【讨论】:

    • 你能不能不要key=lambda x: (x[1],x[0])
    • @juanpa.arrivillaga 您的订单是反向的,但是是的,它也可以。我已经更新了我的答案。
    • 呃,在这种情况下,您甚至不需要按键功能,不是吗?
    • @juanpa.arrivillaga 也正确,因为默认排序就足够了。
    • 我相信有人会称之为“pythonic”
    【解决方案3】:

    您可以尝试的另一种解决方案是合并矩形线段的正交性。如果导入 math 模块或 numpy 模块,可以检查每对连续的线段是否形成直角。您可以将此想法扩展到对角线的属性中,或者可以使用对角线来确定角角是否为直角。您还可以修改代码并应用距离公式;如果矩形中每条线的长度(通过距离公式获得)都彼此相等,则矩形是正方形。

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多