根据鼠标移动,画线,注意设置pen
pen的构造函数里可以一次性传完,为了方便测试,代码分开写了。
tps就是最终曲化后的点,把所有点连起来就得到结果了。
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就是最终曲化后的点,把所有点连起来就得到结果了。