根據乙個已有的點集合,想畫出一條光滑的曲線有很多種演算法。
其中一種比較快捷的是使用貝塞爾曲線,有成熟的polybezier方法可以直接呼叫。
但是有乙個問題需要注意,就是貝塞爾曲線對點集合是有要求的,如果不滿足要求,就不會得到你想要的曲線。
如何滿足要求呢,先要理解貝塞爾曲線的原理。簡單點說:
貝賽爾曲線的每一段曲線都要乙個起點,乙個終點,兩個控制點(用於控制曲線的弧度)。所以點陣列的記錄方式是:起點+控制點+控制點+終點+控制點+控制點+終點+……。也就是說,點的數量應該是3×n+1.
明白了道理,我們就可以修正任何乙個點陣列了,我實現的演算法如下:
//貝塞爾曲線點位修正 function adjustpointsforbezier(arrsource: tarrayofpoint): tarrayofpoint; var i: integer; ncount, nmod, ncountresult: integer; begin ncount := high(arrsource) + 1;
//貝塞爾曲線點數為3*n+1 nmod := ncount mod 3; if nmod = 1 then ncountresult := ncount else if nmod = 2 then ncountresult := ncount + 2 else ncountresult := ncount + 1;
setlength(result, ncountresult); //得到所有源點 for i := 0 to ncount - 1 do begin result[i].x := arrsource[i].x; result[i].y := arrsource[i].y; end;
//增加修正點 for i := ncount to ncountresult - 1 do begin result[i].x := arrsource[ncount - 1].x; result[i].y := arrsource[ncount - 1].y; end; end;
當然,本演算法是用最後乙個點做修正點,你可以選擇差值法,得到更合適的中間點位來修正,以求更好的精確度。
根據點集合畫曲線
根據乙個已有的點集合,想畫出一條光滑的曲線有很多種演算法。其中一種比較快捷的是使用貝塞爾曲線,有成熟的polybezier方法可以直接呼叫。但是有乙個問題需要注意,就是貝塞爾曲線對點集合是有要求的,如果不滿足要求,就不會得到你想要的曲線。如何滿足要求呢,先要理解貝塞爾曲線的原理。簡單點說 貝賽爾曲線...
根據點集合畫曲線(貝塞爾)
根據乙個已有的點集合,想畫出一條光滑的曲線有很多種演算法。其中一種比較快捷的是使用貝塞爾曲線,有成熟的polybezier方法可以直接呼叫。但是有乙個問題需要注意,就是貝塞爾曲線對點集合是有要求的,如果不滿足要求,就不會得到你想要的曲線。如何滿足要求呢,先要理解貝塞爾曲線的原理。簡單點說 貝賽爾曲線...
根據點提取柵格值
柵格資料中每乙個柵格都有乙個值,比如dem,每一格都有乙個高程值,值都是內插得出的。現在有一點集,需要根據柵格將每乙個賦上相應的柵格值。用到的工具是提取分析中的值提取至點 extractvaluestopoints 當然,如果柵格是多個柵格組成,必須還先把它們鑲嵌,使用到的工具是鑲嵌到新柵格,需要注...