Zagadnienia

6. Elementy modelowania geometrycznego

6.1. Krzywe Béziera

6.1.1. Określenie krzywych Béziera

Nazwa ,,krzywa Béziera” stopnia n oznacza reprezentację krzywej parametrycznej w postaci ciągu punktów p0,,pn, tzw. punktów kontrolnych, które należy podstawić do wzoru

pt=i=0npiBint.

Występujące w nim funkcje Bin to wielomiany Bernsteina stopnia n, określone wzorem

Bint=niti1-tn-i.
Rys. 6.1. Krzywe Béziera stopni 2, 3, 4 i 5 (dla t0,1).

Powyższą reprezentację krzywych i stanowiąca jej rozwinięcie reprezentację płatów powierzchni we wczesnych latach tysiąc dziewięćset sześćdziesiątych opracowali niezależnie Pierre Bézier i Paul de Faget de Casteljau, na potrzeby firm Renault i Citroën. Dzięki swoim zaletom, takim jak łatwość interakcyjnego kształtowania i istnienie sprawnych algorytmów przetwarzania, reprezentacje te obecnie używane powszechnie nie tylko w inżynierskich systemach projektowania wspomaganego komputerem, ale także w wielu innych zastosowaniach graficznych (np. w projektowaniu czcionek).

6.1.2. Algorytm de Casteljau

Dla dowolnego tR punkt pt można obliczyć za pomocą algorytmu de Casteljau, realizowanego przez następujący podprogram:

{ pi0=pi dla i=0,,n.}
for j := 1 to n do
  for i := 0 to n-j do
    pij := 1-tpij-1+tpi+1j-1;
{ pt=p0n.}
Rys. 6.2. Algorytm de Casteljau.

Udowodnimy, że punkt pt jest punktem p0n obliczonym przez powyższą procedurę. Jeśli n=0, to krzywa jest zdegenerowana do jednego punktu, czyli pt=p0B00t=p0=p00, ponieważ B00t=1 dla każdego tR. Załóżmy, że n>0. Najpierw obliczymy

1-tB0n-1t=1-tn=B0nt,tBn-1n-1t=tn=Bnnt,

oraz dla i1,,n-1

1-tBin-1t+tBi-1n-1t=n-1iti1-tn-i+n-1i-1ti1-tn-i=Bint.

Następnie przyjmiemy założenie indukcyjne, że punkty p0n-1 i p1n-1 są odpowiadającymi danej wartości parametru t punktami krzywych Béziera stopnia n-1, reprezentowanych przez punkty kontrolne odpowiednio p0,,pn-1p1,,pn. Na podstawie pokazanego wyżej rekurencyjnego związku między wielomianami Bernsteina stopni n-1n, mamy

p0n=1-ti=0n-1piBin-1t+ti=1npiBi-1n-1t=
p01-tB0n-1t+i=1n-1pi1-tBin-1t+tBi-1n-1t+pntBn-1n-1t=
i=0npiBint.

Wielu podanych dalej własności krzywych Béziera i B-sklejanych dowodzi się w podobny sposób.

Algorytm de Casteljau ma oprócz obliczania punktów krzywej wiele innych zastosowań, o których będzie dalej.

6.1.3. Własności krzywych Béziera

