Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

SVG, krzywe beziera, wielomian

30 Mar 2007 21:02 1768 3
  • Poziom 16  
    Witam,
    Chodzi mi o to, w jaki sposób przekształcić wielomian na punkty, którymi "buduje się" krzywą beziera w formacie SVG, czy też wielu innych formatach opartych na krzywych składających się z 2 punktów końcowych i 2 punktów kontrolnych. żeby wyrazić się jasno chcę np.
    narysować krzywą, która ma kształt łuku y = x^2 w przedziale <0;3>

    Pozdrawiam
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 28  
    No cóż nikt nie dawał gwarancji, że jednym segmentem da się przybliżyć dowolną krzywą.
    W Wikipedii zdefiniowane są wzory.
    Niestety w postaci parametrycznej. Ale trudno się spodziewać czegoś innego przy tych zastosowaniach.
    Mój pierwszy pomysł to:
    - przeskalowanie Twojego wzorku z przedziału <0,3> na przedział <0,1>
    [x(t)=3*t; y(t)=9*t^2]
    {UWAGA to jedna z wielu możliwych parametryzacji}
    i następnie sprawdzić czy da się to pogodzić z wzorkami na krzywą.
    Nawet jeśli dla paru punktów się zgodzi to nalewży sprawdzić "spowrotem" czy wzór otrzymany z wyliczonych punktów się pokrywa.
    Ja, przynajmiej bez używania papieru nie widzę teoretycznego dowodu na to że każdy wielomian stopnia <4 jest dokładnie odtwarzany segmentem krzywej Bezier'a.
  • Poziom 16  
    Hmm, ale które z tych liczb są teraz punktami kontrolnymi krzywej ?
  • Poziom 28  
    Wybacz, rachunków nie przeprowadziłem.
    Przedstawiłem (jeden z możliwych) pomysłów obliczenia, bez gwarancji że rozwiazanie istnieje (ale wydaje mi się że istnieje).
    Jak już rozwiążesz to powinieneś rozpoznać odpowiednie liczby.

    -------------------------------------
    a jednak policzyłem nieco
    ------------------------------------

    No niestety, ta parametryzacja się nie nada.
    Potrzebne są 4 punkty P0, P1, P2, P3
    z warunków zadania P0=(0,0), P3=(3,9)

    Wzór podstawowy:
    B(t)=P0*(1-t)^3+P1*t*(1-t)^2+P2*t^2*(1-t)+P3*t^3
    dla t z przedziału <0,1>
    Przy podanych punktach i wybranej parametryzacji wychodzi (dla współrzędnej X:
    x(t)=3*x1*t*(1-t)^2+3*x2*t^2*(1-t)+9*t^3
    to z wzoru z podstawionymi punktami
    a z założonej parametryzacji
    x(t)=3*t
    Porównując to stronami i rozwiązując dla kolejnych potęg parametru t dostajemy niestety sprzeczność.
    Być może istnieje lepsza parametryzacja, choć teraz już nie sądzę.

    Pozostaje metoda dopasowania parametrów do zadanej krzywej.
    Ale to też kjest uzależnione od wybranej parametryzacji krzywej.
    Niestety nadal nie mam pomysłu na "najlepszy" wybór parametryzacji.

    Szukać należy takiego zestawu x1, y1, x2, y2 który daje najmniejsze odchylenia od przebiegu krzywej sparametryzowanej.
    Czyli dzieląc na współrzędne:
    Xp(t)-x0*(1-t)^3+x1*t*(1-t)^2+x2*t^2*(1-t)+x3*t^3
    Yp(t)-y0*(1-t)^3+y1*t*(1-t)^2+y2*t^2*(1-t)+y3*t^3
    takie dwa wielomiany winny mieć jaknajmniejszą normę (na przedziale 0,1).
    W tych wzorach: Xp(t), Yp(t) - parametryzacje krzywej;
    x0,y0,x3,y3 - stałe, współrzędne końców krzywej
    Standardowy sposób postępowania to podniesienie danego wzoru do kwadratu, wyliczenie pochodnej i przyrównanie do zera.
    Stąd powinno się dać wyznaczyć odpowiednio dla każdego równania pary x1,x2 i y1,y2.