2017-01-06 3 views
2

Я сейчас пытаюсь выяснить, как проверить, если мой список, например, это:Как узнать, образует ли прямоугольник прямоугольник?

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

образует прямоугольник как это:

A B 
C D 

с A, B, C и D respectivly [ 0, 0], [0, 1], [1, 0] и [1, 1] списка. Идея заключается в том, конечно, чтобы сделать что-то родовое, так что-то вроде:

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

==> X X X X 
    X 

должен возвращать ложь.

Есть ли математическая концепция, которую я могу использовать? Или, может быть, я задаю этот вопрос не так, и есть очевидный способ, который я не вижу! В любом случае, любая помощь очень ценится!

+2

Может быть, это лучший вопрос для математики stackexchange ...? –

+0

Я думал об этом. Но, как я уже сказал, может быть, есть простое решение, которое не требует каких-либо «продвинутых» «математических» концепций. – Zzul

+2

Должно быть одно решение, в котором выполняется '[a c] [a d] [b c] [b d]'. Если вы сортируете их до сравнения, должно быть тривиально видеть, соответствуют ли точки этим критериям. – TemporalWolf

ответ

2

Да, есть несколько свойств, которые вы можете использовать, чтобы это сделать.

Во-первых, конечно, что прямоугольник имеет ровно четыре вершины; ваш второй список должен быть отклонен только по тем основаниям. :-)

В противном случае вы можете проверить наклоны сторон. Параллелограмм имеет противоположные стороны. Наклон отрезка от (x1, y1) в (x2, y2) является

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

После того, как вы убедитесь, что у вас есть параллелограмм, вам нужно проверить, что смежные стороны перпендикулярны. Такие линии имеют наклоны, произведение которых равно -1. Так что, если вы рассчитали четыре откосов m1 через m4, и проверяется m1 = m3 и m2 = m4, все что осталось, чтобы проверить какой-либо один угол:

if m1*m2 = -1: 
    ... 

Обратите внимание, что ваши проверки равенства здесь не должны требовать a точное соответствие; всплывающее округление может дать вам небольшие различия. Вместо этого, возможно,

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, затем делает логическое сравнение.

+0

не могли бы вы сделать 'key = lambda x: (x [1], x [0])'? –

+0

@ juanpa.arrivillaga Ваш заказ обратный, но да, это работает. Я обновил свой ответ. – TemporalWolf

+1

er, да:/Конечно, это то, что я имел в виду;) –

0

Другое решение, которое вы можете попробовать, включает ортогональность сегментов линии прямоугольников. Если вы импортируете математический модуль или numpy-модуль, вы можете проверить, имеет ли каждая последующая пара сегментов линии прямой угол. Вы можете распространить эту идею на свойства диагоналей или использовать диагонали, чтобы выяснить, являются ли углы угла прямыми.Вы также можете изменить код и применить формулу расстояния; если длины каждой строки в прямоугольнике (полученные по формуле расстояния) равны друг другу, то прямоугольник является квадратом.

Смежные вопросы