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

Python 如何知道坐标列表是否形成矩形?,python,list,matrix,coordinates,Python,List,Matrix,Coordinates,我目前正试图找出如何检查我的列表,例如: [[0, 0], [0, 1], [1, 0], [1, 1]] 形成如下所示的矩形: A B C D 分别使用列表的[0,0]、[0,1]、[1,0]和[1,1]中的A、B、C和D。 当然,我们的想法是做一些通用的事情,比如: [[0, 0], [0, 1], [0, 2], [0, 3], [1, 0]] ==> X X X X X 应该返回false 有什么数学概念我可以用吗?或者我问错了这个问题,有一个明显的方式我看不见!无

我目前正试图找出如何检查我的列表,例如:

[[0, 0], [0, 1], [1, 0], [1, 1]]
形成如下所示的矩形:

A B
C D
分别使用列表的[0,0]、[0,1]、[1,0]和[1,1]中的A、B、C和D。 当然,我们的想法是做一些通用的事情,比如:

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

==> X X X X
    X
应该返回false


有什么数学概念我可以用吗?或者我问错了这个问题,有一个明显的方式我看不见!无论如何,非常感谢您的帮助

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

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]

它通过按
x
排序,然后按
y
排序,然后进行布尔比较来强制执行
[a c][a d][b c][b d]

是的,可以利用几个属性来完成此操作

首先,一个矩形有四个顶点;您的第二份名单应仅基于这些理由予以拒绝。:-)

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

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

if m1*m2 = -1:
    ...
请注意,此处的相等性检查不需要精确匹配;浮动舍入可以给您带来微小的差异。相反,也许

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

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

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

也许这是一个更好的数学问题…?我想了想。但正如我所说的,也许有一个简单的解决方案不需要任何“高级”数学概念。必须有一个解决方案,
[a c][a d][b c][b d]
是正确的。如果您在比较之前对它们进行排序,那么查看这些点是否符合该标准应该很简单。如果坐标数是奇数,那么它们在某个地方是散乱的,也就是说,它不是矩形的。然后检查是否有对,如果不是每个坐标都在一对中,那么将有一个散乱者,它将不是矩形的。诸如此类的东西也看看这个问题的想法,你能不能做点什么。我已经更新了我的答案。嗯,在这种情况下,你甚至不需要一个键函数,不?@juanpa.arrivillaga也是正确的,因为默认排序已经足够了。我相信有人会称之为“pythonic”
if abs(m1*m2 + 1) < 0.000001:
xmid = (x1 + x2)/2
ymid = (y1 + y2)/2