双圆弧插值算法(二)
找到中心
找到连接点后,就可以求解圆心。我们定义一个向量,n1,垂直于t1。这最终是一个与(c1−p1)平行的标准化向量。从p1到c1的方向。
综合起来,我们得到了c1的解。
通过检查上述方程中的分母,我们可以看出,如果p1到pm的向量与t1共线,它将为零。圆的中心基本上被推到无穷远,这给我们留下了p1和pm之间的一条直线,而不是一条弧。
对c2使用相同的方法得出:
选择方向
现在我们需要选择围绕中心点旋转的方向。这取决于d1和d2的符号。对于正的情况,我们选择绕圆较短的路径。对于否定的情况,我们走更长的路。让我们看一些例子。
这种情况类似于初始标记图中显示的图像。d1和d2均为阳性。第一个切线点朝向q1,第二个切线点远离q2。
这里我们有相同的端点,但是d1和d2是负数。第一个切线点远离q1,第二个切线点朝向q2。如你所见,我们沿着两个圆圈走较长的路。
这个案子有点复杂。d1为负数,d2为正数。第一个切点远离q1,第二个切点远离q2。我们只走第一圈的长路。这导致灰线在下午折叠回自己。
最后一步是求解旋转角。为了帮助解决这个问题,我们将定义×操作符,如下所示。
这就给了我们三维叉积的z分量。它相当于∣a∣b∣sinα,其中α是向量a和向量b之间的角度。由于sin值,我们可以根据正或负结果来确定旋转方向。
如果圆弧的半径为零,则可以将角度设置为零。否则,计算如下:
选择d1
选择d1的值对biarc的形状有很大的影响。负值将使其变长和弯曲。接近零的值将使第一个弧紧凑。有些值甚至可以创建没有解决方案的案例。
例如,在右边的图像中,选择了d1,使得q1位于通过第二个控制点的切线上。这导致连接点直接位于q2上,我们只能为第二个弧绘制一条直线。
通常,最好自动选择d1值。最简单可接受的方法是选择一个使d1=d2的值。这将创建一条相当平衡的曲线,并简化了一些计算。把连接点方程中的d1换成d2,然后求解。
通常,最好自动选择d1值。最简单可接受的方法是选择一个使d1=d2的值。这将创建一条相当平衡的曲线,并简化了一些计算。把连接点方程中的d1换成d2,然后求解。
案例1:
当二次公式可计算时,一个解是正解,另一个解是负解。我们总是想要正解,因为它代表了较短的弧。分母总是正的,判别式将大于(v⋅t)2,所以选择正数形式会得到一个正的结果。
案例2:
因为切线是标准化的,所以所有输入都创建一个大于或等于零的判别式。所以我们不需要担心平方根。但是,当切线相等时,分母可以计算为零。为了支持这种情况,我们可以再次求解d2。
案例3:
我们需要处理的最后一个边情况发生在切线相等且v垂直于它们时。这将在情况2的解决方案中创建一个零分母,意味着d1和d2处于无限远的距离。这可以用两个半圆来处理,如下所示: