空间圆弧作图算法,基于OpenGL实现!

/////////////////////////////////////////////////////////////////////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;}

于是,月醉了,夜醉了,我也醉了。

空间圆弧作图算法,基于OpenGL实现!

相关文章:

你感兴趣的文章:

标签云: