python вычисляет недостающие координаты прямоугольника - PullRequest
0 голосов
/ 31 декабря 2018

У меня проблема с вычислением отсутствующих координат прямоугольника.Учитывая две точки прямоугольника, например, P1 и P2 (синий круг на изображении), мне нужно вычислить недостающие координаты P0 и P3.Размер прямоугольника задан заранее, и я знаю расстояние между P0 и P1, а также между P1 и P2.

Например, ниже приведены координаты, определяющие прямоугольник, но допустим, что первая и последняя точки (p0 и p3) неизвестны, и я пытаюсь их найти.

Len1 = 503 Len2 =752

[ (61, 61) , (564, 55), (573, 807), (70, 817) ]

enter image description here

Я написал код, который вычисляет 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()

Есть идеи, как этого добиться?

...