[matlab]DDA畫圓弧測試
????打算用stm32做主控DIY臺xy雕刻機,所以看了一點DDA直線插補和圓弧插補的東西,一些細節(jié)不是很懂,所以用matlab畫了圓弧的幾種情況。代碼在最后,這里的代碼和數(shù)控技術(shù)的算法不一樣。?
X,Y軸運動獨立:
?逆時針圓方程:

對時間t求導(dǎo):

推導(dǎo)2:
首先速度向量與半徑垂直,那么只要將位置坐標的XY互換一下再添個符號就行,也就是向量(X,Y)的垂直向量是(-Y,X)或(Y,-X)。

做了這個操作后再除以模R乘以速度V。

有了初始坐標就能用上面的方程進行迭代(歐拉法):

?△t*V/R是常數(shù),所以也可以寫成:

X,Y累加器每個周期累加△x=-ky,△y=kx,當累加器溢出時,向相應(yīng)電機發(fā)出脈沖。
?根據(jù)這個寫了一個畫圓的函數(shù):

?(起始于[50,0],速度=0.5,迭代次數(shù)=400)
????一次性最好只畫一個象限的圓弧,再根據(jù)圓的對稱性畫其他象限的圓弧,這樣比較容易編程,效率也高。如果一次性畫整圓,那必須得處理符號問題,這使得編程更復(fù)雜,同時也拖了效率。但為了方便觀察,這里的函數(shù)能一次性畫出整個圓,改變迭代次數(shù)可以改變圓弧的長度。
? ? ? ?這里,累加器不做半加載處理,因為累加值有符號,而正浮點四舍五入與負浮點四舍五入是不同的,int(5.5+0.5)、int(-5.5-0.5),半加載改成對累加器四舍五入后再判斷溢出。
二階近似:
????迭代方程是一階近似,這相當于沿著切線走,路肯定越走越寬,可以用二階近似來提高精度。
推導(dǎo)1:

推導(dǎo)2:

將cos與sin用泰勒一階多項式替換得到之前方程:

將cos與sin用泰勒二階多項式替換:

Y軸也一樣,所以有:

一階、二階對比:

隱方法:


只需要改變一階代碼中累加那一行代碼的位置就可以實現(xiàn)。

隱方法突出的就是一個穩(wěn)定性

X,Y軸運動關(guān)聯(lián):
圓的標準方程:

對其求關(guān)于x的一、二階導(dǎo)數(shù)得:

x與y對稱的,所以:

????從方程上來看,x=0或y=0時會出現(xiàn)斜率無窮大的情況,如果在畫圓弧時始終選擇一個軸作為主要方向,那就會出現(xiàn)斜率無窮大的情況。有一個解決方法:當X坐標絕對值與Y坐標絕對值相同時交換方向,既保證了從動方向的累加量小于等1又能保證不出現(xiàn)斜率無窮大的情況。

????根據(jù)初始坐標選擇方向,X,Y軸速度的絕對值中,數(shù)值大的那個的對應(yīng)軸作為主要方向,如果兩絕對值相等,那就根據(jù)關(guān)于t的二階導(dǎo)來判斷。
比如對于初始坐標(0,50)有:Y軸速度絕對值大于X軸速度絕對值,所以選Y軸作為主要方向開始迭代直到兩者相等或者說兩軸坐標絕對值相等時,交換方向。
根據(jù)以上寫了個畫圓的函數(shù):
紅線為一階,黑線為二階,


畫出來的路徑不受程序的速度參數(shù)影響。
一階情況下,兩種圓弧積分的精確度控制:
????圓方程關(guān)于X或Y二階導(dǎo)不恒為0,所以用一階導(dǎo)數(shù)來積分有誤差,而△x和△y的取值范圍是{-1,1},這種情況下,可以調(diào)節(jié)精度但有點麻煩。
而運動獨立的方法中,

可以通過調(diào)節(jié)△t來減小誤差。
????當圓弧的半徑較小時,運動聯(lián)合方法繪制的路徑將會偏離較多且無法調(diào)節(jié)精度。(這里的代碼沒法調(diào)節(jié)聯(lián)合方法的精確度)
在獨立的方法中,將速度設(shè)置得盡可能地小來提高精度。
(虛線為聯(lián)合方法,實線為獨立方法)

代碼段:https://blog.csdn.net/qq_39892910/article/details/128978782