Wygląda na to, że chcesz utrzymać prędkość obiektu na stałym poziomie na całej krzywej - znajomość długości łuku nie pomoże ci tego zrobić. Pomoże ci obliczyć, o której godzinie obiekt osiągnie punkt końcowy, gdyby jechał z tą prędkością, więc będzie lepszy niż to, co masz teraz (obiekt będzie miał taką samą średnią prędkość między wszystkimi punktami), ale rzeczywista prędkość obiektu będzie się nadal zmieniać w miarę przesuwania się po krzywej.
Lepszym rozwiązaniem byłaby zmiana naszego parametru parametrycznego (parametru, który zmienia się z 0 na 1, który wywołam, s
aby uniknąć pomyłki t = time
) ze zmienną szybkością ds/dt
, która zależy od prędkości, z jaką obiekt ma się poruszać ten punkt na krzywej. Innymi słowy, zamiast zmieniać s
o 0,01 każdej klatki, możemy ją zmienić o 0,005 jednej klatki, 0,02 następnej itd.
Robimy to, obliczając pochodne x
( dx/ds
) i y
( dy/ds
) każdej klatki, a następnie ustawiając
ds / dt = prędkość / sqrt ((dx / ds) 2 + (dy / ds) 2 )
Oznacza to, że biorąc prędkość, którą chcemy iść, i dzieląc przez prędkość, którą faktycznie byśmy osiągali, gdybyśmy zmieniali s
się z ustalonym przyrostem.
Dowód
Chcemy, aby prędkość naszego obiektu była stała; nazwijmy tę stałą nazwą speed
.
Uczymy się w drugim roku nazębnego, że dla równań parametrycznych x(s)
i y(s)
,
prędkość = sqrt ((dx / dt) 2 + (dy / dt) 2 )
Uczymy się również tego
dx / dt = dx / ds * ds / dt (reguła łańcuchowa)
A zatem,
prędkość = sqrt ((dx / ds) 2 (ds / dt) 2 + (dy / ds) 2 (ds / dt) 2 )
Rozwiązując ds/dt
, otrzymujemy podane równanie.
Obliczanie pochodnych
Nigdy nie pracowałem z tymi szczególnymi splajnami, ale rozumiem, że one po prostu dają x(s)
i y(s)
jeśli chodzi o równania sześcienne z s
. W ten sposób możemy łatwo znaleźć pochodną dx/ds
: if
x (s) = a * s 3 + b * s 2 + c * s + e
następnie
dx / ds = 3a * s 2 + 2b * s + c
(To samo dotyczy dy/ds
) Oczywiście, trzeba znać dokładne wartości a
, b
i c
to zrobić. Zgodnie z tą stroną wartości te można łatwo znaleźć.
Wreszcie, aby odpowiedzieć na pytanie w tytule: znalezienie równania długości łuku funkcji parametrycznej wymaga rozwiązania dość skomplikowanej całki oznaczonej ; nawet w prostym przypadku równania sześciennego nie można tego zasadniczo zrobić.
Zatem będziesz musiał oszacować całkę numerycznie . „Cięcie splajnu na 10 linii prostych i sumowanie ich długości”, jak sugerujesz, jest bardzo prostym sposobem na zrobienie tego ; istnieją jednak nieco bardziej skomplikowane metody, które zapewnią znacznie dokładniejsze wyniki przy użyciu mniejszej liczby segmentów linii.