Zobacz także: to samo pytanie na Math.SE
Jak znaleźć długość łuku krzywej Beziera? Na przykład liniowa krzywa Beziera ma długość:
length = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
Ale co z kwadratowymi, sześciennymi lub n-stopniowymi krzywymi Beziera?
(Moim celem było wcześniejsze oszacowanie rozdzielczości próbkowania, więc nie muszę tracić czasu na sprawdzanie, czy następny punkt dotyka poprzedniego punktu.)
mathematics
graphics
beziers
heuristics
Mateen Ulhaq
źródło
źródło
Odpowiedzi:
Prostym sposobem na sześcienne Beziers jest podzielenie krzywej na N segmentów i zsumowanie długości segmentów.
Jednak gdy tylko potrzebujesz długości tylko części krzywej (np. Do 30% długości wzdłuż), rozpocznie się parametryzacja długości łuku . Na jedno z moich własnych pytań na temat Béziersa zamieściłem dość długą odpowiedź , z prostym przykładowym kodem.
źródło
1.0/t
(wywoływanaresolution
), więc to jest dla „czasu rzeczywistego” (czyli co najwyżej 10 fps na wolnym NXT). Rysowana jest każda iteracjat += resolution
oraz nowy punkt / linia. W każdym razie dzięki za pomysł.Chociaż jestem z odpowiedziami, które już otrzymałeś, chcę dodać prosty, ale potężny mechanizm aproksymacji, którego możesz użyć dla krzywych Béziera o dowolnym stopniu: Ciągle dzielisz krzywą za pomocą podziału de Casteljau, aż do maksymalnej odległości punktów kontrolnych pod-krzywej do linii bazowej pod-krzywej jest poniżej pewnego stałego epsilon . W takim przypadku pod-krzywą można aproksymować za pomocą linii podstawowej.
W rzeczywistości uważam, że takie podejście jest zwykle stosowane, gdy podsystem graficzny musi narysować krzywą Béziera. Ale nie cytuj mnie na ten temat, w tej chwili nie mam pod ręką referencji.
W praktyce będzie to wyglądać tak: (z wyjątkiem tego, że język nie ma znaczenia)
źródło
Długości łuku dla krzywych Beziera są tylko zamknięte dla krzywych liniowych i kwadratowych. W przypadku sześciennych nie ma gwarancji posiadania zamkniętego rozwiązania. Powodem jest to, że długość łuku jest zdefiniowana przez całkę radykalną, dla której jest zamknięty tylko dla wielomianów drugiego stopnia.
Tylko w celach informacyjnych: Długość kwadratowego Beziera dla punktów (a, p) (b, q) i (c, r) wynosi
Gdzie LN jest logarytmem naturalnym, a ^ oznacza moc i root pierwiastek kwadratowy.
Dlatego przybliżenie łuku powinno być łatwiejsze i tańsze według innej reguły, takiej jak wielokąt lub schemat integracji, taki jak reguła Simpsona, ponieważ pierwiastki kwadratowe LN są kosztownymi operacjami.
źródło
Opracowałem wyrażenie długości w postaci zamkniętej dla 3-punktowego Beziera (poniżej). Nie próbowałem wypracować zamkniętego formularza dla 4+ punktów. Reprezentacja i obsługa najprawdopodobniej byłaby trudna lub skomplikowana. Jednak numeryczna technika aproksymacji, taka jak algorytm całkowania Runge-Kutta, działałaby całkiem dobrze, integrując przy użyciu wzoru długości łuku . Moje pytania i odpowiedzi na temat RK45 na MSE mogą pomóc w implementacji RK45.
Oto niektóre kodu Java dla długości łuku 3 pkt Beziera z punktów
a
,b
ic
.źródło