使用 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_to
、curve_to
、arc
等)。那你就不用叫fill
或stroke
,而是叫cairo_copy_path_flat
。
生成的路径是一系列move_to
、line_to
和close_path
命令,然后您可以(以某种方式...)检查它们是否相交。检查两条直线是否相交是相对直截了当的,所以你可以例如只需检查每条线是否与其他线相交。
【讨论】:
以上是关于使用 cairo 检查路径是不是简单且封闭的主要内容,如果未能解决你的问题,请参考以下文章