绘图区开罗多个形状

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 是开始了解开罗的最佳起点;它有很多教程和示例。