W takim razie
public V3D P(double t) { return A + 3 * t * (B - A) + 3 * t * t * (C - 2 * B + A) + t * t * t * (D - 3 * C + 3 * B - A); }
Wózek jedzie po krzywej, t zmienia się od 0 do 1, masz kolejne P o współrzędnych leżących na krzywej. Oczywiście możesz sobie wyskalować P dowolnie, np w metrach, jak policzysz długość krzywej z wzoru z linka, który wkleiłem (dodałem) w poprzedniej odpowiedzi.
Oczywiście punkty B i C są tutaj bezwzględne, nie jak w SCN, w odniesieniu do A i D.
W kodzie rysującym mapkę mam:
PointF a, b, c, d;
a = t.Point1; b = t.Point1 + t.CVec1; c = t.Point2 + t.CVec2; d = t.Point2;
Zamiast typu double można używać float, testowałem różnice wydajności pomiędzy tymi dwoma i są niezauważalne, nawet przy dużych sceneriach.
Dodano: 28 Marca 2015, 09:32:15
Tak na marginesie - do celów innych niż edycja scenerii wygodniej byłoby przeliczyć wszystkie Beziery 2-go stopnia do krzywych 1-go stopnia (albo i nawet eliptycznych czy innych o których wspominał Ra) i wtedy obliczenia nam się bardzo uproszczą. Samo przeliczenie jest proste i szybkie, można je wykonać na etapie samego ładowania danych.
W sumie tak sobie pomyślałem że faktycznie, do naszych celów powinniśmy unikać algorytmów i wzorów iteracyjnych bo raz, są koszmarnie wolne, dwa, komplikują niepotrzebnie kod, trzy - w projektach torów czy dróg są doskonale zbędne.
Bezierów używa się raczej w grafice, gdzie potrzebujemy odwzorowania bardzo dowolnych kształtów i krzywizn, przy torach nie ma tej dowolności, chyba, że chcemy odwzorować bardzo pogięty odkształcony tor, ale wydaje mi się, że to się raczej inaczej robi (nie znam na tyle budowy symka).
W sumie nie zgłębiałem konwersji do łuków elips, być może to byłoby optymalne rozwiązanie?
Dodano: 28 Marca 2015, 09:46:02
@Ra:
Dlaczego w symku są używane krzywe Beziera 2-go stopnia? Czy przypadkiem nie dlatego, że silnik graficzny ma dla nich wbudowane wsparcie? Bo jeśli tak, to może można by zrobić taki myk: w sceneriach zmienić typ krzywych na eliptyczne (łuki okręgów) i przejściowe, natomiast do rysowania robić konwersję do Bezierów? To mogłoby nieco odchudzić i uprościć pliki z torami, uprościć i przyśpieszyć obliczenia typu znajdowanie długości czy punktów.
Ogólnie cała zabawa wymagałaby tylko trochę dodatkowego RAM-u - trzymasz w pamięci 2 mapy torów - graficzną (do rysowania) i topograficzną (dla obliczeń). Jeśli istnieje proste przekształcenie każdego odcinka toru w odpowiadający odcinek innego typu to gra mogłaby być warta świeczki.
W swoim edytorze mam to trochę podobnie rozwiązane. Jest źródłowa wersja mapy i wersja do rysowania. Aktualnie obie używają tych samych typów krzywych, co wynika właśnie ze wsparcia silnika graficznego. Ale grafika swoją drogą, a obliczenia swoją. Fajnie by było, gdyby mapa była bardziej modelem teoretycznym, a nie tak jak teraz - bardziej plikiem graficznym.