检查路径是否简单并使用cairo关闭

时间:2018-02-17 00:18:00

标签: c++ gtk cairo gtkmm

我将cairomm与gtkmm一起用于GUI项目。我已经定义了一个GeometricShape抽象小部件(继承自Gtk::DrawingArea)来继承,如果需要绘制正方形,圆形等等。这个类定义了三个区域:

  1. 填充(或身体区域);
  2. 一个边界;
  3. 背景区域。
  4. 填充区域用于填充具有特定主体颜色的形状。边框(通常为黑色)定义形状,背景区域用于填充剩余空间(除边框及其相关填充区域之外的所有区域)和颜色。以下是它如何查找圆圈的示例:

    enter image description here

    在这种情况下,背景颜色为绿色,边框颜色为蓝色,填充区域为红色(只是为了清晰)。现在我的一个类不变量需要是边界表示的路径是simple closed curve。我怎么能强制执行这个不变量?

    我虽然想添加一些基础的非cairo逻辑来检查这个,例如通过提供某种SimpleClosedPath对象传递给cairo(它本身会检查不变量),但我不确定这是怎么可能的,因为我想允许多边形和基于曲线的形状,如圆形。

    我虽然使用cairo来执行检查,但检查路径的方法似乎非常有限。我觉得cairo不是为了解决这类问题。

    您是否知道如何确保这种不变性得到尊重?

    我不是在寻找代码,而是更多的想法,尝试一下。

1 个答案:

答案 0 :(得分:3)

  

但我不确定这是怎么可能的,因为我想允许多边形和基于曲线的形状,如圆形。

你知道cairo_copy_path_flat吗?它获得当前路径的扁平副本,这意味着所有曲线都用线近似。

所以,你会以某种方式获得一个cairo上下文(C中的cairo_t),在那里创建你的形状(line_tocurve_toarc等)。然后,您不要拨打fillstroke,而是cairo_copy_path_flat

生成的路径是一系列move_toline_toclose_path命令,您可以(以某种方式......)检查相交。检查两条直线是否交叉是相对直接的,所以你可以例如只需检查每一行与其他每一行的交叉点。