Types 多边形链的最佳表示方法

Types 多边形链的最佳表示方法,types,geometry,julia,Types,Geometry,Julia,我想要一个结构来表示一个3D。我有一个structPoint,它表示3D中的一个点,因此我的struct基本上必须是一个点元组,因为链的段数不会增加。我需要有struct,因为我将定义和使用多边形链专用的方法 我用以下方式将其定义为参数化类型: struct PolygonalChain{N} endpoints::NTuple{N,Point} end 其中N应为整数。我不确定这是不是最好的办法。我知道参数化类型中的参数应该是数据类型,而不是类型的具体实例。我不确定是否可以更智能地使

我想要一个结构来表示一个3D。我有一个struct
Point
,它表示3D中的一个点,因此我的struct基本上必须是一个点元组,因为链的段数不会增加。我需要有struct,因为我将定义和使用多边形链专用的方法

我用以下方式将其定义为参数化类型:

struct PolygonalChain{N}
    endpoints::NTuple{N,Point}
end

其中
N
应为整数。我不确定这是不是最好的办法。我知道参数化类型中的参数应该是数据类型,而不是类型的具体实例。我不确定是否可以更智能地使用元组,而不定义任何结构。在这种情况下,最重要的两件事是API的性能和舒适性

首先,我将给出点的类型作为参数类型,因为点的类型永远不限于三维。由于它是参数化类型,因此不会影响性能

其次,您需要一个舒适的构造函数,这样在创建对象时就不需要显式地创建元组

最后,由于您将经常访问
多边形链的元素,因此它的行为应类似于
向量
,因此您不必每次都键入字段名

下面是如何在Julia中实现如此出色的API:

abstract type AbstractPoint end
struct Point1d <: AbstractPoint 
   x::Float64
end

struct PolygonalChain{N,P <: AbstractPoint} <: AbstractVector{P}
    endpoints::NTuple{N,P}
end
PolygonalChain(x...) =  PolygonalChain((x...,))

Base.size(p::PolygonalChain{N, P}) where {N,P} = (N, )
Base.getindex(p::PolygonalChain, idx::Int) = p.endpoints[idx]

可能来自--
LineString
from,也许?这看起来是个不错的选择,但不仅仅是使用现有的软件包,我还想知道如何自己完成这项工作。这就是我一直在寻找的答案。你能解释一下或让我参考一下
中{N,P}
的使用文档吗?这里解释了这一点:如果你觉得不清楚,可以问一个新问题。
julia> p=PolygonalChain(Point1d(1.0),Point1d(3.0))
2-element PolygonalChain{2, Point1d}:
 Point1d(1.0)
 Point1d(3.0)

julia> p[1]
Point1d(1.0)