投稿    登录
  博主录制的Python3爬虫视频教程已发布!详情请戳Python3爬虫视频教程!希望大家支持!非常感谢!

OpenGL绘图实例八之图形的移动删除存盘

C/C++ 崔庆才 2670浏览 0评论

综述

在上一篇文章中我们已经实现了图形的取点绘制,接下来我们还要实现的功能有图形的删除、移动以及存盘读盘功能。

概述如下

  •  鼠标点击某个绘制的图形,将其删除
  •  鼠标拖动某个图形,可以对其随意拖拽改变位置
  • 点击存盘,将图形的位置及颜色保存到文件
  • 点击读盘,将图形的位置颜色从文件中读取出来并重新绘制

好,接下来我们在上一篇的基础上进行一步步的说明。

图形删除

首先像之前一样,我们定义一个删除的按钮,指定好颜色。

在display函数中绘制一个删除的按钮

顶部变变成了这个样子,其中最左边的那个按钮便是删除按钮

QQ截图20150511124225

接下来我们想一下删除的实现。

首先我们点击删除按钮之后要设置一下drawStatus,比如设置为2代表删除。

然后鼠标点击下方任意位置时,如果当前drawStatus为2,如果鼠标处在一个多边形内部,我们就把它删除掉。

那么就会出现两个问题了,怎样判断点击的点处在多边形的内部?怎样执行删除操作?

下面我们分别来研究一下

1. 判断点在多边形内部

思路:求解通过该点的水平线与多边形各边的交点 ,如果交点为奇数,那么就判定为在多边形内部,否则在外部。

因此,我的算法实现如下,传入的参数一个是ploygon结构体,结构体中包含了顶点坐标,另外就是这个点的x,y坐标。

思路参考来源:

判断点在多边形内的多种写法

经过我的改写,变成了如下内容

以上便是判断在多边形内部的算法。

2.删除图形实现

好了,有了上面的算法,我们就依次查找我们声明的 polygons 数组,找到第一个符合要求的多边形结构体 polygon 返回它的索引。

这个方法就是传入了点击点的位置x,y坐标,然后判断是在哪个多边形内,然后移除之。如果没有找到,则不执行删除操作。

其中 removePoly(delenum) 就是通过传入这个结构体的索引,然后将它从polygons里面删除即可,方法实现如下

其实就是相当于从数组中移除一个元素,然后后面的元素依次前移。

恩好了,准备工作都做好了,我们只需要在点击了删除按钮之后,调用一下deletePoly函数即可。

把原来的mouseClick方法改写如下即可,代码较长,不完全展开,双击查看完整代码

经过上面的步骤,我们便可以很方便地实现图形的删除了。运行结果如下

嗯,就是这样,现在删除就大功告成了。

移动图形

像之前一样,定义一个移动图形的按钮。在此不再赘述

那么图形移动怎么实现?思路如下

首先利用判断点击的点是否在多边形内部的算法,找到需要移动的多边形。然后在监听鼠标移动的事件中设置这个多边形各个顶点的相对移动距离等于鼠标相对移动距离即可。

首先,移动的drawSatus我们设置为3,在mouseClick方法中加入如下部分,在哪加你应该已经知道了。

在mouseMove方法中(另一个监听鼠标移动的事件)中首先判断当前的drawStatus如果为3,那么就执行移动操作。

加入如下的方法即可。

这里两点需要说明,moveNum就是我们需要移动的图形的索引,定义为了全局变量。在鼠标点击时,首先判定点击点在哪个图形中,然而因为有两个鼠标事件(一个是点击,一个是移动),所以就把这个变量定义为全局变量,来标记该移动哪个图形。moveNum的初始值为-1,如果为-1,那么就代表没有选中任何图形,不移动。如果不是-1,就进行移动。

其次,movePloy方法实现如下

这个方法的实现有一部分需要说明,首先是clickX,clickY。

因为在移动时移动的是相对距离。所以,鼠标每移动一个像素,我们就要计算下一步鼠标移动的位置和上一个位置的差值,所以每次移动我们都需要标记一下点击的位置。所以上面的方法中才有了

然后,在图形移动时,我们需要移动的是相对位置。所以我们将一个图形的所有顶点进行遍历,加上鼠标移动的相对位置即可。就是如下的实现

另外,mouseClick方法中我们需要调用一下即可。mouseClick方法现在改写如下

好,现在就大功告成了,看一下运行结果吧

现在完整的代码如下,代码过长,不完全显示,双击查看完整代码

以上,就可以实现图形的移动和删除了。

存盘和读盘

这个很简单,存盘我们只需要把所有图形的位置以及颜色输出到一个文本中,然后在读盘时,把文本中所有内容读入并存储到多边形结构体数组中,然后重新绘制即可。

代码的讲解直接写在注释中,比较好理解

我们只需要再定义两个按钮,再display中画上这俩按钮

然后把mouseClick方法改写一下就好了。最终mouseClick方法如下

大功告成!现在只要你存盘成功,不管对图形进行怎样的移动,删除操作。只要再点击读盘,就可以恢复到存盘时的状态,是不是非常酷炫。

大家可以尝试一下!

总结

本篇文章说明了图形的删除,移动以及存盘读盘的功能。代码实现仅仅是我个人的思路,当然实现方式不止这一种,欢迎大家创新。

部分思路如果大家有更好的解决方法,欢迎同我交流,非常感谢。

总之希望对大家有帮助!小伙伴们加油!

转载请注明:静觅 » OpenGL绘图实例八之图形的移动删除存盘

喜欢 (21)or分享 (0)

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的

想结交更多的朋友吗?

来进击的Coder瞧瞧吧

进击的Coder

QQ群号 99350970 立即加入

进击的Coder灌水太多?

这里是纯粹的技术领地

激进的Coder

QQ群号 627725766 立即加入

想找人聊天解闷?想要学习干货?

微信公众号进击的Coder为你打造

进击的Coder

微信公众号 扫一扫关注