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-------------爱吃橙子和拉面的地球人