在gtk drawingarea中单击时选择绘制的线条

时间:2014-10-01 05:45:31

标签: c++ gtk gtkmm

我在这里注意到我并不是一个真正的高级程序员。我是一名数学家,所以在设计这个应用程序的过程中,我学习了如何使用C ++的特定元素。我可以非常容易地遵循算法和示例,但我没有一个非常好的C ++工具心理目录。

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

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

我希望能够选择线条。我无法想到一种有效的方法来管理它,就像节点一样:我不能将指针的坐标捕捉到最近的线,因为这需要我遍历每一行的每一行。程序,然后检查指针是否足够接近线,如果没有继续到下一个,这将随着线数增加而变得非常低效。

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

是否有某种方法可以将对象添加到GTK绘图区域,以便在单击时发出信号?

编辑:在数学上直截了当地确定,在给定线和坐标的情况下,线上是否存在该坐标。但是,我处理任意多行,所以主要问题是确定哪条行最近

1 个答案:

答案 0 :(得分:2)

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

最佳选项似乎是GooCanvas附带c ++绑定

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