Подскажите каким образом построить ГЛАДКУЮ кривую по заданным точкам?
Пробовал QPainterPath::quadTo(), но кривая не достаточно гладкая, в силу того, что она проходит через каждую точку. Как добиться большой гладкости? кол-во точек в пределах 100 штук, чем больше тем точнее, длина кривой может быть как несколько пикселей, так и несколько сотен пикселей.
За основу построения кривой был взят алгоритм отсюда
Грубо говоря нужно чтобы кривая описывала поведения, но не обязательно проходила через каждую точку, вот пример от руки нарисовал:
UPD1: Гладкость нарушается при переводе из дробных координат в целые пиксели. На картинке я выделил точки некоторые участки где нарушена гладкость. Таким образом я и подумал, что нужно чтобы кривая не обязательно проходила через точку. Построение происходит от точки к точке через quadTo(), используя алгоритм приведенный по ссылке.
UPD2:
Вот пример набора точек по которым строится кривая
Нужно точно сформулировать критерии. Если проходить не обязана, то сглаживающие сплайны подойдут, но они могут вообще ни через одну точку не пройти.
Вообще сплайны обычно обеспечивают гладкость сопряжения участков кривой - соседние сплайны согласованы по значению (неразрывность), по наклону (гладкость первого порядка), возможно - по кривизне - гладкость второго порядка
Раз точек слишком много, то полилинию можно в начале упростить с помощью алгоритма Дугласа-Пекера, потом через оставшиеся точки провести плавную кривую
Вот один из простых (с минимумом расчётов) методов построения гладко сопряжённых кубических кривых Безье
С учётом добавлений:
Даны две точки на поверхности сферы, между ними нужно нарисовать ортодромию, дугу большого круга.
Промежуточные точки этой дуги можно рассчитать с нужным шагом с помощью геобиблиотек или с использованием простых формул отсюда (раздел bearing-intermediate point). Ортодромия при изображении в любой проекции будет плавной, поэтому много точек не нужно.
Полученные точки (lat/lon) нужно перевести в пространство отображаемой карты (x,y)
Через полученные точки на плоскости нужно провести плавную кривую. Можно воспользоваться вышеописанным методом для кубических кривых или упомянутым автором методом для квадратичных - но только в том случае, если он обеспечивает плавное сопряжение, чего я навскидку не увидел.
Рассчитанные кривые отрисовываются с помощью графических примитивов (для кубических это cubicTo
)
Если вы пишете программу под Windows, то там есть встроенная поддержка сплайнов и кривых Безье. Сплайны: DrawCurve, кривые Безье: Bezier Splines, метод DrawBeziers.
Зачем что-то изобретать когда qt умеет рисовать сглаженные граффики.
Уменьшайте количество точек в апроксимированном наборе и получится аккуратная кривая. Там же есть поддержка Antialiasing.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Надо сравнить лексемы вводимого текста с лексемами из текстового файла и выводить следующую строку от найденной лексемыНо не удаётся вывести
помогите мне отсортировать список по имени, я понятия не имею как его нормально отсортировать
Столкнулся с такой задачей как сделать форму, на которой, например, есть два виджета LineEdit и виджет карты (я взял QWebWidget и открыл в нем ЯндексКарты)