Krzywe Béziera mają następujące własności:

  • Niezmienniczość afiniczna reprezentacji. Suma wielomianów Bernsteina stopnia n jest równa 1, a zatem dla dowolnego tR punkt pt jest kombinacją afiniczną punktów kontrolnych. Ponieważ przekształcenia afiniczna zachowują kombinacje afiniczne, więc dla ustalonego przekształcenia afinicznego f i dla każdego t odpowiedni punkt krzywej Béziera reprezentowanej przez punkty kontrolne fp0,,fpn jest równy fpt. Innymi słowy, aby otrzymać obraz krzywej Béziera w dowolnym przekształceniu afinicznym, wystarczy poddać temu przekształceniu jej punkty kontrolne.

  • Własność otoczki wypukłej. Dla t0,1 punkt pt jest kombinacją wypukłą punktów kontrolnych (wielomiany Bernsteina są w przedziale 0,1 nieujemne), a więc należy do otoczki wypukłej ich zbioru.

  • Zachodzi interpolacja skrajnych punktów kontrolnych:

    p0=p0,p1=pn.
  • Dla t0,1 krzywa Béziera nie ma z żadną prostą (na płaszczyźnie) albo płaszczyzną (w przestrzeni) większej liczby punktów przecięcia niż jej łamana kontrolna (to się nazywa własnością zmniejszania wariacji).

  • Istnieje możliwość podwyższenia stopnia, czyli znalezienia reprezentacji stopnia n+1. Związek obu reprezentacji wyraża się wzorami

    pt=i=0npiBint=i=0n+1piBin+1t,
    pi=in+1pi-1+n+1-in+1pi.
    Rys. 6.3. Podwyższenie stopnia krzywej Béziera.

    Podwyższanie stopnia możemy iterować, dostając reprezentacje coraz wyższych stopni. Ciąg łamanych kontrolnych otrzymanych w ten sposób zbiega jednostajnie do krzywej dla t0,1. Zbieżność tego ciągu jest jednak zbyt wolna, aby miała praktyczne znaczenie.

  • Jeśli kolejne punkty kontrolne leżą na prostej, w kolejności indeksów i w równych odstępach, to krzywa Béziera jest odcinkiem sparametryzowanym ze stałą prędkością. Najłatwiej jest udowodnić to rozpatrując reprezentację odcinka w postaci krzywej Béziera stopnia 1 i jego reprezentacje otrzymane przez podwyższanie stopnia.

  • Pochodna krzywej Béziera o punktach kontrolnych p0,,pn wyraża się wzorem

    pt=i=0n-1npi+1-piBin-1t=i=0n-1nΔpiBin-1t.

    Na podstawie własności otoczki wypukłej mamy więc własność hodografu, według której kierunek wektora pt dla t0,1 jest zawarty w stożku rozpiętym przez wektory ΔPi=pi+1-pi dla i=0,,n-1. Ponadto zachodzą równości p0=np1-p0 oraz p1=npn-pn-1.

    Rys. 6.4. Pochodna krzywej Béziera.
  • Podział krzywej. Punkty p00,,p0n oraz p0n,,pn0, otrzymane w trakcie wykonywania algorytmu de Casteljau, są punktami kontrolnymi tej samej krzywej, w innych parametryzacjach. Dokładniej, dla dowolnego sR zachodzą równości

    ps=i=0npiBins=i=0np0iBinst=i=0npin-iBins-t1-t.

    Aby narysować krzywą, możemy dzielić ją na ,,dostatecznie krótkie” łuki i rysować zamiast nich odcinki. Możemy użyć w tym celu procedury rekurencyjnej (porównaj ją z przedstawioną wcześniej procedurą rysowania elipsy):

    procedure r_Krzywa ( np );
    begin
      if dostatecznie blisko ( p0pn )
      then rysuj odcinek ( p0pn );
      else begin
        q0 := p0;
        for j := 1 to n do begin
          for i := 0 to n-j do
            pi := 12pi+pi+1;
          qj := p0
        end;
        r_Krzywa ( nq );
        r_Krzywa ( np )
      end
    end {r_Krzywa};

    Otoczka wypukła łamanej kontrolnej ,,całej” krzywej jest z reguły znacznie większa niż suma otoczek łamanych kontrolnych kilku jej fragmentów, a zatem przez podział możemy uzyskiwać znacznie dokładniejsze oszacowania położenia krzywej.

  • Algorytm szybkiego obliczania punktu pt (o koszcie On zamiast On2, jak w przypadku algorytmu de Casteljau) możemy uzyskać, adaptując schemat Hornera. Podstawiając s=1-t, otrzymujemy

    pt=p0n0sn+p1n1tsn-1++pn-1nn-1tn-1s+pnnntn=
    p0n0s+p1n1ts++pn-1nn-1tn-1s+pnnntn.

    Schemat Hornera ze względu na s trzeba tylko uzupełnić o obliczanie wektorów p0n0,p1n1t,,pnnntn. Ponieważ n0=1 i ni+1=n-ii+1ni, więc mamy stąd algorytm

    s := 1-t;
    p := p0;
    d := t;
    b := n;
    for i := 1 to n do begin
      p := sp+b*dpi;
      d := d*t;
      b := b*n-i/i+1
    end;
    { pt=p }

6.2. Krzywe B-sklejane

6.2.1. Określenie krzywych B-sklejanych

Modelowanie figur o skomplikowanym kształcie wymagałoby użycia krzywych Béziera wysokiego stopnia, co oprócz niewygody (z punktu widzenia użytkownika programu interakcyjnego) sprawiałoby różne kłopoty implementacyjne (bardzo duże wartości współczynników dwumianowych, wysoki koszt algorytmów obliczania punktu). Dlatego często stosuje się krzywe kawałkami wielomianowe w reprezentacji B-sklejanej; jest ona uogólnieniem reprezentacji Béziera krzywych wielomianowych.

Rys. 6.5. Porównanie krzywej Béziera z krzywą B-sklejaną.

Krzywa B-sklejana jest określona przez podanie: stopnia n, ciągu N+1 węzłów u0,,uN (ciąg ten powinien być niemalejący, a ponadto N powinno być większe od 2n), oraz N-n punktów kontrolnych d0,,dN-n-1. Wzór, który jest definicją krzywej B-sklejanej ma postać

st=i=0N-n-1diNint,tun,uN-n.

We wzorze tym występują funkcje B-sklejane Nin stopnia n, które są określone przez ustalony ciąg węzłów.

Istnieje kilka definicji funkcji B-sklejanych, które różnią się stopniem skomplikowania, a także trudnością dowodzenia na podstawie takiej definicji różnych własności tych funkcji (w zasadzie więc wychodzi na jedno, której definicji użyjemy, jeśli chcemy dowodzić twierdzenia, to trudności nie da się uniknąć). Ponieważ w tym wykładzie ograniczamy się do praktycznych aspektów zagadnienia, więc przytoczę rekurencyjny wzór Mansfielda-de Boora-Coxa, który w książkach o grafice chyba najczęściej pełni rolę definicji:

Ni0t=1 dla tui,ui+1,0 w przeciwnym razie, (6.1)
Nint=t-uiui+n-uiNin-1t+ui+n+1-tui+n+1-ui+1Ni+1n-1tdla n>0. (6.2)

Wzór ten jest uogólnieniem rozważanego wcześniej wzoru wiążącego wielomiany Bernsteina stopni n-1 i n.

6.2.2. Algorytm de Boora

