當前位置:首頁 » 操作系統 » 控制點演算法

控制點演算法

發布時間: 2022-02-26 08:07:07

❶ 求二次貝塞爾曲線 演算法實現

typedefstruct

{

floatx;

floaty;

}Point2D;

/*cp在此是四個元素的數組:

cp[0]為起點,或上圖中的P0

cp[1]為第一控制點,或上圖中的P1

cp[2]為第二控制點,或上圖中的P2

cp[3]為結束點,或上圖中的P3

t為參數值,0<=t<=1*/

Point2DPointOnCubicBezier(Point2D*cp,floatt)

{

floatax,bx,cx;floatay,by,cy;

floattSquared,tCubed;Point2Dresult;

/*計算多項式系數*/

cx=3.0*(cp[1].x-cp[0].x);

bx=3.0*(cp[2].x-cp[1].x)-cx;

ax=cp[3].x-cp[0].x-cx-bx;

cy=3.0*(cp[1].y-cp[0].y);

by=3.0*(cp[2].y-cp[1].y)-cy;

ay=cp[3].y-cp[0].y-cy-by;

/*計算t位置的點值*/

tSquared=t*t;

tCubed=tSquared*t;

result.x=(ax*tCubed)+(bx*tSquared)+(cx*t)+cp[0].x;

result.y=(ay*tCubed)+(by*tSquared)+(cy*t)+cp[0].y;

returnresult;

}

/*ComputeBezier以控制點cp所產生的曲線點,填入Point2D結構數組。

調用方必須分配足夠的空間以供輸出,<sizeof(Point2D)numberOfPoints>*/

voidComputeBezier(Point2D*cp,intnumberOfPoints,Point2D*curve)

{

floatdt;inti;

dt=1.0/(numberOfPoints-1);

for(i=0;i<numberOfPoints;i++)

curve[i]=PointOnCubicBezier(cp,i*dt);

}

❷ 請問高手如何根據幾個點繪制出平滑曲線,就像EXEL中的一樣,請給出控制點坐標反推演算法

試一下拉格朗日差值,由於他差值是線性的,一定平滑。
公式打不上……,你搜一下就可以找到。
你得到差值公式不就是一個平滑的曲線嗎?

❸ 求貝塞爾曲線的頂點坐標的演算法

德卡斯特里奧演算法可以計算貝塞爾曲線上的點C(u),u∈[0,1]。因此,通過給定一組u的值,便可以計算出貝塞爾曲線上的坐標序列,從而繪制出貝塞爾曲線。

德卡斯特里奧演算法的基礎就是在向量AB上選擇一個點C,使得C分向量AB為u:1-u(也就是∣AC∣:∣AB∣= u)。給定點A、B的坐標以及u(u∈[0,1])的值,點C的坐標便為:C = A + (B - A) * u = (1 - u) * A + B * u。

定義貝塞爾曲線的控制點Pi編號為0i,其中,0表示是第0次迭代。當第一、二、三……次迭代時,0將會被1、2、3……替換。

德卡斯特里奧演算法的思想如下:為了計算n次貝塞爾曲線上的點C(u), u∈[0,1],首先將控制點連接形成一條折線00-01-02……0(n - 1)-0n。利用上述方法,計算出折線中每條線段0j-0(j+1)上的一個點1j,使得點1j分該線段的比為u:1-u。然後在折線 10-11-……-1(n-1)上遞歸調用該演算法,以此類推。最終,求得最後一個點n0。 德卡斯特里奧證明了,點n0一定是曲線上的點。

如上圖,曲線控制點是00、01、02、03、04、05。線段00-01上取點10,10分該線段的比為u:1-u,類似地取點11、 12、13、14,然後第二次迭代在線段10-11上取點20,點20分該線段的比為u:1-u,類似地取點21、22、23。然後進行下一次迭代,依次類推,直到最後在線段40-41上取點50,50是最終惟一的點,也是在曲線上的點。

上述直觀的演算法描述可以表達成一個計算方法。

首先,將所有給定的控制點排列成一列,在上圖中,即為最左邊的一列。每一對相鄰的控制點可以伸出兩個箭頭,分別指向右下方和右上方。在相鄰箭頭的交叉處,生成一個新的控制點。例如,控制點ij和i(j +1)生成新的控制點(i + 1)j。指向右下方的箭頭表示乘以(1 - u),指向右上方的箭頭表示乘以u。

因此,通過第0列,可以求出第1列,然後求出第2列……,最終,在n次迭代後,可以到達惟一的一個點n0,這個點就是曲線上的點。

該計算過程演算法如下:

Input: array P[0:n] of n+1 points and real number u in [0,1] Output: point on curve, C(u) Working: point array Q[0:n] for i := 0 to n do

Q[i] := P[i]; // save input

for k := 1 to n do

for i := 0 to n - k do

Q[i] := (1 - u)Q[i] + u Q[i + 1];

return Q[0];

該計算方法可以推導出一個遞歸關系:

但是,直接通過遞歸方法計算Pi,j效率低下,其原因與通過遞歸方法計算斐波那契數列一樣:遞歸方法有大量的重復計算。

德卡斯特里奧演算法還有一個有趣的性質。對於同一列中的連續的一組控制點,對其應用德卡斯特里奧演算法,那麼由這些控制點確定的曲線上的點,就是以這組控制點為邊的等邊三角形中,與這些控制點相對的頂點。

