空间圆弧作图算法,基于OpenGL实现!
2011-10-28 00:32
871 查看
///////////////////////////////////////////////////////////////////// int CGLBasic::DrawCircle(XPoint ps, XPoint pe, XPoint pc, ColorRGB clr) { const float inc_a=0.001f; // 精度系数 ps.x *= (m_ZoomRate*ONE_OF_HUNDRED); ps.y *= (m_ZoomRate*ONE_OF_HUNDRED); ps.z *= (m_ZoomRate*ONE_OF_HUNDRED); pe.x *= (m_ZoomRate*ONE_OF_HUNDRED); pe.y *= (m_ZoomRate*ONE_OF_HUNDRED); pe.z *= (m_ZoomRate*ONE_OF_HUNDRED); pc.x *= (m_ZoomRate*ONE_OF_HUNDRED); pc.y *= (m_ZoomRate*ONE_OF_HUNDRED); pc.z *= (m_ZoomRate*ONE_OF_HUNDRED); float as_xy,as_zy,ae_xy,ae_zy,as_xz,ae_xz; // 保存角度 size_t count; // float xy_inc; // xy平面上角度增长步长 float zy_inc; // zy平面上角度增长步长 float xz_inc; // xz平面上的角度增长步长 float R; // 圆弧半径 float x,y,z; // 计算圆弧半径 R=sqrt((ps.x-pc.x)*(ps.x-pc.x) +(ps.y-pc.y)*(ps.y-pc.y) +(ps.z-pc.z)*(ps.z-pc.z)); // xy平面上起点、终点的角度 as_xy = CalAngle(ps.x, ps.y, pc.x, pc.y); ae_xy = CalAngle(pe.x, pe.y, pc.x, pc.y); if ( ae_xy <= as_xy ) { ae_xy += 2*PI; } // 计算zy平面上起点、终点的角度,此时z轴相当于xy平面上的x轴 as_zy = CalAngle(ps.z, ps.y ,pc.z, pc.y); ae_zy = CalAngle(pe.z, pe.y, pc.z, pc.y); if ( ae_zy <= as_zy ) { ae_zy += 2*PI; } // 计算xz平面上起点、终点的角度 as_xz = CalAngle(ps.x, ps.z, pc.x, pc.z); ae_xz = CalAngle(pe.x, pe.z, pc.x, pc.z); if ( ae_xz < as_xz ) { ae_xz += 2*PI; } // xy平面为主平面的情况 if ( (pe.x-ps.x) && (pe.y-ps.y) ) { // 分别计算两平面上角度增长的步长 if ( (ae_xy-as_xy) > (ae_zy-as_zy) ) { xy_inc = inc_a; count = (size_t)(ae_xy-as_xy)/xy_inc; zy_inc = (ae_zy-as_zy)/count; } else { zy_inc = inc_a; count = (size_t)(ae_zy-as_zy)/zy_inc; xy_inc = (ae_xy-as_xy)/count; } // 微分思想计算画圆弧所需的点坐标 glBegin(GL_LINE_STRIP); glColor3f(clr.r, clr.g, clr.b); int i=0; for ( float a_xy=as_xy, a_zy=as_zy; a_xy<=ae_xy && a_zy<=ae_zy; a_xy+=xy_inc,a_zy+=zy_inc,i++ ) { x = pc.x + R*cos(a_xy); y = pc.y + R*sin(a_xy); z = pc.z + R*cos(a_zy); glVertex3f(x,y,z); } glEnd(); glFlush(); } // xz为主平面的情况 else if ( (pe.x-ps.x) && (pe.z-ps.z) ) { if ( (ae_xz-as_xz) > (ae_zy-as_zy) ) { xz_inc = inc_a; count = (size_t)(ae_xz-as_xz)/xz_inc; zy_inc = (ae_zy-as_zy)/count; } else { zy_inc = inc_a; count = (size_t)(ae_zy-as_zy)/zy_inc; xz_inc = (ae_xz-as_xz)/count; } glBegin(GL_LINE_STRIP); glColor3f(clr.r, clr.g, clr.b); int i=0; for ( float a_xz=as_xz,a_zy=as_zy; a_xz<=ae_xz && a_zy<=ae_zy; a_xz+=xz_inc,a_zy+=zy_inc,i++ ) { x = pc.x + R*cos(a_xz); y = pc.y + R*sin(a_zy); z = pc.z + R*sin(a_xz); glVertex3f(x,y,z); } glEnd(); glFlush(); } // zy为主平面的情况 else if ( (pe.y-ps.y) && (pe.z-ps.z) ) { if ( (ae_zy-as_zy) > (ae_xy-as_xy) ) { zy_inc = inc_a; count = (size_t)(ae_zy-as_zy)/zy_inc; xy_inc = (ae_xy-as_xy)/count; } else { xy_inc = inc_a; count = (size_t)(ae_xy-as_xy)/xy_inc; zy_inc = (ae_zy-as_zy)/count; } glBegin(GL_LINE_STRIP); glColor3f(clr.r,clr.g,clr.b); int i=0; for ( float a_xy=as_xy,a_zy=as_zy; a_xy<=ae_xy && a_zy<=ae_zy; a_xy+=xy_inc,a_zy+=zy_inc,i++ ) { x = pc.x + R*cos(a_xy); y = pc.y + R*sin(a_zy); z = pc.z + R*cos(a_zy); glVertex3f(x,y,z); } glEnd(); glFlush(); } else { return 0; // 不能在任何平面构成圆弧则返回 } return 0; }
相关文章推荐
- 基于HSV色彩空间变换的阴影检测算法——MATLAB实现
- 基于肤色和眼睛定位的人脸检测算法——MATLAB实现
- 【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
- 基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(三)
- LRU算法的精简实现(基于Java)
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
- 基于堆栈的计算器实现算法
- OpenGL光照阴影算法的实现
- 基于LinkedHashMap实现LRU缓存调度算法原理
- 计算机图形学-基于OpenGL的绘制空间曲线
- 基于密度的局部离群点检测(lof算法) (Java 实现)
- 运动目标检测中基于HSV空间的阴影去除算法
- 基于KWIC 的keyword匹配算法(管道+过滤器模式下实现)
- 基于光流法相位提取算法---MATLAB实现
- 基于C++的农夫过河问题算法设计与实现方法
- 基于opencv的神经网络算法实现两类分类问题的可视化演示
- 基于矩阵分解推荐算法之交替最小二乘法(ALS)--附实现代码
- OpenGL中点算法画圆弧、内接多边形算法画圆
- 基于C#代码实现九宫格算法横竖都等于4
- 基于图的推荐算法及python实现