В QwtSpline есть два разных типа сплайнов, но я не вижу разницы между этими двумя типами.
Я нашел изображение, которое объясняет мою проблему:
QwtSpline всегда создает сплайн, как на левой стороне изображения.
Но я хочу иметь сплайн, такой как тот, на правой стороне.
Мой код следующий:
QwtSpline spline;
QPolygonF polygon;
QVector<QPointF> result;
polygon.append(startPoint);
polygon.append(rotatedPoint);
polygon.append(endPoint);
spline.setPoints(polygon);
for(double i = startPoint.rx(); i < endPoint.rx(); i++)
{
result << QPointF(i, spline.value(i));
}
result << QPointF(endPoint.rx(), spline.value(endPoint.rx()));
То, что я хочу сделать, это нарисовать сплайн, подобный этому, на правой стороне изображения в QwtPlot. Может быть, есть более простой способ решения моей проблемы, чем создание итерации QwtSpline через ее создание QwtCurve с каждой точкой на QwtSpline.
Если это проще, нарисовать кривую Безье в QwtPlot, это не проблема, для меня будет проще кривая Безье. Я взял только сплайн, потому что я не нашел кривую Безье в Qwt.
Попробуйте Qwt из одной из ветвей> = 6.2. Он имеет совершенно новую реализацию нескольких алгоритмов сплайн-интерполяции.
Но если речь идет только о рисовании кривой Безье, вы также можете использовать QwtShapeItem, то есть отображение QPainterPath. Конечно, вы также можете использовать QPainterPath для создания QPolygon из вашей кривой Безье, а затем использовать QwtPlotCurve.
Хорошо, ребята, потому что вам не понравился мой ответ, я постараюсь объяснить, как рассчитать кривую Безье:
Я думаю, что самый простой способ — использовать представление кривых Бернштейна-Безье.
Чтобы сделать это, вы должны выяснить полиномы Бернштейна. Это не сложно. Существует формуляр для этого
n это количество точек вашей кривой и
я на самом деле точка.
Это значит, что у вас столько многочлен Бернштейна, сколько у вас очков.
Если вы знаете каждый полином Бернштейна, вы можете использовать следующую формулу для вычисления кривой.
n — общее количество баллов и
я индекс текущей точки.
P — это точка, а t всегда проходит от 0 до 1. 0 — это положение слева, а 1 — положение справа. r — новая точка кривой.
Теперь у вас есть два вычисления формул выше для x и y.
Это формула для х
Это формула для вас
Как видите, единственный переменный параметр справа — это t. Это означает, что вам нужно вычислять эту формулу много раз с t между 0 и 1. Самый простой способ сделать это — написать цикл for, подобный этому:
QList<QPointF> results = QList<QPointF>();
QList<QPointF> points = QList<QPointF>();
for(double i = 0; i <= 1; i+=0.01)
{
double x = //formular for rx
double y = //formular for ry
results << QPointF(x, y);
}
Надеюсь, это было не сложно. Если вы не поняли это краткое объяснение, вы можете посмотреть «Математический справочник». В шестом издании его на сайте от 1000 до 1001.
ISBN: 978-3-662-46220-1