欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用qt画3d圆柱

程序员文章站 2022-07-13 08:28:32
...

qwidget是在2d坐标第中,要画3d的就要将3d图抽象到2d坐标中来。当一个3d圆柱放到平面坐标中,如果柱面方向和眼睛水平,则是一个矩形

,如果柱面和眼睛方向水平则是一个圆,如柱面方向和眼睛垂直并绕x轴旋转一定角度,那么就是两个个椭圆,且底面椭圆不能完全看见。

这里为了是圆柱圆更像圆柱面,我画的是最后一种。

我们可以理解为有两个椭圆,底面一个,顶面一个,底面的椭圆圆心理论上是和顶面的x坐标是相等的,y坐标的话底面要靠下一些;柱面底面颜色看不到

,顶面颜色可以设置画刷一次性填充,那么中间的柱面颜色咋办呢?其实细心思考可以发现,在二维平面中中间柱面仍是底面圆的范围内,这样就好办了,

先画底面椭圆用一种颜色填充,再画顶面椭圆用一种颜色填充,这样覆盖的部分就是顶面,没被覆盖的底面圆部分就是中间柱面了。

用qt画3d圆柱

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.save();
    //设置反锯齿
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::Qt4CompatiblePainting);
    QRect drawRect = event->rect().adjusted(60,60,-60,-60);
    drawRect.moveTop(drawRect.top() + 10);
    
    QRadialGradient rg(drawRect.center(),drawRect.width()/2);
    rg.setColorAt(1,QColor(Qt::red).lighter());
    rg.setColorAt(0,QColor(Qt::red).dark(150));
    painter.setBrush(rg);
    painter.drawEllipse(drawRect);
    
    drawRect.moveTop( drawRect.top() - 10);
    
    rg.setCenter(drawRect.center());
    rg.setRadius(drawRect.width()/2);
    rg.setColorAt(1,QColor(Qt::white).lighter());
    rg.setColorAt(0,QColor(Qt::red));
    painter.setPen(Qt::NoPen);
    painter.setBrush(rg);
    painter.drawEllipse(drawRect);
    
    event->accept();
    painter.restore();
}