QPointF MainWindow::CatmulRom(QPointF &p1, QPointF &p2, QPointF &p3, QPointF &p4, double &t){ return 0.5*(-t*(1-t)*(1-t)*p1+(2-5*t*t+3*t*t*t)*p2+t*(1+4*t-3*t*t)*p3-t*t*(1-t)*p4);}void MainWindow::paintEvent(QPaintEvent *e){ QPainter painter(this); QPointF p1(50,50), p2(100,80), p3(150,50), p4(200,100), p5(250,50), p6(300,100); painter.setPen(QPen(QBrush(Qt::red),5)); painter.drawPoint(p1); painter.drawPoint(p2); painter.drawPoint(p3); painter.drawPoint(p4); painter.drawPoint(p5); painter.drawPoint(p6); double tStart=0, tFinish=0; int stepCount = 5; for(int i=0; i<stepCount; ++i) { tStart = tFinish; tFinish += 1.0/stepCount; painter.setPen(Qt::green); //сегмент рассчитывается на участке между 2-х внутренних точек painter.drawLine(CatmulRom(p1,p1,p2,p3,tStart), CatmulRom(p1,p1,p2,p3,tFinish)); //дублирование первой точки для построения первого сегмента p1-p2 painter.drawLine(CatmulRom(p1,p2,p3,p4,tStart), CatmulRom(p1,p2,p3,p4,tFinish)); //p2-p3 painter.drawLine(CatmulRom(p2,p3,p4,p5,tStart), CatmulRom(p2,p3,p4,p5,tFinish)); //p3-p4 painter.drawLine(CatmulRom(p3,p4,p5,p6,tStart), CatmulRom(p3,p4,p5,p6,tFinish)); //p4-p5 painter.drawLine(CatmulRom(p4,p5,p6,p6,tStart), CatmulRom(p4,p5,p6,p6,tFinish)); //дублирование последней точки для построения последнего сегмента p5-p6 }}