例如:由控制點02、03、04、05確定的曲線上的,對應u的點是32,正如下圖中藍色的等邊三角形所表示的。同樣,控制點11、12、13確定的曲線上的,對應u的點是31,如圖,黃色三角形所示。

根據上面所述,通過給定一組u值,便可以計算出貝塞爾曲線上的坐標序列,從而繪制出貝塞爾曲線。

view plain to clipboardprint?
// arrayCoordinate為控制點

void CChildView::DrawBezier(CDC *pDC, const CArray<CPoint, CPoint>& arrayCoordinate)

{

int n = 0;

if((n = arrayCoordinate.GetSize()) < 2)

return;

double *xarray = new double[n - 1];

double *yarray = new double[n - 1];

double x = arrayCoordinate.GetAt(0).x;

double y = arrayCoordinate.GetAt(0).y;

for(double t = 0.0; t <=1; t += 0.05 / n) // 調整參數t,計算貝塞爾曲線上的點的坐標,t即為上述u

{

for(int i = 1; i < n; ++i)

{

for(int j = 0; j < n - i; ++j)

{

if(i == 1) // i==1時,第一次迭代,由已知控制點計算

{

xarray[j] = arrayCoordinate.GetAt(j).x * (1 - t) + arrayCoordinate[j + 1].x * t;

yarray[j] = arrayCoordinate.GetAt(j).y * (1 - t) + arrayCoordinate[j + 1].y * t;

continue;

}

// i != 1時,通過上一次迭代的結果計算

xarray[j] = xarray[j] * (1 - t) + xarray[j + 1] * t;

yarray[j] = yarray[j] * (1 - t) + yarray[j + 1] * t;

}

}

pDC->MoveTo(x, y);

pDC->LineTo(xarray[0], yarray[0]);

x = xarray[0];

y = yarray[0];

}

delete [] xarray;

delete [] yarray;

}

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Fioman/archive/2008/06/23/2578895.aspx

java 三次貝塞爾曲線 怎麼確定控制點

只是第二點和第三點的坐標而已,肯定有演算法。具體看你要實現什麼業務。

❺ 擬合貝塞爾曲線演算法

是用貝塞爾曲線擬合。參考WinSDK中PolyBezierTo函數。 /* *by Z */ int CalcCtrlPoint(POINT P0,POINT P1,POINT P2,POINT *C)//C為P1與P2之間

❻ 復盤模型:控制點(基於最近的小一級時間段內的12個控制點的分形插值計算)是啥意思

英文原話是:control points ( a very crude method based on the nearest less timeframe, the results must not be considered)
翻譯過來就是:控制點(一種非常粗糙的方法,基於最接近的較短時間,不得考慮結果)
EA實際使用結果和這個選項的測試結果有差距,建議用低兩級時間段測試,如果是基於5M的EA,就乾脆別用這個選項,因為根本沒有比1M更低的時間段了!

❼ 擬合貝塞爾曲線演算法 (50分)

這里有篇文章是演算法的C實現

http://hi..com/roooy/blog/item/5336d7dee09f9e50ccbf1a01.html

❽ gis中為什麼空間校正鏈接越多或控制點越多越校正結果越精確

不知道怎麼解釋好,它具體實現是有一套演算法的,裡面有很多數學方法,控制點是固定的,地圖卻存在誤差,添加控制點後影像重採集就是把誤差盡可能均勻地分布,當然就精確了

❾ 控制點的研究生只研究演算法會不會不好找工作

你就算是被錄取了,再參加調劑復試就沒意義了!反之,如果調劑學校先發待錄取通知,你有意向並且回復確認了,那你就沒希望上一志願的學校了。所以回復要慎重,考慮清楚再確認要怎麼表達感謝呢?對於農民,我們可以怎麼做呢?我們可以把他們種的米飯吃完,我們可以把他們種的蔬菜水果吃完,這就是對他們真正的感謝,愛心媽媽呢?當我們借完書,可以跟他們說聲謝謝,當我們過馬路,可以跟他們說聲早,當我們有活動,也別忘記他們,這么做是我們可以對他們的感謝,而警察呢?我們如果管好自己,不犯罪他們也會輕松點,我們也可以遵守交通號志來過馬路,做了這些,是我們暫時可以做的,只要心理存著感激,他們都會感受到。

❿ 請問兩個頂點為剛性固定,中間一個控制點的貝塞爾曲線,是否可以用公式表達出來

定義貝塞爾曲線的控制點Pi編號為0i,其中,0表示是第0次迭代。當第一、二上述直觀的演算法描述可以表達成一個計算方法。 首先,將所有給定的控制點排列

熱點內容
安卓ops是什麼文件 發布:2024-11-15 16:32:18 瀏覽:927
雙線性插值演算法c 發布:2024-11-15 16:30:45 瀏覽:866
c語言和vc的區別 發布:2024-11-15 16:19:23 瀏覽:118
linux是免費的嗎 發布:2024-11-15 15:53:44 瀏覽:617
多控存儲 發布:2024-11-15 15:52:42 瀏覽:283
一年級數學分解演算法 發布:2024-11-15 15:41:08 瀏覽:411
安卓個人熱點怎麼分享 發布:2024-11-15 15:40:16 瀏覽:264
墊錢解壓 發布:2024-11-15 15:38:54 瀏覽:336
miui4相當於安卓什麼系統 發布:2024-11-15 15:37:54 瀏覽:709
rc4android 發布:2024-11-15 15:27:25 瀏覽:742