鼠标操作图形旋转
来源:互联网 发布:哈尔滨网络诈骗通缉单 编辑:程序博客网 时间:2024/06/07 06:41
算法思路:
寻找图形的中心点或者给定一个点,将影响图形形状的关键点绕着这个点旋转,然后根据旋转后的新值重绘图形。这里旋转的角度,即为鼠标移动开始点与定点的向量,和移动结束点与定点的向量之间的夹角。
用到的数学公式:
部分函数实现:
//////////////////////////////////////////////////////////////////////////struct POINTF { float x; float y; POINTF::POINTF(){} POINTF::POINTF(float a,float b):x(a),y(b){}};//判断向量顺时针旋转还是逆时针旋转(两向量起点相同)//向量a,旋转前的向量//向量b,旋转后的向量//返回值1-顺时针 0-平行 -1-逆时针int vecCross(const POINTF& a,const POINTF& b){ float fValue = a.x*b.y - b.x*a.y; if (fValue > 1e-6)//正 { return 1; } else if(fValue < -1e-6)//负 { return -1; } else//零 { return 0; }}//点pta绕ptCenter点旋转int vecCross(const POINTF& ptCenter,const POINTF& pta,const POINTF& ptScreen){ POINTF a = POINTF(pta.x-ptCenter.x,pta.y-ptCenter.y); POINTF b = POINTF(ptScreen.x-ptCenter.x,ptScreen.y-ptCenter.y); int axb = vecCross(a,b); return axb;}//计算向量旋转角度cos值//点pta绕ptCenter点旋转float rotCosAngle(const POINTF& ptCenter,const POINTF& pta,const POINTF& ptScreen){ POINTF a = POINTF(pta.x-ptCenter.x,pta.y-ptCenter.y); POINTF b = POINTF(ptScreen.x-ptCenter.x,ptScreen.y-ptCenter.y); POINTF c = POINTF(ptScreen.x-pta.x,ptScreen.y-pta.y); float A = sqrtf(a.x*a.x+a.y*a.y); float B = sqrtf(b.x*b.x+b.y*b.y); float C = sqrtf(c.x*c.x+c.y*c.y); float CosC = (A*A+B*B-C*C)/(2*A*B);//cosC = (a^2+b^2-c^2)/2ab 此处没有考虑除数为0的情况 return CosC;}//计算一个点绕另一个点旋转,得到的点POINTF getRotationPoint(const POINTF& ptCenter,const POINTF& pta,const int& axb,const float& costheta){ POINTF pt(0.0,0.0); POINTF a = POINTF(pta.x-ptCenter.x,pta.y-ptCenter.y); //POINTF b = POINTF(ptScreen.x-ptCenter.x,ptScreen.y-ptCenter.y); //int axb = vecCross(a,b); //float costheta = rotCosAngle(ptCenter,pta,ptScreen); float sintheta = sqrtf(1-costheta*costheta);//计算sin值,sinA^2+cosA^2 = 1 POINTF ptTemp; switch(axb) { case 0: pt = pta; break; case -1://逆时针 ptTemp = POINTF(a.x*costheta+a.y*sintheta+ptCenter.x,-a.x*sintheta+a.y*costheta+ptCenter.y); pt = ptTemp; break; case 1://顺时针 ptTemp = POINTF(a.x*costheta-a.y*sintheta+ptCenter.x,a.x*sintheta+a.y*costheta+ptCenter.y); pt = ptTemp; break; } return pt;}
阅读全文
0 0
- 鼠标操作图形旋转
- java 图形旋转操作
- openGL 旋转的图形 矩阵操作
- 使用鼠标自由旋转三维图形的算法和思路
- 图形旋转
- 图形旋转
- 图形旋转
- 旋转图形
- perl-opengl基本图形操作-缩放,二维旋转,二维平移
- iOS 图形上下文的矩阵操作(平移、旋转、缩放)
- 计算机图形学 -- 变换之旋转二 [鼠标操作]
- Unity 3D鼠标操作实现旋转、缩放观察物体
- WPS简单五步操作修改图形并调整图形位置大小和旋转角度
- 绘制旋转Cube图形
- C++ - 图形旋转
- nyoj-1079-图形旋转
- android 图形旋转
- OpenGL图形旋转
- 由具有父子关系数据得到其树结构
- js控制img自适应父元素
- 11.16第12节课
- 深入浅出外观模式(一)
- 色彩表示
- 鼠标操作图形旋转
- 选择排序
- Android WebView简要介绍和学习计划
- 编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程
- 打开任意窗口之后,电脑下方任务栏无法显示,解决方法:
- Error: linker command failed with exit code 1 (use -v to see invocation)
- ImportError: libcaffe.so.1.0.0: cannot open shared object file: No such file or directory
- 解决ElementUI的Table组件固定列,在屏幕刚好够表格显示时,会出现固定列显示不全的问题
- 安迪-比尔定理已被打破?