双圆弧插值算法(二)
雙圓弧插值算法(二)
找到中心
找到連接點(diǎn)后,就可以求解圓心。我們定義一個向量,n1,垂直于t1。這最終是一個與(c1?p1)平行的標(biāo)準(zhǔn)化向量。從p1到c1的方向。
綜合起來,我們得到了c1的解。
通過檢查上述方程中的分母,我們可以看出,如果p1到pm的向量與t1共線,它將為零。圓的中心基本上被推到無窮遠(yuǎn),這給我們留下了p1和pm之間的一條直線,而不是一條弧。
對c2使用相同的方法得出:
選擇方向
現(xiàn)在我們需要選擇圍繞中心點(diǎn)旋轉(zhuǎn)的方向。這取決于d1和d2的符號。對于正的情況,我們選擇繞圓較短的路徑。對于否定的情況,我們走更長的路。讓我們看一些例子。
這種情況類似于初始標(biāo)記圖中顯示的圖像。d1和d2均為陽性。第一個切線點(diǎn)朝向q1,第二個切線點(diǎn)遠(yuǎn)離q2。
這里我們有相同的端點(diǎn),但是d1和d2是負(fù)數(shù)。第一個切線點(diǎn)遠(yuǎn)離q1,第二個切線點(diǎn)朝向q2。如你所見,我們沿著兩個圓圈走較長的路。
這個案子有點(diǎn)復(fù)雜。d1為負(fù)數(shù),d2為正數(shù)。第一個切點(diǎn)遠(yuǎn)離q1,第二個切點(diǎn)遠(yuǎn)離q2。我們只走第一圈的長路。這導(dǎo)致灰線在下午折疊回自己。
最后一步是求解旋轉(zhuǎn)角。為了幫助解決這個問題,我們將定義×操作符,如下所示。
這就給了我們?nèi)S叉積的z分量。它相當(dāng)于∣a∣b∣sinα,其中α是向量a和向量b之間的角度。由于sin值,我們可以根據(jù)正或負(fù)結(jié)果來確定旋轉(zhuǎn)方向。
如果圓弧的半徑為零,則可以將角度設(shè)置為零。否則,計(jì)算如下:
選擇d1
選擇d1的值對biarc的形狀有很大的影響。負(fù)值將使其變長和彎曲。接近零的值將使第一個弧緊湊。有些值甚至可以創(chuàng)建沒有解決方案的案例。
例如,在右邊的圖像中,選擇了d1,使得q1位于通過第二個控制點(diǎn)的切線上。這導(dǎo)致連接點(diǎn)直接位于q2上,我們只能為第二個弧繪制一條直線。
通常,最好自動選擇d1值。最簡單可接受的方法是選擇一個使d1=d2的值。這將創(chuàng)建一條相當(dāng)平衡的曲線,并簡化了一些計(jì)算。把連接點(diǎn)方程中的d1換成d2,然后求解。
通常,最好自動選擇d1值。最簡單可接受的方法是選擇一個使d1=d2的值。這將創(chuàng)建一條相當(dāng)平衡的曲線,并簡化了一些計(jì)算。把連接點(diǎn)方程中的d1換成d2,然后求解。
案例1:
當(dāng)二次公式可計(jì)算時,一個解是正解,另一個解是負(fù)解。我們總是想要正解,因?yàn)樗砹溯^短的弧。分母總是正的,判別式將大于(v?t)2,所以選擇正數(shù)形式會得到一個正的結(jié)果。
案例2:
因?yàn)榍芯€是標(biāo)準(zhǔn)化的,所以所有輸入都創(chuàng)建一個大于或等于零的判別式。所以我們不需要擔(dān)心平方根。但是,當(dāng)切線相等時,分母可以計(jì)算為零。為了支持這種情況,我們可以再次求解d2。
案例3:
我們需要處理的最后一個邊情況發(fā)生在切線相等且v垂直于它們時。這將在情況2的解決方案中創(chuàng)建一個零分母,意味著d1和d2處于無限遠(yuǎn)的距離。這可以用兩個半圓來處理,如下所示:
總結(jié)
以上是生活随笔為你收集整理的双圆弧插值算法(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双圆弧插值算法(一)
- 下一篇: 双圆弧插值算法(三,代码实现)