Na podstawie wzoru Mansfielda-de Boora-Coxa łatwo jest otrzymać algorytm de Boora obliczania punktu st na podstawie danych opisujących krzywą s i parametru t. Algorytm ten jest uogólnieniem algorytmu de Casteljau i jest realizowany przez następujące instrukcje:

{ di0=di dla i=k-n,,k.}
k := N-n-1;
while t<uk do k := k-1;
r := 0;
while (r<nand (t=uk-r) do r := r+1;
for j := 1 to n-r do
  for i := k-n+j to k-r do begin
    αij := t-ui/ui+n+1-j-ui;
    dij := 1-αijdi-1j-1+αijdij-1
  end;
{ st=dk-rn-r }
Rys. 6.6. Algorytm de Boora.

6.2.3. Podstawowe własności krzywych B-sklejanych

Własności krzywych B-sklejanych najbardziej istotne w zastosowaniach związanych z grafiką komputerową, są takie:

  • Jeśli wszystkie węzły od un do uN-n są różne (tworzą ciąg rosnący), to krzywa składa się z N-2n łuków wielomianowych. W przeciwnym razie (jeśli występują tzw. węzły krotne), to liczba łuków jest mniejsza.

  • Algorytm de Boora dokonuje liniowej interpolacji kolejno otrzymywanych punktów (liczby αij należą do przedziału 0,1); stąd wynika silna własność otoczki wypukłej: wszystkie punkty łuku dla tuk,uk+1 leżą w otoczce wypukłej punktów dk-n,,dk. Mamy też afiniczną niezmienniczość tej reprezentacji krzywej; aby otrzymać jej obraz w dowolnym przekształceniu afinicznym, wystarczy zastosować to przekształcenie do punktów kontrolnych d0,,dN-n-1.

    Rys. 6.7. Silna własność otoczki wypukłej.
  • Lokalna kontrola kształtu. Ponieważ punkt st dla tuk,uk+1 zależy tylko od punktów dn-k,,dk, więc zmiana punktu di powoduje zmianę fragmentu krzywej dla tui,ui+n+1.

    Rys. 6.8. Lokalna kontrola kształtu.
  • Pochodna krzywej B-sklejanej stopnia n jest krzywą stopnia n-1:

    st=i=0N-n-2nui+n+1-ui+1di+1-diNi+1n-1t.

    Funkcje B-sklejane Nin-1 występujące w powyższym wzorze są określone dla tego samego ciągu węzłów, co funkcje Nin w określeniu krzywej s. Zastosowanie (silnej) własności otoczki wypukłej do pochodnej daje (silną) własność hodografu krzywych B-sklejanych.

    Rys. 6.9. Pochodna krzywej B-sklejanej.
  • W otoczeniu węzła o krotności r krzywa jest klasy Cn-r (dowód na podstawie wzoru Mansfielda-de Boora-Coxa, który przyjęliśmy tu za definicję, jest pracochłonny, ale reguła jest prosta, więc warto ją zapamiętać).

  • Jeśli dwa sąsiednie węzły są n-krotne, to łuk krzywej między nimi jest krzywą Béziera; dokładniej, jeśli uk-n+1==uk<uk+1==uk+n, to dla tuk,uk+1 mamy

    st=i=0ndk-n+iBint-ukuk+1-uk.

6.2.4. Wstawianie węzła

Wstawianie węzła jest procedurą, która zmienia reprezentację krzywej, nie zmieniając samej krzywej. W wyniku zastosowania tej procedury otrzymujemy reprezentację o większej liczbie węzłów i punktów kontrolnych. Idea postępowania, które prowadzi do otrzymania tej reprezentacji może być przedstawiona w następujących krokach

  1. Określamy tak zwane współrzędne Greville'a:

    ξi=1nui+1++ui+n.

    Będziemy (w myśli) przekształcać łamaną o wierzchołkach fi=ξi,di.

  2. Dołączamy liczbę tun,uN-n (wstawiany węzeł) do wyjściowego ciągu węzłów, z zachowaniem uporządkowania.

  3. Obliczamy nowe współrzędne Greville'a ξit, odpowiadające ciągowi węzłów z dołączoną liczbą t.

  4. Znajdujemy punkty fit=ξit,dit na łamanej. Punkty dit są punktami kontrolnymi nowej reprezentacji krzywej.

Praktyczna implementacja procedury wstawiania węzła nie musi obliczać współrzędnych Greville'a, które pełnią tu rolę pomocniczą. Równoważny skutek daje następujący podprogram:

{ ui=ui dla i=1,,N-1,  di=di dla i=0,,N-n-1}
{ tun,uN-n }
k := N-1;
while t<uk do
  k := k-1;
r := 0i := k;
while (i1and (t=ui) do
  begin i := i-1r := r+1 end;
for i := N-n-1 downto k-r do
  di+1 := di;
for i := k-r downto k-n+1 do
  di := ((u[i+n]-t)*di-1+t-ui*d[i])/(u[i+n]-u[i]);
for i := N-1 downto k+1 do
  ui+1 := ui;
uk+1 := t;
N := N+1;
{ zmienna N oraz tablice u i d zawierają wynik wstawiania węzła. }
Rys. 6.10. Zasada wstawiania węzła.

Własności tego przekształcenia reprezentacji krzywej są następujące:

  • Po wstawieniu węzła liczba punktów kontrolnych jest większa o 1.

  • Wynik wstawienia kilku węzłów nie zależy od kolejności ich wstawiania.

  • Krzywa reprezentowana przez nowy ciąg węzłów i nowy ciąg punktów kontrolnych jest identyczna z krzywą wyjściową.

  • Algorytm de Boora jest procedurą wstawiania węzła, powtórzoną tyle razy, aby ostatecznie otrzymać n-krotny węzeł t.

  • Po wstawieniu dostatecznie wielu węzłów (tak, aby ich odległości stały się dostatecznie małe), otrzymujemy łamaną kontrolną, która jest dowolnie bliska krzywej. Odległość odpowiednio sparametryzowanej łamanej kontrolnej od reprezentowanej przez nią krzywej B-sklejanej jest proporcjonalna do h2, gdzie h oznacza maksymalną odległość sąsiednich węzłów. Datego po wstawieniu nawet niezbyt dużej liczby węzłów możemy otrzymać łamaną, którą można narysować w celu uzyskania dość dokładnego obrazu krzywej.

Procedurę wstawiania węzła możemy wykorzystać tak:

  1. wybieramy początkowo małą liczbę węzłów i punktów kontrolnych w celu zgrubnego ukształtowania krzywej,

  2. wstawiamy pewną liczbę dodatkowych węzłów,

  3. poprawiamy krzywą w celu wymodelowania szczegółów.

Inne zastosowanie to wstawienie węzłów tak, aby krotność wszystkich węzłów była równa n+1; łamana kontrolna składa się wtedy z łamanych kontrolnych Béziera poszczególnych łuków wielomianowych, które można narysować za pomocą jakiejś szybkiej procedury, np. opartej na schemacie Hornera. Procedury rysowania krzywych Béziera mogą być zaimplementowane w sprzęcie. Mając procedurę wstawiania węzłów, możemy użyć takiego sprzętu do rysowania krzywych B-sklejanych.

6.2.5. Krzywe B-sklejane z węzłami równoodległymi

Narzucenie węzłów równoodległych ogranicza klasę krzywych B-sklejanych, ale jednocześnie upraszcza wzory i umożliwia stosowanie specjalnych algorytmów.

Przypuśćmy (bez straty ogólności), że dana krzywa jest reprezentowana przez nieskończony ciąg węzłów, składający się z wszystkich liczb całkowitych, i nieskończony ciąg punktów kontrolnych ci; mamy zatem

st=iZsciNint,

gdzie każda funkcja B-sklejana Nin stopnia n przyjmuje wartości różne od zera tylko w przedziale i,i+n+1. Ponadto dla każdego iZ oraz tR mamy Nint=N0nt-i.

Rozważmy teraz nieskończony ciąg węzłów, składający się z wszystkich całkowitych wielokrotności liczby 12. Niech Min oznacza funkcję B-sklejaną opartą na tym ciągu węzłów i przyjmującą niezerowe wartości w przedziale i2,i+n+12. Krzywą s możemy przedstawić w postaci

st=iZsdiMint.

Na podstawie danych punktów ci należy znaleźć punkty di.

Algorytm Lane'a-Riesenfelda, który rozwiązuje to zadanie, podaję bez dowodu. Algorytm ten składa się z dwóch etapów. Pierwszy z nich to podwajanie: konstruujemy punkty d2i0=d2i+10=ci. W drugim etapie wykonujemy n-krotnie operację uśredniania: obliczamy punkty dij=12di-1j-1+dij-1. Mając daną początkową reprezentację krzywej s w postaci łamanej o wierzchołkach c0,,cN, w kolejnych krokach uśredniania otrzymamy łamane o wierzchołkach djj,,d2N+1-jj. Wynikiem obliczenia są punkty di=din dla każdego iZ.

Rys. 6.11. Algorytm Lane'a-Riesenfelda dla krzywych stopnia 2, 34.

Wyniki działania algorytmu dla krzywych stopnia 2, 34 są pokazane na rysunku 6.11. Otrzymaną łamaną można następnie użyć jako dane dla algorytmu Lane'a-Riesenfelda i otrzymać łamaną reprezentującą krzywą s przy użyciu ciągu węzłów i4iZs itd. Określony w ten sposób nieskończony ciąg łamanych, z których każda jest reprezentacją krzywej związaną z odpowiednim ciągiem węzłów równoodległych, jest szybko zbieżny do krzywej, można zatem narysować jedną z tych łamanych zamiast krzywej.

6.3. Powierzchnie Béziera i B-sklejane

6.3.1. Płaty tensorowe

Do określenia powierzchni potrzebne są funkcje dwóch zmiennych. Najczęściej wykorzystuje się iloczyn tensorowy przestrzeni funkcji jednej zmiennej. Użycie go prowadzi do wzorów

pu,v=i=0nj=0mpijBinuBjmv,
su,v=i=0N-n-1j=0M-m-1dijNinuNjmv,

które opisują odpowiednio płat powierzchni Béziera i płat powierzchni B-sklejanej stopnia n,m. W przypadku płata B-sklejanego, nawet jeśli stopień ze względu na każdy parametr jest taki sam, można podać inny ciąg węzłów określających funkcje bazowe.

Rys. 6.12. Płat B-sklejany.

Dziedziną płata Béziera jest zwykle kwadrat jednostkowy. Dziedziną płata B-sklejanego jest prostokąt un,uN-n×vm,vM-m. Często dziedzinę otrzymuje się przez odrzucenie fragmentów takiego prostokąta; mamy wtedy płat obcięty (rys. 6.13).

Rys. 6.13. Obcięty płat Béziera.

Punkty kontrolne płata każdego z tych rodzajów dla wygody kształtowania przedstawia się w postaci siatki. Wyróżniamy w niej wiersze i kolumny. Wyznaczenie punktu na powierzchni, dla ustalonych parametrów u, v, można sprowadzić do wyznaczania punktów na krzywych (Béziera albo B-sklejanych), np.

pu,v=i=0nj=0mpijBjmvqiBinu=i=0nqiBinu.

Wszystkie działania wykonujemy na kolumnach siatki, traktując je tak, jakby to były łamane kontrolne krzywych. Punkty tych krzywych, odpowiadające ustalonemu v, są punktami kontrolnymi krzywej stałego parametru u leżącymi na płacie. Można też postąpić w odwrotnej kolejności i najpierw przetwarzać wiersze, a potem kolumnę otrzymanych punktów.

Rys. 6.14. Wyznaczanie punktu na płacie Béziera.

Zasada przetwarzania reprezentacji płata w celu podwyższenia stopnia, podziału na kawałki, wstawienia węzła i obliczenia pochodnych cząstkowych jest identyczna.

6.3.2. Płaty trójkątne

Dziedziną trójkątnego płata Béziera jest zwykle trójkąt, którego wierzchołki stanowią układ odniesienia układu współrzędnych barycentrycznych r, s, t. Suma tych współrzędnych jest równa 1, wewnątrz trójkąta mają one wartości dodatnie.

Płat jest określony wzorem

pr,s,t=i,j,k0i+j+k=npijkBijknr,s,t,

w którym występują wielomiany Bernsteina trzech zmiennych stopnia npunkty kontrolne pijk, będące wierzchołkami siatki kontrolnej płata trójkątnego.

Rys. 6.15. Trójkątny płat Béziera i jego siatka kontrolna.

Algorytm wyznaczania punktu (algorytm de Casteljau) jest następujący:

{ pijk0=pijk dla i,j,k0,i+j+k=n }
for l := 1 to n do
  for i,j,k0,i+j+k=n-l do
    pijkl := rpi+1,j,kl-1+spi,j+1,kl-1+tpi,j,k+1l-1;
{ pr,s,t=p000n }

Podobnie jak w przypadku krzywych Béziera, algorytm de Casteljau pozwala dokonać podziału płata. Punkty kontrolne jego fragmentów to odpowiednio p0jki, pi0kj, pij0k. Jeśli współrzędna r, s lub t jest równa 0 (punkt, któremu odpowiada obliczony punkt na płacie, leży na boku trójkąta, który jest dziedziną), to mamy możliwość podziału płata na dwa fragmenty. Algorytm de Casteljau działa wtedy w taki sposób, jakby poszczególne wiersze siatki kontrolnej były łamanymi kontrolnymi krzywych Béziera stopni 0,1,,n.

6.3.3. Metody siatek

Algorytm Lane'a-Riesenfelda dla powierzchni B-sklejanych stopnia n,n jest dwuwymiarową wersją algorytmu przedstawionego wcześniej dla krzywej. Punkty cik, przy użyciu których powierzchnia sklejana jest określona wzorem

su,v=iZsjZscikNinuNknv,

z funkcjami B-sklejanymi stopnia n opartymi na (tym samym) ciągu węzłów całkowitych, posłużą do obliczenia punktów dik, takich że

su,v=iZsjZsdijMinuMjnv,

gdzie funkcje Min są określone przy użyciu ciągu węzłów i2iZs. Algorytm składa się z kroku podwajania i n kroków uśredniania, przy czym

  1. W kroku podwajania przyjmujemy

    d2i,2k0=d2i,2k+10=d2i+1,2k0=d2i+1,2k+10=cik.
  2. W kroku uśredniania dla j=1,,n przyjmujemy

    dikj=14di-1,k-1j-1+di,k-1j-1+di-1,kj-1+dikj-1.

W ten sposób otrzymujemy nową siatkę kontrolną; powtarzając ten algorytm, otrzymamy ciąg siatek szybko zbieżny do powierzchni s. Dowolną z tych siatek (otrzymaną np. po kilku, najwyżej kilkunastu iteracjach) możemy uznać za dostatecznie dokładne przybliżenie powierzchni i narysować zamiast niej.

Okazuje się, że opisane wyżej postępowanie daje się uogólnić na siatki nieregularne, tj. takie, których wierzchołków nie można ustawić w prostokątną tablicę. Rozważmy siatkę jako graf; wierzchołki siatki są wierzchołkami grafu, odcinki siatki są krawędziami grafu, możemy też określić ściany grafu, jako łamane zamknięte złożone z krawędzi, takie że odrzucenie wierzchołków i krawędzi łamanej nie likwiduje spójności grafu. Zakładamy, że każda krawędź należy do jednej lub do dwóch ścian.

Rys. 6.16. Siatki przetwarzane przez algorytmy Doo-Sabina i Catmulla-Clarka.

Siatka jest regularna, jeśli wszystkie ściany mają 4 krawędzie i każdy wierzchołek nie leżący na brzegu siatki, tzw. wewnetrzny, jest stopnia 4 (tj. jest incydentny z czterema krawędziami). Każda ściana nie-czworokątna i każdy wierzchołek wewnętrzny stopnia różnego od 4 jest tzw. elementem specjalnym siatki.

Dla siatki, która zawiera elementy specjalne, możemy określić operację podwajania w ten sposób: każdy wierzchołek stopnia k zastępujemy przez ścianę (zdegenerowaną do punktu), która ma k wierzchołków i krawędzi. Każdą krawędź zastępujemy przez ścianę czworokątną, zdegenerowaną do odcinka; ściany dotychczasowe pozostawiamy (oczywiście, w nowej siatce zmieni się numeracja wierzchołków każdej ściany). Jeśli siatka jest regularna, to wynik jest taki sam jak wynik kroku podwajania w algorytmie Lane'a-Riesenfelda dla powierzchni.

Operację uśredniania określamy tak: konstruujemy graf dualny do siatki danej. Dla każdej ściany określamy wierzchołek, jako środek ciężkości wierzchołków tej ściany. Dla każdej krawędzi wspólnej dla dwóch ścian wprowadzamy krawędź łączącą wierzchołki skonstruowane dla tych ścian. Ściany nowej siatki odpowiadają wierzchołkom wewnętrznym siatki danej. Również taka operacja uśredniania jest dla siatki regularnej identyczna z uśrednianiem wykonywanym w algorytmie Lane'a-Riesenfelda. Zauważmy, że choć liczba wierzchołków, krawędzi i ścian rośnie podczas podwajania, ale żadna z opisanych operacji nie może powiększyć liczby elementów specjalnych w siatce.

Możemy teraz wykonać podwajanie, a następnie n kroków uśredniania. Dwa najczęściej stosowane przypadki, dla n=2 oraz n=3, są znane odpowiednio jako algorytmy Doo-Sabina i Catmulla-Clarka. Iterując dowolny z tych algorytmów, otrzymamy ciąg siatek zbieżny do powierzchni granicznej. Powierzchnia ta prawie w całości składa się z kawałków wielomianowych stopnia n,n; wyjątkiem jest otoczenie punktów, do których zbiegają elementy specjalne siatki.

6.4. Krzywe i powierzchnie wymierne

Krzywe i powierzchnie Béziera i B-sklejane są wielomianowe lub kawałkami wielomianowe, tj. ich parametryzacje są opisane za pomocą wielomianów. Nakłada to spore ograniczenia na możliwe do przedstawienia w tej postaci kształty, na przykład nie istnieje wielomianowa parametryzacja okręgu. Znacznie szersze możliwości modelowania udostępniają krzywe i powierzchnie wymierne. W zasadzie każdą reprezentację krzywych wielomianowych lub kawałkami wielomianowych (sklejanych) można uogólnić tak, aby otrzymać krzywe wymierne.

Aby to zrobić, wystarczy określić krzywą (albo powierzchnię) wielomianową w przestrzeni, której wymiar jest o 1 większy niż wymiar przestrzeni docelowej, tj. w przestrzeni współrzędnych jednorodnych. Mając współrzędne np. X, Y, Z i W punktu Pt takiej krzywej jednorodnej, współrzędne punktu pt krzywej wymiernej otrzymamy ze wzorów x=X/W, y=Y/W, z=Z/W.

Rys. 6.17. Wymierna krzywa Béziera i jej jednorodna reprezentacja.

Krzywą P w przestrzeni współrzędnych jednorodnych nazywamy krzywą jednorodną. Pewien kłopot w jej konstruowaniu sprawia fakt, że jeśli jest to np. krzywa Béziera, to jej punkty kontrolne są wektorami w przestrzeni współrzędnych jednorodnych; trudno byłoby nimi manipulować, jako że leżą w innej przestrzeni niż krzywa wymierna (i użytkownik programu do modelowania takiej krzywej oraz obraz krzywej utworzony przez ten program). Dlatego punkt kontrolny (albo inne wektory w przestrzeni współrzędnych jednorodnych, które służą do reprezentowania krzywej) najwygodniej jest określić za pomocą punktu (albo wektora) w przestrzeni, w której leży krzywa, oraz wagi, czyli liczbowego współczynnika dodatkowo określającego wpływ punktu na kształt krzywej. Na przykład, jeśli przyjmiemy punkty kontrolne pi=xi,yi,ziT oraz wagi wi, to krzywa Béziera, której punktami kontrolnymi są wektory

Pi=wixiwiyiwiziwi,

jest jednorodną reprezentacją wymiernej krzywej Béziera, danej wzorem

pt=i=0nwipiBinti=0nwiBint.

W podobny sposób określa się wymierne krzywe B-sklejane, a także wymierne płaty powierzchni Béziera i B-sklejane.

Wymierne krzywe i powierzchnie sklejane znane są pod nazwą NURBS, która jest skrótem angielskiego określenia non-uniform rational B-splines. Słowa non-uniform (czyli nierównomierne) dotyczą dopuszczalnych ciągów węzłów w definicji takiej krzywej — węzły te nie muszą być równoodległe.

6.5. Modelowanie powierzchni i brył

6.5.1. Zakreślanie

Zakreślanie (ang. sweeping) jest sposobem określania powierzchni, w najprostszym przypadku za pomocą krzywej, tzw. przekroju i odcinka, tzw. prowadnicy. Zasada jest przedstawiona na rysunku.

Rys. 6.18. Zakreślanie.

Konstrukcję tę można uogólniać na wiele sposobów; jednym z nich jest przekształcanie przekroju podczas ,,przesuwania” go wzdłuż prowadnicy. Jeśli przekształcenie to jest jednokładnością o ustalonym środku, to zamiast powierzchni walcowej otrzymujemy powierzchnię stożkową. Dalsze możliwości uogólnienia tej konstrukcji są następujące:

  • Prowadnica może być krzywą;

  • Każdemu punktowi prowadnicy odpowiada inne przekształcenie afiniczne, któremu będzie poddany przekrój;

  • Można też dopuścić zmiany kształtu przekroju podczas ,, przesuwania” go.

Dopuszczenie wszystkich tych możliwości wymaga opisania powierzchni zakreślanej wzorem

su,v=pu+x2uxqu,v+x3uyqu,v+x1uzqu,v.

W tym wzorze występują krzywe:

  • prowadnica, p,

  • tzw. kierownice, x1, x2, x3,

  • przekrój, q, który jest w najogólniejszym przypadku jednoparametrową rodziną krzywych.

Zmienna v jest parametrem przekroju; zmienna u, która jest parametrem prowadnicy i kierownic, jest też parametrem rodziny krzywych opisujących przekrój. We wzorze są widoczne funkcje xq, yq i zq, które opisują współrzędne punktu przekroju.

Rys. 6.19. Uogólniona konstrukcja powierzchni zakreślanej.

Zauważmy, że dla ustalonego u wzór opisujący powierzchnię zakreślaną opisuje przekształcenie afiniczne, którego część liniowa jest określona przez macierz x2u,x3u,x1u, a wektor przesunięcia jest równy pu.

Jeśli wszystkie krzywe są krzywymi B-sklejanymi i przekrój nie zależy od u, to mając łamane kontrolne tych krzywych można dość łatwo skonstruować siatkę kontrolną powierzchni zakreślanej. W przypadku zmieniającego się przekroju jest to trudniejsze i dlatego zwykle konstruuje się przybliżenie takiej powierzchni. Są dwa sposoby otrzymania takiego przybliżenia:

  1. Tablicujemy wzór określający powierzchnię; otrzymujemy w ten sposób prostokątną tablicę punktów na powierzchni. Na podstawie tych punktów generujemy trójkąty, które jeśli jest ich dość dużo, przybliżają powierzchnię dostatecznie dokładnie.

  2. Konstruujemy powierzchnię rozpinaną. W tym celu należy wyznaczyć krzywe B-sklejane opisujące przekrój dla wybranych wartości parametru u, a następnie wyznaczyć powierzchnię interpolacyjną dla tych krzywych.

6.5.2. Powierzchnie rozpinane

Przypuśćmy, że dane są liczby (węzły) un,,uN-n i krzywe B-sklejane xiv dla i=n,,N-n. Powierzchnia rozpinana s spełnia warunek sui,v=xiv dla każdego v.

Założymy, że stopień i ciąg węzłów użyty do określenia wszystkich krzywych xi jest identyczny. Punktem wyjścia do konstrukcji reprezentacji B-sklejanej powierzchni rozpinanej jest konstrukcja B-sklejanej krzywej interpolacyjnej, określonej przez podanie punktów xi. Mamy obliczyć punkty kontrolne krzywej s, takiej że sui=xi, i=n,,N-n.

Konstrukcja dla n=3 wygląda następująco: przyjmujemy u1=u2=u3, uN-3=uN-2=uN-1. Punkty krzywej s otrzymamy, rozwiązując układ równań liniowych

11N13u4N23u4N33u4NN-73uN-4NN-63uN-4NN-53uN-411d0d1d2dN-6dN-5dN-4=x3d1x4xN-4dN-5xN-3.

Punkty d1 i dN-5 można wybrać dowolnie (podanie tych punktów określa tzw. warunki brzegowe krzywej). Współczynniki macierzy można obliczyć ze wzorów (otrzymanych na podstawie wzoru Mansfielda-de Boora-Coxa (6.1) i (6.2))

Nk-33uk=uk+1-uk2uk+1-uk-2uk+1-uk-1,
Nk-23uk=uk-uk-2uk+1-uk-2uk+1-ukuk+1-uk-1+uk+2-ukuk+2-uk-1uk-uk-1uk+1-uk-1,
Nk-13uk=uk-uk-12uk+2-uk-1uk+1-uk-1.

Aby skonstruować B-sklejaną powierzchnię interpolacyjną (powierzchnię rozpinaną), wystarczy zamiast punktów xi podstawić ,,punkty” — łamane kontrolne krzywych xi. Liczba współrzędnych każdego takiego punktu jest równa 3 razy liczba punktów kontrolnych łamanej. Obliczone ,,punkty” di w przestrzeni o tym samym wymiarze w podobny sposób reprezentują kolumny siatki kontrolnej powierzchni rozpinanej. Wybór kolumn numer 1 i N-5, określających warunki brzegowe, jest dowolny.

6.5.3. Powierzchnie zadane w postaci niejawnej

Najczęściej stosowane w grafice powierzchnie zadane w postaci niejawnej to powierzchnie algebraiczne i kawałkami algebraiczne, czyli zbiory miejsc zerowych wielomianów trzech zmiennych. Najbardziej znana reprezentacja płaszczyzny, za pomocą dowolnego punktu x0,y0,z0T i wektora normalnego a,b,c, jest w istocie niejawna:

x,y,zT:ax-x0+by-y0+cz-z0=0.

Podobnie, współrzędne środka x0,y0,z0 i promień r są współczynnikami równania sfery:

x,y,zT:x-x02+y-y02+z-z02-r2=0.

Dość często spotyka się w praktyce powierzchnie wyższego stopnia (np. torus, powierzchnia stopnia 4), ale rzadko stopień ten jest większy niż kilka.

Określenie prostokątnego płata Béziera opiera się na pojęciu iloczynu tensorowego dwóch przestrzeni funkcji jednej zmiennej. Możemy rozpatrywać iloczyny tensorowe większej liczby przestrzeni. Jeśli są to przestrzenie wielomianów stopnia n, m, l, to bazą ich iloczynu tensorowego jest np. baza

BinuBjmvBklw:i=0,,n,j=0,,m,k=0,,l.

Dowolny wielomian trzech zmiennych, stopnia n,m,l, można przedstawić w tej bazie. W kostce 0,13 określmy punkty pijk=i/n,j/m,k/lT. Określmy wielomian

ax,y,z=i=0nj=0mk=0laijkBinxBjmyBklz.

Współczynnik aijk przyporządkujemy punktowi pijk. Wielomian BinxBjmyBklz w tym punkcie kostki przyjmuje maksymalną wartość.

Rys. 6.20. Siatka reprezentacji wielomianu trzech zmiennych.

Powierzchnia określona za pomocą takiego wielomianu trzech zmiennych jest zbiorem jego miejsc zerowych wewnątrz kostki. Wyznaczanie punktów takiej powierzchni lub jej przybliżenia (np. za pomocą trójkątów) wymaga obliczania wartości funkcji a, najczęściej podczas rozwiązywania równania nieliniowego, które powstaje przez podstawienie parametrycznej reprezentacji pewnej prostej:

ax0+txv,y0+tyv,z0+tzv=0.

Znając rozwiązanie t tego równania możemy obliczyć współrzędne punktu na powierzchni na podstawie reprezentacji prostej. Metody, w których jest stosowane to podejście, będą omówione później; jedną z nich jest śledzenie promieni, a drugą to metoda maszerujących sześcianów. Zwróćmy uwagę, że na ogół nie warto wyznaczać współczynników wielomianu f zmiennej t, który występuje po lewej stronie równania. Stopień tego wielomianu jest równy n+m+l, czyli jest duży. Zamiast tego, wygodniej jest obliczać wartość wielomianu a sposobem podobnym do wyznaczania punktu płata Béziera. Mamy

ax,y,z=i=0nj=0mk=0laijkBklzbijBlmyciBinx,

co umożliwia zastosowanie algorytmu de Casteljau albo schematu Hornera.

Algorytm de Casteljau umożliwia podział kostki, w której jest określona powierzchnia, na prostopadłościany. Możemy to wykorzystać do otrzymania obszaru o dowolnie małej objętości, w którym znajduje się powierzchnia. Wystarczy dzielić rekurencyjnie kostkę i odrzucać te jej fragmenty, w których współczynniki lokalnej reprezentacji wielomianu a mają stały znak. To jest oczywiście zastosowanie własności otoczki wypukłej opisanej tu reprezentacji wielomianu trzech zmiennych.

W grafice komputerowej bardzo popularne są powierzchnie określane słowem blob (to angielskie słowo nie doczekało się polskiego odpowiednika). Powierzchnia taka może być zbiorem miejsc zerowych funkcji f określonej wzorami

Φx,y,z=e1-x2-y2-z2,
fix,y,z=Φx-xi/ri,y-yi/ri,z-zi/ri,
fx,y,z=i=1nsifix,y,z-c.

Zamiast funkcji przestępnej ex często do określenia blobu wykorzystuje się też wielomiany.

Rys. 6.21. Blob.

Aby określić taką powierzchnię, należy określić tzw. szkielet, czyli zbiór punktów xi,yi,ziT oraz parametry ri i si dla każdego z tych punktów i współczynnik c. Zbiór rozwiązań równania sifix,y,z-c=0 jest wprawdzie sferą, ale jeśli punktów szkieletu jest więcej niż 1, to otrzymujemy gładkie połączenia nieco zdeformowanych sfer. Zwiększanie parametru ri powoduje powiększanie sfery (lub ,,rozdmuchiwanie” odpowiedniego fragmentu powierzchni), zaś parametr si odpowiada za długość gradientu funkcji fi; im większy, tym ,,sztywniejsza” jest powierzchnia ze względu na zmiany parametru c. Na lewym rysunku 6.21 jest pokazana taka powierzchnia razem z trzema kulami, których środki tworzą jej szkielet, z prawej zaś strony są trzy takie powierzchnie, które różnią się tylko wartościami parametru c.

Powierzchnie zadane w sposób niejawny mają to do siebie, że funkcja występująca w definicji umożliwia rozróżnienie trzech podzbiorów przestrzeni: powierzchnia jest zbiorem miejsc zerowych. W punktach należących do wnętrza bryły, której brzegiem jest rozpatrywana powierzchnia, funkcja ma wartości dodatnie, a punkty na zewnątrz odpowiadają ujemnym wartościom funkcji (można też traktować znaki funkcji odwrotnie). Ta informacja jest niesłychanie ważna podczas znajdowania punktów powierzchni, a także w konstrukcyjnej geometrii brył i dlatego nie należy uważać funkcji f2x,y,z albo fx,y,z za pełnowartościową reprezentację powierzchni, mimo że funkcje te mają zbiór miejsc zerowych taki sam jak funkcja f.

Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.

Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.