我将 cairomm 与 gtkmm 一起用于 GUI 项目。我已经定义了一个 GeometricShape
抽象部件(它继承自 Gtk::DrawingArea
),如果需要绘制正方形、圆形等,则继承自该类。此类定义了三个地区:
- 填充(或 body 区域);
- 边框;
- 一个背景区域。
填充区域用于填充具有一定主体颜色的形状。边框(通常是黑色)定义形状,背景区域用于用颜色填充剩余空间(除边框及其相关填充区域外的所有区域)。以下是它如何查找圆圈的示例:
在本例中,背景颜色为绿色,边框颜色为蓝色,填充区域为红色(为了清楚起见)。现在我的类不变量之一需要是边界表示的路径是 simple closed curve .我怎样才能强制执行此不变性?
虽然我想添加一些底层的非 cairo 逻辑来检查这一点,例如通过提供某种 SimpleClosedPath
对象传递给 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_to
、curve_to
、弧
等)。然后您不调用 fill
或 stroke
,而是调用 cairo_copy_path_flat
。
生成的路径是一系列 move_to
、line_to
和 close_path
命令,然后您可以(以某种方式...)检查相交.检查两条直线是否相交是相对简单的,所以你可以,例如只需检查每条线是否与其他所有线相交。
关于c++ - 使用开罗检查路径是否简单且封闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48836671/