qt中画出漂亮的函数曲线
- 准备画布,填充画布颜色为白色
//头文件中 private: Ui::Widget *ui; QImage image; QString line; //实现文件中 Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { line=""; ui->setupUi(this); image=QImage(1200,1200,QImage::Format_RGB32); QColor backColor=qRgb(255,255,255); image.fill(backColor); }
- 准备画家,先画出坐标轴
public: explicit Widget(QWidget *parent = nullptr); void Paint(); void Connext(); //实现 void Widget::Paint() { QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing,true); int pointx=450,pointy=450; int width=800,height=800; painter.drawRect(5,5,1200-10,1200-10); painter.drawLine(pointx-width/2+50,pointy,pointx+width/2+100,pointy); painter.drawLine(pointx,pointy-height/2,pointx,pointy+height/2); }
- 描点,把点存储在队列中
描点时,横坐标根据你所给的表达式给出,比如如果是对数函数,从0.1开始往后给出10个左右横坐标。纵坐标需要根据表达式计算,我们只需要把表达式里面的x换成具体的值,就可以计算出纵坐标。
QList<QPointF>points=creatPoints(line); //creatPoints()是一个函数, 返回需要的数据点,line就是输入的表达式。 //具体实现还有怎么计算数据点有些复杂,这里略过,若想尝试的话,可以自己自定义一些数据点。
4.根据所给点绘制曲线 这里要用到QPainterPath类,顾名思义,它可以根据你所给的点,一段一段的绘制曲线。
QList<QPointF>points=creatPoints(line); QPainterPath path(points[0]); for(int i=0;i<points.size()-1;++i) { QPointF sp=points[i]; QPointF ep=points[i+1]; QPointF c1=QPointF((sp.x()+ep.x())/2,(sp.y()+ep.y())/2); QPointF c2=c2; path.cubicTo(c1,c2,ep); //这个函数就是用来绘制曲线的。 //第一个参数和第二个参数都是控制点(百度贝赛尔曲线) //第三个参数endpoint,是这小段曲线的终点 //起点是按照你的队列顺序的前一个节点 //这里将c1和c2设置成一样的是因为这小段曲线凹凸性是一样的。 } QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing,true); //防锯齿 painter.setPen(QPen(Qt::black,10)); painter.translate(450,450); painter.drawPath(path);
这样大致思路就出来了。