Data structures 平面分段圆轨迹的数据结构

Data structures 平面分段圆轨迹的数据结构,data-structures,geometry,Data Structures,Geometry,我试图设计一个数据结构来保存/表达欧几里得平面上的分段圆形轨迹。轨迹被约束为连续的,并且处处具有有限曲率,因此圆弧相切相交 存储所有圆心、半径和接触点将允许检查O(1)中任何位置的几何体,但由于数据冗余,需要明确执行连续性和曲率约束。在我看来,这会使代码变得混乱 原则上,仅将圆接触点(沿曲线的航路点)与曲线的初始方向一起存储就足够了,并避免了数据冗余,但随后有必要进行O(n)计算以检查圆弧n的几何结构,因为该圆弧取决于轨迹中其前面的所有圆弧 我希望避免数据冗余,但我也不希望几何检查的成本过高 有

我试图设计一个数据结构来保存/表达欧几里得平面上的分段圆形轨迹。轨迹被约束为连续的,并且处处具有有限曲率,因此圆弧相切相交

存储所有圆心、半径和接触点将允许检查O(1)中任何位置的几何体,但由于数据冗余,需要明确执行连续性和曲率约束。在我看来,这会使代码变得混乱

原则上,仅将圆接触点(沿曲线的航路点)与曲线的初始方向一起存储就足够了,并避免了数据冗余,但随后有必要进行O(n)计算以检查圆弧n的几何结构,因为该圆弧取决于轨迹中其前面的所有圆弧

我希望避免数据冗余,但我也不希望几何检查的成本过高


有人有什么高层次的想法/建议可以分享吗?

我会存储一些项目,其中包含获取该元素任何一点信息所需的数据。例如,圆弧需要x、y、初始方向、半径、长度(或端点、角度差或任何您认为最简单的)

由于两个端点之间需要连续性(相同的x、y、相同的方向角,也许相同的曲率),因此需要具有此属性的
节点。请注意,这些特性对于圆弧和直线(由半径=0标识的特殊圆弧)是通用的。因此,您可以将
节点
一样对待

应在任何请求之前计算轨迹。因此,您提前获得了所有项目数据

容器取决于您请求信息的方式。
如果轨迹可以用网格表示,那么最好使用四叉树。
我想您必须从
x,y
累计长度
输入中找到项目。您必须遍历容器以找到最接近输入数据的元素。排序数据可能会有所帮助

我选择的是一个包含连续元素的简单向量,它恰好是根据累积轨迹长度排序的


在x排序的容器(或树)上通过
x,y
查找不是那么简单,因为某些
x,y
可能与多个项目垂直,连续与否,靠近与否,您需要选择最近的一个。

为了最有效地遍历轨迹,如果我是对的,您需要

  • 每个弧的结束曲线横坐标(累积)

  • 半径

  • 起始角度

  • 中心的坐标

因此,对于给定的
s
你可以找到弧的指数,然后是方位角和点的坐标。(对于一系列点,可以是增量的,也可以是通过对单个点的二分法。)每个弧需要五个参数

只有累积横坐标是全局的,但对于单点访问,不能没有它们。您可以删除半径和起始角,并从曲线横坐标和极限角的差值中检索任意圆弧的半径和起始角(见下文)。这将减少到三个参数

另一方面,只知道中心坐标以及起点和终点坐标就足以恢复整个几何体,每个圆弧需要两个参数

两条圆弧的交点位于通过中心的直线上,如果您知道一个半径,则另一个半径将跟随。极限角由直线的方向给出。因此,对于增量遍历,这种非冗余描述就可以了


为便于计算,知道S和弧指数,考虑从中心到相邻圆弧中心的矢量。旋转它们,使第一个变为水平。另一个的分量将给出振幅角。振幅的分数

(s-Si-1)/(Si-Si-1)
给出了应用反向旋转的点的方位角


这看起来就像语言不可知论一样。我正在删除C++标签。@纳塔利奥维纳忍者NeilButterworth好的,谢谢,但是“设计”标签也不正确吗?
design
是一个非常无用的标签,因为它涵盖了几乎所有的问题,从GUI设计到算法设计,以及其他事情。这里的很多标签都是无用的-他们很容易被那些没有考虑过他们在做什么的人创建。也可能有一个
编程
标记。