zoukankan      html  css  js  c++  java
  • 双圆弧插值算法(二)

    双圆弧插值算法(二)

    找到中心             

    找到连接点后,就可以求解圆心。我们定义一个向量,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:             

    当二次公式可计算时,一个解是正解,另一个解是负解。我们总是想要正解,因为它代表了较短的弧。分母总是正的,判别式将大于(vt)2,所以选择正数形式会得到一个正的结果。

    案例2:             

    因为切线是标准化的,所以所有输入都创建一个大于或等于零的判别式。所以我们不需要担心平方根。但是,当切线相等时,分母可以计算为零。为了支持这种情况,我们可以再次求解d2。

    案例3:             

    我们需要处理的最后一个边情况发生在切线相等且v垂直于它们时。这将在情况2的解决方案中创建一个零分母,意味着d1和d2处于无限远的距离。这可以用两个半圆来处理,如下所示:

  • 相关阅读:
    第四代Express框架koa简介
    用Python实现定时自动化收取蚂蚁森林能量,再也不用担心忘记收取了
    TMS320C6678开发环境搭建:系统调试工具SecureCRT安装
    ESP8266 WiFi模块如何联网?
    C 语言简单编程速成
    【算法】二分搜索方法
    零拷贝
    paxos raft zab
    NIO Java API
    Linux安装redis和部署
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/13297092.html
Copyright © 2011-2022 走看看