首页 > 解决方案 > 可以使用 Julia 类型和多重调度来对用户透明地处理多个坐标系吗?

问题描述

[我正在尝试做的有点类似于 unitful.jl 对单位所做的事情,但我还没有想出一个干净的 Julian 方法来做到这一点。]

我的程序正在处理很多 3D 坐标,但在多个不同的参考框架中。一些计算最好在某些参考系中完成。我希望用户不需要处理转换,但同时不必编写多个版本的函数来处理参考帧的每个组合。一些函数有多个输入,它们可以在不同的参考系中,所以这可能会组合爆炸。

这是我所拥有的简化视图,它有效,但需要每个功能的多个版本。

struct ECEF
    v::StaticArrays.SVector{3, Float64}
end

struct GEODETIC
    v::StaticArrays.SVector{3, Float64}
end

function mymag(pt::ECEF)
    return √sum(pt.v .^2)
end

function mymag(pt::GEODETIC)
    return mymag(convert(ECEF,pt))
end

function convert(::Type{ECEF}, pt::GEODETIC)
    return ECEF(geodetic_to_ecef(pt.v...))
end

理想情况下,我希望能够像 Unitful.js 一样自动转换内容。谢谢!

标签: julia

解决方案


您可以做的最简单的事情是使用abstract类型。在您的情况下,代码可能如下所示:

abstract type AbstractPoint3D end

struct ECEF <: AbstractPoint3D 
    v::StaticArrays.SVector{3, Float64}
end

struct GEODETIC <: AbstractPoint3D 
    v::StaticArrays.SVector{3, Float64}
end

function convert(::Type{ECEF}, pt::GEODETIC)
    return ECEF(geodetic_to_ecef(pt.v...))
end
convert(::Type{ECEF}, pt::ECEF) = pt

function mymag(pt::AbstractPoint3D)
    return √sum(convert(ECEF,pt).v .^2)
end


推荐阅读