У меня проблема с вычислением отсутствующих координат прямоугольника.Учитывая две точки прямоугольника, например, P1 и P2 (синий круг на изображении), мне нужно вычислить недостающие координаты P0 и P3.Размер прямоугольника задан заранее, и я знаю расстояние между P0 и P1, а также между P1 и P2.
Например, ниже приведены координаты, определяющие прямоугольник, но допустим, что первая и последняя точки (p0 и p3) неизвестны, и я пытаюсь их найти.
Len1 = 503 Len2 =752
[ (61, 61) , (564, 55), (573, 807), (70, 817) ]
Я написал код, который вычисляет P0 на основе P1 и P2, но выглядит уродливо, и я считаю, что должен быть лучший подход.Я далек от своей цели - отработать любые две недостающие точки на основе двух других доступных точек (они будут различаться).Помимо этого существует проблема, что ориентация объекта может быть различной.Функция должна распознавать, что точка P0 всегда находится в верхнем левом углу, даже если изображение расположено вверх ногами, P1 - в верхнем правом углу и т. Д.
Вот что я сделал до сих пор
import math
def calcAngle2Vectors(p0,p1,p2):
#calculates angle between two vectors
#p1 is a centre point
a = (p1[0]-p0[0])**2 + (p1[1]-p0[1])**2
b = (p1[0]-p2[0])**2 + (p1[1]-p2[1])**2
c = (p2[0]-p0[0])**2 + (p2[1]-p0[1])**2
ang = math.acos( (a+b-c) / math.sqrt(4*a*b) ) * 180/math.pi
return ang
def interpolateMissingPoints():
# in real case one or two coords will be NaN e.g.
# coords = [Nan, (564.0, 55.0), (573.0, 807.0), Nan]
coords = [(61.0, 61.0), (564.0, 55.0), (573.0, 807.0), (70.0, 817.0)]
#Other coords of the same object under different angles:
#coords = [(809.0, 61.0), (815.0, 564.0), (63.0, 573.0), (53.0, 70.0)]
#coords = [(558.0, 809.0), (55.0, 815.0), (46.0, 63.0), (549.0, 53.0)]
#coords = [(61.0, 558.0), (55.0, 55.0), (807.0, 46.0), (817.0, 549.0)]
#calculate the angle of the
point_A = coords[1]
point_B = coords[2]
point_C = (0,coords[2][1])
angle = (calcAngle2Vectors(point_A,point_B,point_C))-90
Len1 = 503
if point_A[1] > point_B[1]:
#orientation - normal
x2 = int(coords[1][0] + math.cos(math.radians(angle)) * Len1)
y2 = int(coords[1][1] - math.sin(math.radians(angle)) * Len1)
else:
#orientation - upside down
x2 = int(coords[1][0] - math.cos(math.radians(angle)) * Len1)
y2 = int(coords[1][1] - math.sin(math.radians(angle)) * Len1)
print ("x2 "+ str(x2))
print ("y2 "+ str(y2))
interpolateMissingPoints()
Есть идеи, как этого добиться?