我想要一个结构来表示 3D polygonal chain .我有一个结构 Point
表示 3D 中的一个点,因此我的结构基本上必须是一个点元组,因为链的段数不会增加。我需要该结构,因为我将定义和使用专用于多边形链的方法。
我通过以下方式将其定义为参数类型:
struct PolygonalChain{N}
endpoints::NTuple{N,Point}
end
N
应该是一个整数。我不确定这是否是最好的方法。我知道参数类型中的参数应该是数据类型而不是类型的具体实例。我不确定我是否可以以更智能的方式使用元组而不定义任何结构
最佳答案
在这种情况下,最重要的两件事是 API 的性能和舒适度。
首先,我会将点的类型指定为参数类型,因为点的类型绝不仅限于三维。由于它是参数类型,因此不会影响性能。
其次,您需要一个舒适的构造函数,这样您就不需要在创建对象时显式创建元组。
最后,由于您将频繁访问 PolygonalChain
的元素,因此它的行为应该类似于 Vector
,因此您无需每次都键入字段名称。
以下是如何在 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]
现在让我们测试一下。请注意我们如何使用构造函数(没有元组!),它如何显示以及如何访问点:
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)
关于types - 表示多边形链的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66641189/