c++ - 使用开罗检查路径是否简单且封闭

标签 c++ gtk cairo gtkmm

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

  1. 填充(或 body 区域);
  2. 边框;
  3. 一个背景区域。

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

enter image description here

在本例中,背景颜色为绿色,边框颜色为蓝色,填充区域为红色(为了清楚起见)。现在我的类不变量之一需要是边界表示的路径是 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_tocurve_to等)。然后您不调用 fillstroke,而是调用 cairo_copy_path_flat

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

关于c++ - 使用开罗检查路径是否简单且封闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48836671/

相关文章:

c++ - QDateTime 小部件在 Mac OS X 下看起来很糟糕

c++ - Qt5.11应用程序插件构建错误: Signal and slot arguments are not compatible

gtk - 哪个是 GTK 应用程序的最佳 GUI 设计器?

c# - GTK# 使用绘图区

c - 如何在gtk2中刷新cairo绘图?

c++ - 编程 'Check for updates' 按钮以确定存储库中的更改

c++ - 如何使用 Visual Studio 和 Linux 对静态库进行版本控制?

c - 我需要一些帮助来获取 gtk 编程的标准。对此我能做什么呢?

c++ - 使用 gtkmm-3.0 的击键

c - 如何将网络摄像头提供给 GTK 窗口?