如何知道坐标列表是否形成矩形?

时间:2017-01-06 23:43:56

标签: python list matrix coordinates

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

[[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。

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

3 个答案:

答案 0 :(得分: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强制执行| in mutation| in database| action on create | action on update | Notes |------------|------------|------------------|------------------|------- | False | False | create if rule | create if rule | a rule might be cardinality === 1. | False | True | None | None | no harm no foul | True | False | Create | Create? Err? | better ask for ID back or will have to query edges later | True | True | Update? Err? | Update | what if the mutation doesn't contain the ID? ,然后进行布尔比较。

答案 1 :(得分:2)

是的,您可以利用多种属性来完成此任务。

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

否则,您可以检查两侧的斜坡。平行四边形的相对边平行。从(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 :(得分:0)

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