在窗口画线,有曲线平滑功能

根据鼠标移动,画线,注意设置pen

QPen pq(Qt::black, 5);
    pq.setCapStyle(Qt::PenCapStyle::RoundCap);
    pq.setJoinStyle(Qt::PenJoinStyle::RoundJoin);
    pt.setPen(pq);

pen的构造函数里可以一次性传完,为了方便测试,代码分开写了。

监听鼠标点,然后根据鼠标点画线,

在画之前会进行一个曲线 平滑的操作,算法方面用了现成的:catmull

直接贴代码吧

 int num = 20;
     QVector<QPointF> tps;
     int size = tem_points.size();
     if(size < 4) return;
     QPointF p0, p1, p2, p3;
     float t, t2, t3, a, b, c, d;
     float x, y;
     for(int i = 0; i < size -4; i+=3){
        p0 = tem_points.at(i);
        p1 = tem_points.at(i+1);
        p2 = tem_points.at(i+2);
        p3 = tem_points.at(i+3);

        cout << a << "-" << b << "-"<< c << "-" << d <<endl;
        for(int j = 1; j< num; ++j){
            t = ((float)j)/num;
            t2 = t*t;
            t3 = t2*t;
            a = (-1*t3 + 2*t2 -t)*0.5f;
            b = (3*t3 - 5*t2 + 2) * 0.5f;
            c = (-3*t3 + 4*t2 + t) * 0.5f;
            d = (t3 - t2)*0.5f;
            x = a * p0.x() + b * p1.x() + c * p2.x() + d * p3.x();
            y = a * p0.y() + b * p1.y() + c * p2.y() + d * p3.y();
           // cout << "x: " << x << "Y: " << y <<endl;
            tps.append(QPointF(x, y));
        }
     }

tps就是最终曲化后的点,把所有点连起来就得到结果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值