绘图区开罗多个形状
Cairo multiple shapes in drawing area
我正在尝试了解 Cairo 框架;但我不知道如何将多个形状放入绘图区域。我看到的所有 codes/tutorials 要么太高级,要么与此问题无关。
这是我画圆的代码(我使用的是 C 和 gtk+3.0):
void draw(GtkWidget *this, cairo_t *cr, gpointer data) {
cairo_set_line_width(cr, 5);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_translate(cr, prog.width/2, prog.height/2);
cairo_arc(cr, 0, 0, 50, 0, 2 * M_PI);
cairo_stroke_preserve(cr);
cairo_set_source_rgb(cr, 0.9, 0.9, 0.9);
cairo_fill(cr);
}
除了一件事我完全理解:cairo_t *cr
。从我一直在搜索的内容来看,cr
是一个上下文,但并没有完全理解它的含义(也许我的问题在于这种理解?)。
所以,如果我需要在这个附近有更多的圈子,我该如何创建它们?
我的尝试是使用 cairo_move_to(cr, x, y)
并绘制另一个形状,但显然它没有用。
谢谢!
是的,cairo_t
是 cairo 上下文的类型。
要在 cairo 上绘图,您需要设置绘图参数、定义要绘制的颜色或图像的 source 以及 path指定要绘制的形状,然后调用 cairo_stroke()
或 cairo_fill()
进行实际绘制。调用这些之后,路径被重置(除非你使用函数的 _preserve
版本),但其他一切保持不变。
所以要再次绘制,您只需要在第一个之后添加更多设置和绘图函数调用即可。
cairo_move_to()
实际上并没有移动任何东西。 cairo_move_to()
所做的是改变路径 "current point" 的位置。您稍后添加的路径组件,例如 cairo_line_to()
,将从当前点开始,然后将当前点设置为它们的终点。
对于您的情况,您可以通过在绘制处理程序的最后一行之后添加 cairo_move_to()
来绘制多个圆,然后重复用于绘制第一个圆的步骤。
cairo_arc()
不同,因为您将圆弧的中心指定为第二个和第三个参数。要在其他地方绘制弧线,您需要更改这两个参数。 (当前点确实在 cairo_arc()
中起作用;您需要查看文档以获取信息。)
The cairo documentation 是开始了解开罗的最佳起点;它有很多教程和示例。
我正在尝试了解 Cairo 框架;但我不知道如何将多个形状放入绘图区域。我看到的所有 codes/tutorials 要么太高级,要么与此问题无关。
这是我画圆的代码(我使用的是 C 和 gtk+3.0):
void draw(GtkWidget *this, cairo_t *cr, gpointer data) {
cairo_set_line_width(cr, 5);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_translate(cr, prog.width/2, prog.height/2);
cairo_arc(cr, 0, 0, 50, 0, 2 * M_PI);
cairo_stroke_preserve(cr);
cairo_set_source_rgb(cr, 0.9, 0.9, 0.9);
cairo_fill(cr);
}
除了一件事我完全理解:cairo_t *cr
。从我一直在搜索的内容来看,cr
是一个上下文,但并没有完全理解它的含义(也许我的问题在于这种理解?)。
所以,如果我需要在这个附近有更多的圈子,我该如何创建它们?
我的尝试是使用 cairo_move_to(cr, x, y)
并绘制另一个形状,但显然它没有用。
谢谢!
是的,cairo_t
是 cairo 上下文的类型。
要在 cairo 上绘图,您需要设置绘图参数、定义要绘制的颜色或图像的 source 以及 path指定要绘制的形状,然后调用 cairo_stroke()
或 cairo_fill()
进行实际绘制。调用这些之后,路径被重置(除非你使用函数的 _preserve
版本),但其他一切保持不变。
所以要再次绘制,您只需要在第一个之后添加更多设置和绘图函数调用即可。
cairo_move_to()
实际上并没有移动任何东西。 cairo_move_to()
所做的是改变路径 "current point" 的位置。您稍后添加的路径组件,例如 cairo_line_to()
,将从当前点开始,然后将当前点设置为它们的终点。
对于您的情况,您可以通过在绘制处理程序的最后一行之后添加 cairo_move_to()
来绘制多个圆,然后重复用于绘制第一个圆的步骤。
cairo_arc()
不同,因为您将圆弧的中心指定为第二个和第三个参数。要在其他地方绘制弧线,您需要更改这两个参数。 (当前点确实在 cairo_arc()
中起作用;您需要查看文档以获取信息。)
The cairo documentation 是开始了解开罗的最佳起点;它有很多教程和示例。