|
發表於 2013年2月6日 11:28 AM
|
顯示全部樓層
原帖由 suvsuvsuv 於 2013年2月5日 11:00 AM 發表
2)拟合曲线目前找不到合适的计算公式,所以暂时无法实 ...
我所採用的"二次B 样条曲线", 不通過 "點", 會有偏離, 但計算較簡易 !!
excel的試算:
模擬器(會有偏離):
網絡上原本提供的是: f(t)函式
即 X=f1(t), Y=f2(t),
但遙控器需要的是 Y=f(x),
因此需要先用 X解二次方程(
)得到t, 再用t計算Y.
但X若是線性, 即n-點的位置(X值)是固定的 =(CHAN_MAX_VALUE-CHAN_MIN_VALUE)/n.
則t可用內插法直接得出較為快速.- /********** Bspline **********/
- s16 Bspline(struct Curve *curve, s32 value) // use n-POINT
- {
- s32 x0,x1;
- s32 y0,y1,y2;
- s32 b0,b1,b2;
- s32 t,tmp;
- int i;
- int num_points = (curve->type - CURVE_3POINT) * 2 + 3;
- s32 step = 10000/(num_points-1) ; // (2*10000)/(2*(num_points-1) ,use 2n-steps for n-POINT
- for (i = 0; i < num_points; i++) {
- x0 = -10000 + (2*i-1)*step; // n-POINT, X is linear
- x1 = x0 + 2*step;
-
- if(value >= x0 && value <= x1) {
- y1 = curve->points;
- if (i==0) { // end point
- y2 = curve->points[i+1];
- y0 = y1+y1-y2; // Linear extension
- } else {
- if (i==(num_points-1)) { // end point
- y0 = curve->points[i-1];
- y2 = y1+y1-y0; // Linear extension
- }
- else {
- y0 = curve->points[i-1];
- y2 = curve->points[i+1];
- }
- }
-
- b0=100*(y1+y0)/2; // mid
- b1=100*(y1-y0); // delta1
- b2=100*(y2-2*y1+y0)/2; // (delta2-delta1)/2
- /*** t = (value-x0)/(x1-x0), use interpolate because X is linear ***/
- t = 50*(value-x0)/step; // 2-decimals: (100*(value-x0))/(2*step)
- tmp = b0+b1*t/100+b2*t*t/10000; //Bspline
- // tmp = b1*t/100+y0; //Interpolate
- return tmp;
- } //if(value >= x0 && value <= x1)
- } //for (i = 0; i < num_points; i++)
- return PCT_TO_RANGE(curve->points[num_points-1]);
- }
- /********** Bspline **********/
複製代碼
模擬器: (7點 與 11點 用 Bspline擬合曲線, 僅作為此範例之用)
emu_devo10_Bspline.zip
(310.46 KB, 下載次數: 123)
[ 本帖最後由 hmjack2008 於 2013年2月6日 12:53 PM 編輯 ] |
|