84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
这种沿贝塞尔曲线分布图像的方式用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的函数,但是贝塞尔曲线的表达式比较复杂,对弧长进行积分就更复杂了。所以推荐用数值的方法来确定间隔点,并且每个间隔点在曲线上的法向量可以很容易得出来,这样就容易把图元映射到曲线上了。