使用QPainter画一个3D正方体
本文实例为大家分享了QPainter画一个3D正的具体代码,供大家参考,具体内容如下
My3DBox.h
#includeusingnamespaceEigen; #defineSQUARE_LENGTH200//是一个边长200的正方体 #defineCAMERA_DISTANCE300//视点距离 classMy3DBox:publicQWidget { Q_OBJECT public: explicitMy3DBox(QWidget*parent=0); protected: QPointm_mousePos; Vector3dm_vector[8];//正方形8个点坐标 voidmouseMoveEvent(QMouseEvent*); voidpaintEvent(QPaintEvent*); voiddrawPlane(constQPoint*points,QPainter&painter); Matrix3dgetMartix(); QPointToPoint(Vector3dvector); voiddrawUp(QPoint*points,QPainter&painter);//正方体面的绘制 voiddrawDown(QPoint*points,QPainter&painter); voiddrawLeft(QPoint*points,QPainter&painter); voiddrawRight(QPoint*points,QPainter&painter); };
My3DBox.cpp
#include"widget.h" #definePI3.1415926 My3DBox::My3DBox(QWidget*parent): QWidget(parent),m_mousePos(0,0) { setMouseTracking(true);//在任何情况下启用mouseMoveEvent setGeometry(400,200,500,500); m_vector[0]<<-100,100,100;//设置正方体顶点初始位置 m_vector[1]<<100,100,100; m_vector[2]<<-100,-100,100; m_vector[3]<<100,-100,100; m_vector[4]<<-100,100,-100; m_vector[5]<<100,100,-100; m_vector[6]<<-100,-100,-100; m_vector[7]<<100,-100,-100; } voidMy3DBox::mouseMoveEvent(QMouseEvent*e)//此处把坐标原点从左上角变换至屏幕中心 { if(e->pos().x()<0) m_mousePos.setX(-width()/2); elseif(e->pos().x()>width()) m_mousePos.setX(width()/2); else m_mousePos.setX(e->pos().x()-width()/2); if(e->pos().y()<0) m_mousePos.setY(height()/2); elseif(e->pos().y()>height()) m_mousePos.setY(-height()/2); else m_mousePos.setY(-e->pos().y()+height()/2); update(); } voidMy3DBox::paintEvent(QPaintEvent*) { QPainterpainter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.setPen(Qt::NoPen); painter.fillRect(rect(),QColor(3,22,52)); Vector3dvector[8]; Matrix3dmatrix=getMartix();//获取变换矩阵 QPointpoints[8];//正面0123左面4062右面1537上面4501下面2367(以观察者的方向为主) for(inti=0;i<8;++i)//计算变换后坐标 { vector[i]=matrix*m_vector[i]; points[i]=ToPoint(vector[i]); points[i].setX(points[i].x()+width()/2);//将坐标系原点变换至左上角 points[i].setY(-points[i].y()+height()/2); } //一共要画5个面,最后画正面 if(qAbs(m_mousePos.x())>qAbs(m_mousePos.y())) { if(m_mousePos.x()>0) { if(m_mousePos.y()>0) drawDown(points,painter); else drawUp(points,painter); drawLeft(points,painter); } else { if(m_mousePos.y()>0) drawDown(points,painter); else drawUp(points,painter); drawRight(points,painter); } } else { if(m_mousePos.y()>0) { if(m_mousePos.x()>0) drawLeft(points,painter); else drawRight(points,painter); drawDown(points,painter); } else { if(m_mousePos.x()>0) drawLeft(points,painter); else drawRight(points,painter); drawUp(points,painter); } } //画正面 QPointpoint[4]= { points[0], points[1], points[3], points[2] }; drawPlane(point,painter); } voidMy3DBox::drawPlane(constQPoint*points,QPainter&painter) { QLinearGradientlinearGradient(points[1],points[3]);//设置渐变色 linearGradient.setColorAt(0.0,QColor(150,150,250)); linearGradient.setColorAt(1.0,QColor(170,170,255)); painter.setBrush(QBrush(linearGradient)); painter.drawConvexPolygon(points,4); } Matrix3dMy3DBox::getMartix() { doubleunit_x=0;//同方向单位向量的x和y doubleunit_y=0; doublez=0; if(m_mousePos.x()!=0||m_mousePos.y()!=0) { unit_x=m_mousePos.x()/qSqrt(m_mousePos.x()*m_mousePos.x()+m_mousePos.y()*m_mousePos.y()); unit_y=m_mousePos.y()/qSqrt(m_mousePos.x()*m_mousePos.x()+m_mousePos.y()*m_mousePos.y()); z=qSqrt(m_mousePos.x()*m_mousePos.x()+m_mousePos.y()*m_mousePos.y())/qSqrt(width()*width()/4+height()*height()/4); } Matrix3dM_Z; if(unit_x==0&&unit_y==0) M_Z<<1,0,0, 0,1,0, 0,0,1; else M_Z<以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。