控制點演算法
❶ 求二次貝塞爾曲線 演算法實現
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次迭代。當第一、二上述直觀的演算法描述可以表達成一個計算方法。 首先,將所有給定的控制點排列