我将cairomm与gtkmm一起用于GUI项目。我已经定义了一个GeometricShape
抽象小部件(继承自Gtk::DrawingArea
)来继承,如果需要绘制正方形,圆形等等。这个类定义了三个区域:
填充区域用于填充具有特定主体颜色的形状。边框(通常为黑色)定义形状,背景区域用于填充剩余空间(除边框及其相关填充区域之外的所有区域)和颜色。以下是它如何查找圆圈的示例:
在这种情况下,背景颜色为绿色,边框颜色为蓝色,填充区域为红色(只是为了清晰)。现在我的一个类不变量需要是边界表示的路径是simple closed curve。我怎么能强制执行这个不变量?
我虽然想添加一些基础的非cairo逻辑来检查这个,例如通过提供某种SimpleClosedPath
对象传递给cairo(它本身会检查不变量),但我不确定这是怎么可能的,因为我想允许多边形和基于曲线的形状,如圆形。
我虽然使用cairo来执行检查,但检查路径的方法似乎非常有限。我觉得cairo不是为了解决这类问题。
您是否知道如何确保这种不变性得到尊重?
我不是在寻找代码,而是更多的想法,尝试一下。
答案 0 :(得分:3)
但我不确定这是怎么可能的,因为我想允许多边形和基于曲线的形状,如圆形。
你知道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
命令,您可以(以某种方式......)检查相交。检查两条直线是否交叉是相对直接的,所以你可以例如只需检查每一行与其他每一行的交叉点。