使用开罗检查路径是否简单且封闭
Checking if path is simple and closed using cairo
我将 cairomm 与 gtkmm 一起用于 GUI 项目。我已经定义了一个GeometricShape
抽象部件(它继承自Gtk::DrawingArea
),如果需要绘制正方形,圆形等,则可以继承。这个class定义了三个区域:
- 填充(或body区域);
- 边框;
- 一个背景区域。
填充区域用于用某种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_to
、curve_to
、arc
等)。然后你不调用 fill
或 stroke
,而是调用 cairo_copy_path_flat
。
生成的路径是一系列 move_to
、line_to
和 close_path
命令,然后您可以(以某种方式...)检查是否相交。检查两条直线是否相交是相对简单的,所以你可以,例如只需检查每条线是否与其他线相交。
我将 cairomm 与 gtkmm 一起用于 GUI 项目。我已经定义了一个GeometricShape
抽象部件(它继承自Gtk::DrawingArea
),如果需要绘制正方形,圆形等,则可以继承。这个class定义了三个区域:
- 填充(或body区域);
- 边框;
- 一个背景区域。
填充区域用于用某种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_to
、curve_to
、arc
等)。然后你不调用 fill
或 stroke
,而是调用 cairo_copy_path_flat
。
生成的路径是一系列 move_to
、line_to
和 close_path
命令,然后您可以(以某种方式...)检查是否相交。检查两条直线是否相交是相对简单的,所以你可以,例如只需检查每条线是否与其他线相交。