这种沿贝塞尔曲线分布图像的方式用cairo库怎么实现,希望有做图形方面的来交流一下,这个是图元
业精于勤,荒于嬉;行成于思,毁于随。
沒用過cairo,不過了解貝塞爾曲線。 首先如果cairo自備貝塞爾曲線函數,那就不用說了。 貝塞爾曲線可以用subpision的方法實現,例如不斷切角,具體可以用分治法實現。 另外還有一個常用的方法就是de casteljau演算法,這個是透過在控制桿中線性插值(滑動)來繪製的,實現起來比較簡單,具體可以參考一下wiki
好吧,為了解答題主的題目,專門寫了個繪製程序,用的de casteljau演算法:
核心程式碼:
Point Interpolate(vector<Point> points, float u) { int n = points.size() - 1; vector<Point> ps(n); for (int i = 0; i < n; i++) { ps[i] = u*points[i] + (1 - u)*points[i + 1]; } if (n == 1) return ps[0]; else return Interpolate(ps, u); } vector<Point> Bezier() { vector<Point> points; for (float u = 0.f; u <= 1; u += 0.01f) { Point p = Interpolate(ctrl_points, u); points.push_back(p); } return points; }
完整程式碼
如果要讓圖元沿著曲線均勻分佈,需要計算曲線的弧長關於u的函數,但是貝塞爾曲線的表達式比較複雜,對弧長進行積分就更複雜了。所以建議用數值的方法來決定間隔點,每個間隔點在曲線上的法向量可以很容易得出來,這樣就容易把圖元映射到曲線上了。
沒用過cairo,不過了解貝塞爾曲線。
首先如果cairo自備貝塞爾曲線函數,那就不用說了。
貝塞爾曲線可以用subpision的方法實現,例如不斷切角,具體可以用分治法實現。
另外還有一個常用的方法就是de casteljau演算法,這個是透過在控制桿中線性插值(滑動)來繪製的,實現起來比較簡單,具體可以參考一下wiki
好吧,為了解答題主的題目,專門寫了個繪製程序,用的de casteljau演算法:
核心程式碼:
完整程式碼
如果要讓圖元沿著曲線均勻分佈,需要計算曲線的弧長關於u的函數,但是貝塞爾曲線的表達式比較複雜,對弧長進行積分就更複雜了。所以建議用數值的方法來決定間隔點,每個間隔點在曲線上的法向量可以很容易得出來,這樣就容易把圖元映射到曲線上了。