使用开罗检查路径是否简单且封闭

Checking if path is simple and closed using cairo

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

  1. 填充(或body区域);
  2. 边框;
  3. 一个背景区域。

填充区域用于用某种body颜色填充形状。边框(通常是黑色)定义形状,背景区域用于用颜色填充剩余的 space(除了边框及其相关填充区域之外的所有内容)。这是它如何查找圆的示例:

在本例中,背景颜色为绿色,边框颜色为蓝色,填充区域为红色(为了清楚起见)。现在我的 class 不变量之一需要是边界表示的路径是 simple closed curve。我怎样才能强制执行此不变性?

我想添加一些底层 non-cairo 逻辑来检查这一点,例如通过提供某种 SimpleClosedPath object 传递给开罗(它本身会检查不变量),但我不确定这怎么可能,因为我想同时允许多边形和基于曲线的形状,例如圆形。

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

你知道我如何确保遵守这个不变量吗?

我并不是真的在寻找代码,而是更多的是为了一个想法,一些可以尝试的东西。

but I'm not sure how this would be possible, since I want to allow both polygons and curved based shapes, like a circle.

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

因此,您将以某种方式获得 cairo 上下文(C 中的 cairo_t),在那里创建您的形状(使用 line_tocurve_toarc 等)。然后你不调用 fillstroke,而是调用 cairo_copy_path_flat

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