У меня есть набор точек и их преобразований (точек, которые они стали после того, как произошло неизвестное преобразование), вот они:
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)
И здесь все они визуально прорисованы.
Итак, учитывая только карту преобразований точка-точка и предполагая линейное преобразование, как я могу вывести точку после преобразования? Как мне узнать, где разместить 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.]]
Можете ли вы показать мне, где я ошибся?
Большое спасибо за вашу помощь!