使用 cairo 检查路径是不是简单且封闭

Posted

技术标签:

【中文标题】使用 cairo 检查路径是不是简单且封闭【英文标题】:Checking if path is simple and closed using cairo使用 cairo 检查路径是否简单且封闭 【发布时间】:2018-02-17 00:18:00 【问题描述】:

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

    填充(或身体区域); 边界; 背景区域。

填充区域用于填充具有一定体色的形状。边框(通常是黑色)定义了形状,背景区域用于用颜色填充剩余空间(除了边框及其相关填充区域之外的所有空间)。下面是一个如何查找圆的示例:

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

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

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

您知道如何确保尊重这个不变量吗?

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

【问题讨论】:

【参考方案1】:

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

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

所以,你会以某种方式获得一个 cairo 上下文(C 中的cairo_t),在那里创建你的形状(使用line_tocurve_toarc 等)。那你就不用叫fillstroke,而是叫cairo_copy_path_flat

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

【讨论】:

以上是关于使用 cairo 检查路径是不是简单且封闭的主要内容,如果未能解决你的问题,请参考以下文章

在 pakg-config 搜索路径中找不到包 cairo

photoshop钢笔使用技巧?

如何模糊 Paper.js 中的封闭路径元素?

如何检查路径是不是为 C# 文件?

如果路径已知,检查 Firestore 记录是不是存在的最佳方法是啥?

photoshop 路径 钢笔工具 控制杆太复杂了,在哪有详细的资料?