- 準備畫布局劲,填充畫布顏色為白色
//頭文件中
private:
Ui::Widget *ui;
QImage image;
QString line;
//實現(xiàn)文件中
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();
//實現(xiàn)
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);
}
- 描點屈藐,把點存儲在隊列中
<font color=pink>描點時,橫坐標根據(jù)你所給的表達式給出熙尉,比如如果是對數(shù)函數(shù)联逻,從0.1開始往后給出10個左右橫坐標〖焯担縱坐標需要根據(jù)表達式計算包归,我們只需要把表達式里面的x換成具體的值,就可以計算出縱坐標铅歼。</font>
QList<QPointF>points=creatPoints(line); //creatPoints()是一個函數(shù)公壤,
返回需要的數(shù)據(jù)點,line就是輸入的表達式椎椰。
//具體實現(xiàn)還有怎么計算數(shù)據(jù)點有些復雜厦幅,這里略過,若想嘗試的話慨飘,可以自己自定義一些數(shù)據(jù)點确憨。
4.根據(jù)所給點繪制曲線
這里要用到QPainterPath類译荞,顧名思義,它可以根據(jù)你所給的點休弃,一段一段的繪制曲線吞歼。
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); //這個函數(shù)就是用來繪制曲線的。
//第一個參數(shù)和第二個參數(shù)都是控制點(百度貝賽爾曲線)
//第三個參數(shù)endpoint塔猾,是這小段曲線的終點
//起點是按照你的隊列順序的前一個節(jié)點
//這里將c1和c2設置成一樣的是因為這小段曲線凹凸性是一樣的篙骡。
}
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing,true); //防鋸齒
painter.setPen(QPen(Qt::black,10));
painter.translate(450,450);
painter.drawPath(path);
這樣大致思路就出來了。
如果覺得這個圖像還過得去想要源碼的可以留言(^U^)ノ~YO