Документация Engee

Справка по API

Преобразования

Супертип Transformation определяет простой интерфейс для выполнения преобразований. Подтипы должны иметь возможность применять преобразование системы координат к правильным типам данных путем перегрузки метода вызова, и для них обычно определено соответствующее обратное преобразование посредством Base.inv(). Дополнительно могут быть определены эффективные композиции посредством compose() (эквивалентно ).

ComposedTransformation просто выполняет два преобразования по очереди и является резервным типом выходных данных для compose().

IdentityTransformation — это одинарный объект Transformation, который возвращает входные данные без изменений, так же как identity.

PerspectiveMap()
julia

Создает преобразование проецирования. Преобразование проецирования «проецирует», например, точку в трехмерном пространстве на двухмерный виртуальный экран идеальной камеры-обскуры (на расстоянии 1 от камеры). Камера ориентирована по положительной оси Z (или в общем случае вдоль конечного измерения), и для объектов перед камерой сохраняется знак компонентов x и y (объекты позади камеры также проецируются и, следовательно, переворачиваются — пользователь может при необходимости отбросить их).

Это преобразование предназначено для использования в сочетании с другими преобразованиями координат для определения, например, положения и ориентации камеры. Пример:

cam_transform = PerspectiveMap() ∘ inv(AffineMap(cam_rotation, cam_position))
screen_points = map(cam_transform, points)

(См. также описание cameramap.)

inv(trans::Transformation)
julia

Возвращает обратное преобразование trans.

cameramap()
cameramap(scale)
cameramap(scale, offset)
julia

Создает преобразование, которое проецирует точки в реальном пространстве (например, трехмерном) посредством преобразования проецирования на фокальную плоскость идеальной камеры (камеры-обскуры) с заданными свойствами.

scale задает масштаб экрана. Для стандартной цифровой камеры масштаб будет равен scale = focal_length / pixel_size. Неквадратные пиксели поддерживаются путем предоставления пары масштабов в кортеже, scale = (scale_x, scale_y). Положительные масштабы соответствуют камере, обращенной в сторону оси +z, с виртуальным экраном перед камерой (координаты x, y не инвертируются относительно трехмерного пространства). Обратите внимание, что точки за камерой (с отрицательной компонентой z) будут проецироваться (и инвертироваться) на координаты изображения, и пользователь может при необходимости самостоятельно отбросить такие точки.

offset = (offset_x, offset_y) служит для определения начала координат на плоскости изображения. Например, точка (0,0) может представлять левый верхний угол датчика изображения. Это измерение выполняется в единицах после применения scale (например, в пикселях).

(См. также описание PerspectiveMap.)

compose(trans1, trans2)
trans1 ∘ trans2
julia

Создает новое преобразование, которое эквивалентно последовательному применению к координате сначала преобразования trans2, а затем trans1. По умолчанию создается ComposedTransformation, однако этот метод можно перегрузить для повышения эффективности (например, два аффинных преобразования естественным образом составляют одно аффинное преобразование).

recenter(trans::Union{AbstractMatrix,Transformation}, origin::Union{AbstractVector, Tuple}) -> ctrans
julia

Возвращает новое преобразование ctrans такое, что точка origin служит началом координат для trans. Преобразование на ±origin происходит как до, так и после применения trans, так что при линейном trans верно следующее.

ctrans(origin) == origin

Как следствие, recenter имеет смысл только в том случае, если выходное пространство trans изоморфно входному.

Например, если trans — это матрица поворота, ctrans поворачивает пространство вокруг origin.

transform_deriv(trans::Transformation, x)
julia

Матрица, описывающая то, как дифференциалы параметров x передаются на выход преобразования trans.

transform_deriv_params(trans::Transformation, x)
julia

Матрица, описывающая то, как дифференциалы параметров trans передаются на выход преобразования trans при входных данных x.

Аффинные отображения

abstract type AbstractAffineMap <: Transformation
julia

AbstractAffineMap является супертипом для всех аффинных преобразований, включая линейные преобразования.

AffineMap <: AbstractAffineMap
julia

Конкретное аффинное преобразование. Для построения отображения x -> M*x + v используйте

AffineMap(M, v)

где M — матрица, а v — вектор. Произвольный объект Transformation можно преобразовать в аффинную аппроксимацию путем линеаризации относительно точки x следующим образом:

AffineMap(trans, [x])

Если преобразование уже является аффинным, x можно опустить.

AffineMap(trans::Transformation, x0)
julia

Создает аффинное преобразование, соответствующее дифференциальному преобразованию x0 + dx согласно trans, то есть аффинное преобразование, которое является локально наиболее точным в окрестности x0.

AffineMap(from_points => to_points) → trans
julia

Создает аффинное преобразование, которое приблизительно отображает точки from на точки to. Для отображения n-мерного пространства требуется не менее n+1 невырожденных точек. Если точек больше, преобразование является избыточно определенным и решение вычисляется методом наименьших квадратов.

LinearMap <: AbstractAffineMap
LinearMap(M)
julia

Общее линейное преобразование, созданное с использованием LinearMap(M) для любого матричного объекта M.

Translation(v) <: AbstractAffineMap
Translation(dx, dy)       (2D)
Translation(dx, dy, dz)   (3D)
julia

Создает преобразование Translation для смещения декартовых точек на v = (dx, dy, ...).

Двухмерные координаты

Polar{T,A}(r::T, θ::A) — двухмерные полярные координаты

PolarFromCartesian() — преобразование вектора AbstractVector длиной 2 в тип Polar

CartesianFromPolar() — преобразование типа Polar в тип SVector{2}

Трехмерные координаты

Cylindrical(r, θ, z) — трехмерные цилиндрические координаты

Spherical(r, θ, ϕ) — трехмерные сферические координаты

Существует множество соглашений о сферических координатах, и в этой библиотеке используется довольно экзотичное. Для заданного вектора v с декартовыми координатами xyz пусть v_xy = [x,y,0] будет ортогональной проекцией v на плоскость xy.

  • r — это радиус. Он задается посредством norm(v, 2).

  • θ — это азимут. Это угол между осью x и v_xy.

  • ϕ — это широта. Это угол между v_xy и v.

julia> using CoordinateTransformations

julia> v = randn(3);

julia> sph = SphericalFromCartesian()(v);

julia> r = sph.r; θ=sph.θ; ϕ=sph.ϕ;

julia> v ≈ [r * cos(θ) * cos(ϕ), r * sin(θ) * cos(ϕ), r*sin(ϕ)]
true
julia-repl

CartesianFromCylindrical() — преобразование типа Cylindrical в тип SVector{3}

CartesianFromSpherical() — преобразование типа Spherical в тип SVector{3}

CylindricalFromCartesian() — преобразование трехмерной точки в тип Cylindrical

CylindricalFromSpherical() — преобразование типа Spherical в тип Cylindrical

SphericalFromCartesian() — преобразование трехмерной точки в тип Spherical

SphericalFromCylindrical() — преобразование типа Cylindrical в тип Spherical