在gtk绘图区域中单击时选择绘制的线



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

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

节点存储在一个以坐标结构为键的无序映射中。行存储在一个无序映射中,其中键为一对。使用它,我可以很容易地检查一个点上是否存在节点,但检查一条线是否穿过一个点就不那么容易了。

我也希望能够使线条可选。我想不出一种有效的方法来管理这一点,就像管理节点一样:我不能只将指针的坐标捕捉到最近的一行,因为这需要我迭代程序中的每一行,然后检查指针是否足够靠近这一行,如果不继续下一行,随着行数的增长,这将变得非常低效。

以下是一张图片作为示例:https://i.stack.imgur.com/Nfrht.png

有没有办法在GTK绘图区域中添加一个对象,当单击时会发出信号?

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

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

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

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

最新更新