Вывод линейных преобразований в python для вычисления точечного преобразования - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть набор точек и их преобразований (точек, которые они стали после того, как произошло неизвестное преобразование), вот они:

input_coordinates = {
    'A': (5, 2), 
    'B': (2, -3), 
    'C': (-3, 6)}
final_coordinates = {
    'A': (2, -3), 
    'B': (-3, 6), 
    'C': (6, 5)}

У меня также есть одна входная точка, которую я хотел бы вывести его местоположение в пространстве пост-преобразования:

x_coordinate = (5, -7) 

И здесь все они визуально прорисованы.

setup

Итак, учитывая только карту преобразований точка-точка и предполагая линейное преобразование, как я могу вывести точку после преобразования? Как мне узнать, где разместить X на правом графике?

Уже есть библиотеки, которые будут это делать?

С помощью Джона Хьюза я запустил функцию, которая должна возвращать правильный результат для линейных преобразований, но я не могу понять, как завершить sh функцию.

Вот стартовый код для решения линейного преобразования:


def extrapolate(domain_coordinates, result_coordinates, point):
    '''
    given a set of input coordinates and their resulting
    coordinates post-transformation, and given an additional 
    input coordinate return the location (coordinate) in the
    post-transformation space that corresponds to the most
    logical linear transformation of that space for that
    additional point. "extrapolate where this point ends up"
    '''
    import numpy as np

    # Add the number 1 to the coordinates for each point
    domain = [(x, y, 1) for x, y in domain_coordinates]

    # Do the same for the "target" coordinates too
    result = [(x, y, 1) for x, y in result_coordinates]

    # Put these coordinates, arranged vertically, into a 3×3 matrix
    domain = np.array(domain).T
    result = np.array(result).T

    # D^−1 is the "matrix inverse"
    inverse = np.linalg.inv(domain)

    # Let M=RD^−1
    matrix = result * inverse         # why do I need M?...

    # Do the same for the extrapolation point
    xpoint = [(x, y, 1) for x, y in [point]]
    xpoint = np.array(xpoint).T

    # extrapolate ???
    extrapolated_point = matrix * xpoint    # this isn't right...

    # testing
    print(domain * np.array([[1],[0],[0]]).T)
    print(domain * np.array([[1],[0],[0]]).T * matrix)

    return extrapolated_point


extrapolate(
    domain_coordinates=[(5, 2), (2, -3), (-3, 6)],
    result_coordinates=[(2, -3), (-3, 6), (6, 5)],
    point=(5, -7))

Этот код не работает да, он печатает ...

[[5 0 0]
 [2 0 0]
 [1 0 0]]
[[ 1.73076923  0. -0.]
 [-0.57692308 -0.  0.]
 [-0.34615385  0.  0.]]

тогда как я ожидал, что он напечатает ...

[[5 0 0]
 [2 0 0]
 [1 0 0]]
[[ 2  0.  0.]
 [-3  0.  0.]
 [-1  0.  0.]]

Можете ли вы показать мне, где я ошибся?

Большое спасибо за вашу помощь!

...