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