Interpolacja splajnowa biblioteka c++

Interpolacja splajnowa biblioteka c++
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:5 minut
  • Postów:2102
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


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
BG
  • Rejestracja:prawie 6 lat
  • Ostatnio:7 dni
  • Postów:289
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 17 godzin
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…

edytowany 1x, ostatnio: Azarien
Marius.Maximus
std::lerp , może sie przydać w przyszłości
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:5 minut
  • Postów:2102
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


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
BG
A jesteś pewien, że spline to właściwy sposób interpolacji Twoich danych ? Badasz jakies konkretne zjawisko i masz zaszumione pomiary czy to coś innego ?
SP
SP
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:181
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.


Knowledge Distiller
edytowany 1x, ostatnio: Szalony Programista2
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:5 minut
  • Postów:2102
0

Mam 4 punkty:

Kopiuj
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


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 1x, ostatnio: Marius.Maximus
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
0

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

screenshot-20220619154658.png


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
SP
SP
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:181
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.


Knowledge Distiller
edytowany 1x, ostatnio: Szalony Programista2
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:3 minuty
  • Postów:8423
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?


several
  • Rejestracja:prawie 16 lat
  • Ostatnio:3 minuty
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/


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.