【问题标题】:Best way of representing polygonal chain表示多边形链的最佳方式
【发布时间】:2021-03-16 04:05:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 可能来自JuliaGeometry -- LineString 来自GeometryBasics.jl,也许?
  • 这看起来是个不错的选择,但不仅仅是使用现有的包,我想知道如何自己做

标签: types geometry julia


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2010-11-22
  • 2014-11-02
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2010-10-03
相关资源
最近更新 更多