Interpolacja splajnowa biblioteka c++

0

Znalazłem interesujący projekt https://kluge.in-chemnitz.de/opensource/spline/
ale licencja jest kiepska do komercyjnego projektu

Może jakaś inna biblioteka która potrafi interpolować za pomocą "spline" https://en.wikipedia.org/wiki/Spline_(mathematics)

wykres:
image

0

Czy nie wystarczy Béziera?
https://pl.wikipedia.org/wiki/Krzywa_B%C3%A9ziera
(tym bardziej że się liczy o wiele szybciej).

1
_13th_Dragon napisał(a):

(tym bardziej że się liczy o wiele szybciej).

Rysowanie krzywej Béziera jest banalne (kilka zagnieżdżonych lerpów), ale jeżeli chcemy mieć płynny ruch po krzywej (albo równomiernie rozstawione punkty na krzywej) to w grę wchodzą równania różniczkowe albo hakierskie aproksymacje…

0

Zainteresowanie "spline" było dość przypadkowe ;)
Użyłem QSplineSeries do narysowania serii danych,
potem zainteresowałem sie problemem: jak interpolować jak na tym wykresie
potem zastanowiło mnie co to za rodzaj wykresu ,
i translator odpowiedział że polska nazwa to "wykres splajnowy" , i tym sposobem poznałem nowe słowo :D

Co do krzywej Béziera to na razie nie wiem jak to zrobić , eigen juz mam w projekcie

0

Te krzywe się robi dość prosto tak na logikę intuicję to masz 3 punkty, robisz funkcję liniową między pierwszym i drugim, drugim i trzecim i trzecią funkcję między funkcją pierwszą i drugą i wychodzi taki zwariowany kształt.
I oczywiście renderujesz ostatnią funkcję, te wcześniejsze są potrzebne do liniowej ekstrapolacji punktów, które będą wykorzystane do kolejnych funkcji.

Możesz ciągnąć to dalej z większą ilością punktów.

0

Mam 4 punkty:

std::vector<QPointF> points = {
        QPointF(1,1),
        QPointF(2,3),
        QPointF(3,2),
        QPointF(4,6),
        };

I wykres liniowy wyglada tak:

image

A chciałbym wyznaczyć wartość Y dla dowolnego X
(na obrazku kropka znaku zapytania)
Przy założeniu ze pomiedzy punktami nie sa proste linie tylko "łuki"
image

Jak narysuje krzywa Bezier-a przez moje 4 punkty to mam coś takiego
screenshot-20220618142510.png
wiec raczej coś robię źle chcąc użyć Bezier

Badając temat trafiłem jeszcze na Centripetal Catmull–Rom spline

Moje eksperymenty https://github.com/mariuszmaximus/cpp-spline

0

Jak chcesz aby przechodziła przez zadane punkty to potrzebujesz https://pl.wikipedia.org/wiki/Krzywa_B-sklejana

screenshot-20220619154658.png

0

Dobra to co ja powiedziałem to był wzór na krzywe beziera.
Ten drugi obrazek to jest interpolacje cubikowaa w pierwszym wymiarze.
W pythonie wpisujesz interpolation.1dinterp(x,y kind="cubic")
W c++ jak nie masz biblioetki będizesz musiał polynomiala obliczyć jak masz 10 punktów to conajmniej +1 więcej.
Nie jestem pewien bo zawsze z bibliotek korzystam, ale polynomial będzie najławtiejszy, bezierem tego nie robisz, bo będziesz musiał optymalizacje robić teoretycznie się uda, ale praktycznie zmarnunuejsz 10-100 razy więcej mocy procesora, ale pójdzie. Bezierem tego nie zrobisz bo to mega trudny problem optymalizacyjny, ale jest to do wykonainia.

0

czy konieczny jest wpływ na ileś punktów naraz? Że jak ruszasz w jednym miejscu, to wpływa to na to, co się dzieje z ileś kropek dalej?

0

Nie czytałem wątku i nie doradzę biblioteki. W moim projekcie, jeśli wierzyć komentarzom, mamy własną implementację bazującą na niżej zalinkowanych zasobach

https://www.physicsforums.com/threads/cubic-spline-interpolation-tutorial.178945/
https://www.physicsforums.com/attachments/cubic-spline-tutorial-pdf.10531/
https://www.physicsforums.com/attachments/parametric-spline-tutorialv2-pdf.12898/

1 użytkowników online, w tym zalogowanych: 0, gości: 1