用qt画3d圆柱

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

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

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

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

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

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


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();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值