Как создать B-Spline с помощью QwtSpline

В QwtSpline есть два разных типа сплайнов, но я не вижу разницы между этими двумя типами.

Я нашел изображение, которое объясняет мою проблему:
& Quot; изображения / x3cVJ.jpg & Quot;

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.

1

Решение

Попробуйте Qwt из одной из ветвей> = 6.2. Он имеет совершенно новую реализацию нескольких алгоритмов сплайн-интерполяции.

Но если речь идет только о рисовании кривой Безье, вы также можете использовать QwtShapeItem, то есть отображение QPainterPath. Конечно, вы также можете использовать QPainterPath для создания QPolygon из вашей кривой Безье, а затем использовать QwtPlotCurve.

0

Другие решения

Хорошо, ребята, потому что вам не понравился мой ответ, я постараюсь объяснить, как рассчитать кривую Безье:

Я думаю, что самый простой способ — использовать представление кривых Бернштейна-Безье.

Чтобы сделать это, вы должны выяснить полиномы Бернштейна. Это не сложно. Существует формуляр для этоговведите описание изображения здесь

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

0