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