QT斜椭圆的绘制和碰撞检测原理(Matlab辅助作图),禁止转载

1:常规椭圆方程:

在这里插入图片描述
其中a,b为长短轴,(x0,y0)为椭圆中心位置,如图所示,长轴是2,短轴是1,中心位置是(0,0)
在这里插入图片描述

2:斜椭圆的一般方程:

在这里插入图片描述
其中a,b为长短轴,(x0,y0)为椭圆中心位置,Theta为旋转角度,如图所示,长轴是2,短轴是1,中心位置是(0,0),旋转角度为-60
在这里插入图片描述
给出Matlab的旋转方式,如图所示,两个椭圆的长短轴一样,绿色没有旋转,红色旋转-60,蓝色旋转60
在这里插入图片描述
说明,Matlab上的旋转(2D)是以x,y正半轴开始的,角度小于0顺时针,角度大于0逆时针。
Tip:不同的软件平台旋转方式是不一样的,仅供参考和绘图说明。

很多语言并没有直接给出绘制斜椭圆的接口,但可以间接的绘制,例如Matlab,可以通过参数方程绘制,QT通过translate和rotate绘制。
斜椭圆的参数方程
在这里插入图片描述
参数方程计算原理
在这里插入图片描述

3:QT斜椭圆绘制

先给出实际的运行结果(这只是一个Demo)

斜椭圆碰撞检测 ,Move,Resize演示


如图所示:蓝色是斜椭圆
两个红色的框表示鼠标位置连接椭圆中心的形成的直线和椭圆的交点,可知该直线和椭圆必有交点。
当鼠标和椭圆边界(是椭圆边界,不是椭圆内部)有碰撞检测(HitTest)时,椭圆边界变黄。
另外,也可以看到选中椭圆的边界Resize时,也是OK的。

现给出碰撞检测的原理:
根据斜椭圆的一般方程可以推导有
在这里插入图片描述
同时令
在这里插入图片描述
对应的代码如图所示:
在这里插入图片描述
并不能直接用P+M+Q=a^2 * b^2来判断点在椭圆边界上,因为QT里计算是像素级别的,只能在某一个像素上有碰撞检测,而椭圆的边界是有宽度的,因此需要采取“夹逼准测“来确定;也即利用一个大的斜椭圆和一个小的斜椭圆来确定两者的差集部分,差集部分就是这个大斜椭圆的边界;现有大斜椭圆A和小斜椭圆B,即通过公式就可确定边界的碰撞检测,如下
在这里插入图片描述
对应的代码如图所示:
在这里插入图片描述
另外,计算直线和斜椭圆的交点,利用一元二次方程求解即可,不做过多解释,对应的代码如图所示:
在这里插入图片描述
Tip:以上所有的公式和代码由本人推导(公式比较简单)和相关Demo实验通过,确认无误,可以放心使用。

4:斜椭圆的实际应用

下面是自定义斜椭圆图元在截图工具中的实际应用(拍的图很模糊,没办法,该代码运行本身就是截图,无法使用外部的截取视频工具,就用手机拍的)

截图工具下的自定义斜椭圆Draw,Move,Resize


该斜椭圆支持鼠标手动绘制,Move,Resize。斜椭圆的Draw,Move,Resize相对比较复杂,本文只是简单的介绍相关原理,重点是代码的编写。
该截图工具由本人独立开发,耗时一年,该截图工具的完整视频教程正在制作中,敬请期待,完成后会在本博客附上链接。
如有不对之处,可联系本人
本人微信ID-----------OrangeAndNoodles
Name-------------爱吃橙子和拉面的地球人

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值