表示多边形链的最佳方式



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

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

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

其中N应该是一个整数。我不确定这是否是最好的方式。我知道参数类型中的参数应该是DataTypes,而不是类型的具体实例。我不确定我是否可以以更智能的方式使用元组,而不定义任何结构

在这种情况下,最重要的两件事是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)

最新更新