【问题标题】:Cairo fill area between two rectanglesCairo 填充两个矩形之间的区域
【发布时间】:2014-01-23 04:52:04
【问题描述】:

在我的程序中,我想用某种颜色填充两个矩形之间的区域,内部矩形应该是白色的。我这样做的方式是绘制外部矩形并用所需的颜色填充它,然后绘制内部矩形并用白色填充它。

类似以下内容:

cairo_rectangle(cr, x1, y1, width1, height1);  
cairo_set_source_rgb(cr,0,0,0);  
cairo_fill(cr);  
cairo_rectangle(cr, x2, y2, width2, height2);  
cairo_set_source_rgb(cr,1,1,1);  
cairo_fill(cr);

我想知道是否有其他方法可以绘制两个矩形,然后填充它们之间的区域?

【问题讨论】:

  • 开罗的哪个版本?这可能无关紧要,但以防万一。
  • @oliverseal 它的 1.12.16
  • 重新阅读您的问题后,我撤回了答案。为什么不直接描边你想要的厚度然后填充呢?我假设您正在尝试减少填充和 set_source_rgb 调用,因为它们很昂贵。
  • @oliverseal 我可以做到,但如果我有两个或三个或一个形状,这会起作用吗?
  • 我不这么认为。取决于所需的视觉效果。如果您有多种颜色,则每种颜色都需要cairo_set_source_rgbcairo_fill

标签: graphics cairo


【解决方案1】:
cairo_rectangle(cr, x1, y1, width1, height1);
cairo_rectangle(cr, x2, y2, width2, height2);
/* Remember to reset this to CAIRO_FILL_RULE_WINDINIG if it matters for other code */
cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
cairo_fill(cr);

【讨论】:

  • 我不知道 cairo_set_fill_rule()。我在 cairo 手册中读到了它,但不太了解。在 CAIRO_FILL_RULE_EVEN_ODD 的情况下 - 手册说如果交叉点的总数是奇数,则该点将被填充。你能告诉我它在我的情况下是如何工作的吗?
  • 这也是我最初的想法,但重新阅读后,这并没有解决。
  • @sap:在您的情况下,内部矩形内的像素缠绕将是两个,因为它包含在两个矩形中。由于这是偶数,因此不会包括内部矩形。两个矩形之间的点只有一个绕组,因此将包含在填充中。所以这应该解决“填充它们之间的区域” - 你问题的一部分。我不确定你的意思是“绘制两个矩形。也许你想要 cairo_fill_preserve(cr); cairo_set_source_rgb(cr, other_color); cairo_stroke(cr);?
  • @UliSchlachter 通过“绘制两个矩形”,我的意思是不是为每个矩形执行 cairo_set_source_rgb() 和 cairo_fill(),还有其他方法。经过您的解释,现在我明白了您的解决方案。我会试一试。谢谢