Как создать B-Spline с помощью QwtSpline - PullRequest
0 голосов
/ 24 августа 2018

В 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.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

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

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

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

n - количество точек вашей кривой и я на самом деле точка.

Это значит, что у вас столько многочлен Бернштейна, сколько у вас очков.

Если вы знаете каждый полином Бернштейна, вы можете использовать следующую формулу для вычисления кривой. enter image description here

n - общее количество очков и i - индекс текущей точки.

P - это точка, а t всегда проходит от 0 до 1. 0 - это позиция слева, а 1 - позиция справа. r - новая точка кривой.

Теперь у вас есть два, вычислите формулу выше для x и y.

Это формула для х

enter image description here

Это формула для у

enter image description here

Как видите, единственный переменный параметр справа - это 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 голосов
/ 25 августа 2018

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

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

...