【问题标题】:Selecting drawn lines when clicked on in a gtk drawingarea在 gtk 绘图区域中单击时选择绘制的线条
【发布时间】:2014-10-01 21:10:52
【问题描述】:

我要在这里指出,我并不是真正的高级程序员。我更像是一名数学家,所以在设计这个应用程序的过程中,我正在学习如何使用 C++ 的特定元素。我可以很容易地遵循算法和示例等等,只是我没有一个很好的 C++ 工具目录。

该程序的想法如下图所示。您可以放置​​、选择和移动节点。当前选中的节点为红色(可以选择多个)。我已经使用 gtkmm 和绘图区域小部件实现了这一点。当您单击绘图区域时,程序会计算最近的网格交点,如果那里有节点,它会选择它。

节点存储在 unordered_map 中,以 Coordinate 结构作为键。行存储在带有一对键的 unordered_map 中。使用这个我可以很容易地检查一个节点是否存在于一个点,但是检查一条线是否通过一个点就不是那么容易了。

我也希望能够选择行。我想不出一种与节点类似的有效方法来管理它:我不能只将指针的坐标捕捉到最近的行,因为这需要我遍历程序中的每一行,然后检查指针是否是离线路足够近,如果不继续下一条,随着线路数量的增加,这将变得非常低效。

以图片为例:http://i.imgur.com/yWAv9ue.png

有没有什么方法可以将一个对象添加到 GTK 绘图区域,当单击该对象时会发出一个信号?

编辑:在给定一条线和一个坐标的情况下,从数学上确定该坐标是否存在于该线上是很简单的。但是,我正在处理任意多行,所以主要问题是确定 哪条 行是最近的

【问题讨论】:

    标签: c++ gtk gtkmm


    【解决方案1】:

    您需要的是一个画布小部件,而不是您必须自己处理点击的基本GtkDrawingArea

    最好的选择似乎是 GooCanvas,它带有 c++ 绑定

    但是,如果您自己继续使用GtkDrawingArea,则可以通过多种方式存储数据以减少需要检查每个点的行数,例如,您可以存储QuadTree 中的点。

    【讨论】:

    • 非常感谢!画布类型的结构正是我所需要的,在阅读文档后,这似乎是画布对象是这类事物的一般首选类。你是救生员,干杯伙伴
    • 看起来 GooCanvas 不再维护。我也没有看到 GTK 有什么好的替代品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多