我正在尝试设计一种数据结构,以在Euclidian平面中保持/表达分段的圆形轨迹。轨迹被约束为连续的并且在任何地方都具有有限的曲率,因此圆弧是切线相交的。
存储所有圆心,半径和接触点将允许检查O(1)中任何位置的几何形状,但由于数据冗余而需要显式实施连续性和曲率约束。我认为,这会使代码混乱。
原则上仅存储圆接触点(即沿曲线的航点)以及曲线的初始方向就足够了,并且可以避免数据冗余,但是有必要进行O(n)计算以检查圆弧n的几何形状,因为该圆弧取决于轨迹中在它之前的所有圆弧。
我想避免数据冗余,但是我也不想使几何检查的成本过高。
有人有什么高层次的想法/建议可以分享吗?
答案 0 :(得分:1)
为了最有效地遍历轨迹,如果我对,则需要
每个圆弧的结束曲线横坐标(累积),
半径,
起始角度
中心的坐标
,以便对于给定的s
,您可以找到弧的索引,然后是该点的方位角和坐标。 (对于一个点序列,以增量方式进行,或者对于单个点,采用二分法。)每个弧需要五个参数。
只有累积的横坐标是全局的,但是单点访问不能没有它们。您可以放下半径和起始角度,并从曲线横坐标和极限角度之差中检索它们的任何弧度(请参见下文)。这减少到三个参数。
另一方面,仅知道中心的坐标以及起点和终点的坐标就足以恢复整个几何,并且每个弧需要两个参数。
在通过中心的直线上找到两个圆弧的交点,如果知道一个半径,则跟随另一个半径。极限角由直线的方向给出。因此,对于增量遍历,此非冗余描述即可。
为了方便计算,在知道s和圆弧索引的情况下,请考虑从中心到相邻圆弧中心的向量。旋转它们,使第一个变为水平。另一个的分量将给您振幅角。幅度的(s - Si-1) / (Si - Si-1)
分数为您提供了点的方位角,您可以在该方位角上应用反向旋转。
答案 1 :(得分:0)
我将存储具有获取该元素任何点信息所需的数据的项目。例如,圆弧需要x,y,初始方向,半径,长度(或终点,角度差或您最容易找到的值)。
由于两个端点之间需要连续性(相同的x,y,相同的方位,也许相同的曲率),因此需要具有此属性的node
。请注意,这些属性是圆弧和直线所共有的(特殊半径为radius = 0的圆弧)。因此,您可以将node
与item
相同。
应该在任何请求之前计算轨迹。这样您就可以拥有所有项目数据。
容器取决于您如何请求信息。
如果轨迹可以用网格表示,那么最好使用四叉树。
我想您必须从x,y
或accumulated length
输入中找到项目。您将不得不遍历容器以找到最接近输入数据的元素。排序的数据可能会有帮助。
我的选择是一个具有连续元素的简单向量,该向量恰好按照累积的轨迹长度排序。
通过x,y
在经过x排序的容器(或树)上查找并不是那么简单,因为某些x,y
可能垂直于多个项目,无论是否连续,接近或不连续,并且您需要选择最接近的一个。