3. Bezier görbe¶
3.1. A de Casteljau-algoritmus¶
A de Casteljau-algoritmus elemi lépésének vizsgálatához tekintsük a \(\textbf{b}_0\), \(\textbf{b}_1\) és \(\textbf{b}_2\) pontokat! Válasszunk egy tetszőleges \(t \in [0, 1]\) valós értéket!
Osszuk fel a \(\textbf{b}_0\) és \(\textbf{b}_1\) pontok közötti szakaszt \(t : (1 - t)\) arányban! Jelöljük az így kapott pontot \(\textbf{b}_0^1(t)\) formában!
Hasonlóképpen osszuk fel a \(\textbf{b}_1\) és \(\textbf{b}_2\) pontok közötti szakaszt! Jelöljük ezt \(\textbf{b}_1^1(t)\)-vel!
Osszuk fel a \(\textbf{b}_0^1(t)\) és \(\textbf{b}_1^1(t)\) közötti szakaszt, és jelöljük \(\textbf{b}_0^2(t)\)-vel!
Ezzel az eljárással egy görbét tudunk leírni, melyhez a segédpontokat a
formában számíthatjuk ki, magának a görbének a pontjait pedig a
alakban, vagy közvetlenül az eredeti pontokból a
formában.
\(\rhd\) Vizsgáljuk meg, hogy milyen pontokat kapunk, hogy ha a \(t\) a \([0, 1]\) intervallumon kívülre esik!
Vegyük észre, hogy az előbbiekben bemutatott felosztási módszert
tetszőleges számú pontra,
tetszőleges dimenziós térben
tudjuk alkalmazni! Ez a rekurzív eljárást nevezzük de Casteljau algoritmusnak.
\(\rhd\) Ábrázoljuk a görbe egy pontjának a meghatározását 4 pont esetén (egy szabadon választott \(t\) paraméterrel)!
\(\rhd\) Ábrázoljuk a pontok származtatási (számítási) viszonyait az előző esethez!
Megjegyzés
Paul de Faget de Casteljau, Citroën
3.2. A Bernstein polinom¶
Az \(i\)-edik \(n\)-edfokú Bernstein polinomot az alábbi formában definiáljuk:
Definíció szerint továbbá
\(\rhd\) Ábrázoljuk az \(n\)-edfokú Bernstein polinomokat (a \(t \in [0, 1]\) intervallum felett)!
A Bernstein polinom tulajdonságai:
\(B_i^n(t) \geq 0\), ha \(t \in [0, 1]\),
\(B_i^n(t) = (1 - t)B_i^{n-1}(t) + t B_{i-1}^{n-1}(t), \forall t \in [0, 1]\) (rekurzív tulajdonság),
egységfelbontást alkotnak/normalizáltak:
a deriváltjaik alacsonyabb fokú Bernstein polinomokkal felírhatók:
\(\text{argmax}_t B_i^n(t) = \dfrac{i}{n}, \forall i \in [0, n]\).
3.3. A Bézier görbe paraméteres alakja¶
A de Casteljau algoritmus a Bézier görbe pontjait eredményezi. Ennek paraméteres alakja a Bernstein polinomok segítségével felírva:
A görbe számításához használt pontokat kontrollpontoknak vagy Bézier-pontoknak hívjuk.
Megjegyzés
3.4. Kapcsolat a de Casteljau algoritmussal¶
A de Casteljau algoritmusnál használt pontokat Bernstein polinomokkal a következőképpen írhatjuk föl:
ahol
3.5. A Bézier görbe tulajdonságai¶
Zárt az affin transzformációkra.
A kontrollpontok transzformációjával kapott görbe megegyezik a pontonként transzformált görbével.
Ez praktikusan azt jelenti, hogy a görbe transzformálásához elegendő a kontrollpontokat transzformálni, majd abból kiszámítani a görbe pontjait.
A tulajdonság az arányos osztások következménye.
\(\rhd\) Hogyan definiálhatjuk a konvexitást?
\(\rhd\) Mit nevezünk konvex buroknak?
A Bézier görbe pontjai mindig a kontrollpontjainak a konvex burkában van.
Az állítás a de Casteljau algoritmus következménye.
Ez egyúttal garancia arra vonatkozóan is, hogy így a görbe nem fog hirtelen kiugrásokat tartalmazni (mint amilyenek a Lagrange interpolációnál előfordulhatnak).
A Bézier-görbe a paramétertartomány affin transzformációjára nézve invariáns.
Használhatunk tetszőleges \(t = (u - a) / (b - a), u \in [a, b]\) paraméterezést. A görbe alakja nem fog változni.
A pontok ugyan nem változnak meg, az érintővektorok (és így a bejárás sebessége) viszont igen.
Szintén a de Casteljau algoritmus következménye.
A Bézier görbe az első és az utolsó kontrollpontján áthalad (azokban interpolál).
A kontrollpontok bejárási sorrendjét megfordítva is ugyanazt a görbét kapjuk.
Globálisan változtatható. Minden kontrollpont hatással van a teljes görbe alakjára.
Mivel a \(t = i / n\) paraméternél a \(B_i^n\) polinom van a legnagyobb hatással a görbére, ezért lehet következtetni az alakváltozásra. Emiatt pszeudó-lokálisan változtatható görbének is szokták nevezni.
A görbe csak akkor lesz egyenes, hogy ha a kontrollpontok egy egyenesre esnek (más szóval kollineárisak).
3.6. A görbe deriváltja¶
A Bézier görbe deriváltjára vonatkozó felírási módok például az alábbiak.
tetszőleges \(\forall t \in [0, 1]\) esetén.
3.6.1. Hodográf¶
Láthatjuk, hogy a Bézier görbe deriváltja (hodográfja) egy \((n-1)\)-edfokú Bézier-görbe.
Az eredeti kontrollpontokból képezzük a \(\Delta \textbf{b}_i = \textbf{b}_{i+1} - \textbf{b}_i\) vektorokat!
Vegyük ezek \(n\)-szeresét!
Toljuk ezeket az origóba!
A derivált az így kapott (\(n\) számú kontrollponthoz tartozó \((n-1)\)-edfokú) Bézier görbe lesz.
A hodográf segítségével vizsgálhatjuk a görbe tulajdonságait.
Hogy ha a hodográf átmegy az origón, akkor van olyan (elfajuló) pontja az eredeti görbének, amelynél az érintő nullvkektor.
Hogy ha a hodográfnak van az origón átmenő érintője amely inflexiós pontja, akkor az eredeti görbének van nulla görbületű pontja.
Hogy ha a hodográfnak van az origón átmenő érintője (amely nem szinguláris pont), akkor az eredeti görbének van inflexiós pontja.
3.6.2. Kapcsolat a de Casteljau algoritmussal¶
Vezessünk be a csúcspontok különbségére vonatkozóan egy külön jelölést!
A de Casteljau algoritmusnál használt \(\textbf{b}_i^k\) pontok segítségével a Bézier-görbe \(r\)-edik deriváltja felírható, mint
Ez alapján láthatjuk, hogy
\(\textbf{b}_0^n\) a görbének a pontja,
\((\textbf{b}_0^{n-1}, \textbf{b}_1^{n-1})\) az értintőt határozza meg,
\((\textbf{b}_0^{n-2}, \textbf{b}_1^{n-2}, \textbf{b}_2^{n-2})\) a simulósíkot határozza meg.
3.7. A görbe kettévágása¶
Tekintsünk egy \(n\)-edfokú Bézier-görbét: \(\textbf{b}^n(t), t \in [0, 1]\)! Válasszunk egy tetszőleges \(c \in (0, 1)\) értéket! A megoldandó probléma, hogy hogyan találhatunk olyan \(n\)-edfokú, \(t \in [0, 1]\) intervallumon értelmezett Bézier-görbét, amely \(\textbf{b}^n(t), t \in [0, c]\) ívvel egyezik meg.
Jelöljük a keresett görbét \(\textbf{c}^n(u)\) alakban! A paramétere legyen \(u = t / c\) formában adott. Azon kontrollpontokat szeretnénk meghatározni, amelyekre teljesül majd, hogy
A megoldást a de Casteljau algoritmus segítségével kaphatjuk meg. Szimmetria okok miatt egyidejűleg a kettévágással kapott mindkét görbét közel azonos módon határozhatjuk meg.
Jelöljük a de Casteljau algoritmusban szereplő közbülső pontokat általánosan \(\textbf{b}_i^j\) formában (ahol \((i + j) \in [0, n]\)).
A \([0, c]\) intervallumhoz tartozó görbe kontrollpontjai:
vagy röviden \(\textbf{c}_i = \textbf{b}_0^i(c)\).
A \([c, 1]\) intervallumhoz tartozó görbe kontrollpontjai:
vagy röviden \(\textbf{c}_i = \textbf{b}_{n-i}^i(c)\).
\(\rhd\) Ábrázoljuk egy negyedfokú görbén az összefüggést!
Megjegyzés
Mivel a kettévágás során számított kontrollpontok az eredeti görbe kontrollpontjainak a konvex burkában vannak, ezért
a két új görbe konvex burka az eredeti konvex burok valódi része lesz, és
az eljárás egyúttal mutatja a Bézier-görbe hullámzáscsökkentő tulajdonságát.
3.8. Hullámzáscsökkentés¶
A Bézier görbét egy sík legfeljebb annyi pontban metszi, mint a kontrollpoligonját.
Megjegyzés
Az egyenest az állításban, mint a sík egy alacsonyabb dimenziós esetét tekintjük.
Az állítás a de Casteljau algoritmussal bizonyítható, mivel a kontrollpoligon tulajdonképpen a görbéhez konvergál, így nem jelenhet meg új metszéspont.
3.9. Bézier-spline¶
A polinomok fokszámának alacsonyan tartása, és a lokális vezérelhetőség a Bézier-görbék használata kapcsán is fontos szempont lehet. A problémát ez esetben is az alacsonyabb fokszámú polinomos görbék egymáshoz illesztésével oldhatjuk meg.
A Bézier-spline-ok használatához az azokat felépítő Bézier-görbék kapcsolódási módjait kell megvizsgálnunk. Az egyszerűség kedvéért tekintsünk csak két görbét:
\(\textbf{a}(u), u \in [u_0, u_1]\), és
\(\textbf{b}(u), u \in [u_1, u_2]\).
Ezek kontrollpontjai rendre \(\{\textbf{a}_i\}_{i=0}^n\) és \(\{\textbf{b}_i\}_{i=0}^n\).
A kapcsolódás mértékének a leírásához egyaránt használjuk a \(C^k\) és \(G^k\) jelöléseket, ahol \(k \in \mathbb{N}_0\).
\(C^k\) esetében azt várjuk el, hogy a \(k\)-adik deriváltak teljes mértékben megegyezzenek.
\(G^k\) esetében elegendő, hogy ha a \(k\)-adik deriváltak iránya megegyezik.
\(C^1\) kapcsolódás esetében például az érintővektoroknak meg kell egyezniük, míg \(G^1\) kapcsolódás esetében elegendő, hogy ha az érintőegyenesek megegyeznek.
3.9.1. Nulladrendű kapcsolódás¶
\(C^0\) kapcsolódás esetén annyit szeretnénk csak elérni, hogy az
teljesüljön. Ehhez elegendő, hogy \(\textbf{a}_n = \textbf{b}_0\) teljesüljön.
3.9.2. Elsőrendben folytonos kapcsolódás¶
A \(G^1\) kapcsolódáshoz az
kontrollpontoknak egy egyenesre kell esniük.
A \(C^1\) kapcsolódáshoz a kollinearitáson kívül még teljesülnie kell az alábbi aránynak:
3.9.3. Másodrendben folytonos kapcsolódás¶
A \(G^2\) kapcsolódáshoz az
kontrollpontoknak egy síkba kell esniük. (Ez a sík a kapcsolódási pontbeli simulósík.)
A \(C^1\) kapcsolódáshoz nézzük meg, hogy milyen pontban metszik egymást a \(\textbf{a}_{n-2}\textbf{a}_{n-1}\) és a \(\textbf{b}_{1}\textbf{b}_{2}\) szakaszokhoz tartozó egyenesek! Jelöljük ezt \(\textbf{m}\)-mel!
Ezekre teljesülnie kell, hogy
Megjegyzés
A kapcsolódás folytonosságának a vizsgálata természetesen magasabb rendű esetekre is vizsgálható.
3.10. Fokszámnövelés¶
Praktikus lehet, hogy ha egy \(n\)-edfokú Bézier-görbéhez meg tudjuk határozni azt az \((n+1)\)-edfokú Bézier-görbét, amely ugyanazt a görbét írja le.
Tekintsünk egy \(\textbf{b}_0, \textbf{b}_1, \textbf{b}_2, \ldots, \textbf{b}_n\) kontrollpontokkal adott Bézier-görbét! Keressük azon \(\textbf{b}_0^1, \textbf{b}_1^1, \textbf{b}_2^1, \ldots, \textbf{b}_{n+1}^1\) kontrollpontokat, amelyekre teljesül, hogy
Ezt megoldva azt kapjuk, hogy
Ez megadható a
alakban is.
Szemléletesen tehát azt vesszük észre, hogy a fokszámnövelés során az új kontrollpoligont az eredeti kontrollpoligon sarkainak a levágásával kapjuk.
Hogy ha a fokszámnövelést tetszőleges sokszor alkalmazzuk, akkor a kontrollpoligonunk a Bézier görbéhez fog tartani.
Fokszámot csökkenteni általában nem tudunk (legfeljebb közelíti, alacsonyabb fokszámú görbét megadni).
3.11. Töröttvonalas közelítés¶
A töröttvonalas közelítésre megjelenítés vagy az ívhossz számítása érdekében lehet például szükségünk.
Használhatunk például egyenközű felosztást a
választással. A pontosabb közelítés és a hatékonyság érdekében érdemes azonban a görbületet is figyelembe vennünk. Ehhez használhatjuk például a következő algoritmust.
Keressük meg a \(\textbf{b}_0\) és a \(\textbf{b}_n\) pontokon átmenő egyenestől a legtávolabb eső kontrollpontot. Ennek az indexét jelöljük \(j\)-vel, a távolságát pedig \(m_j\)-vel!
Hogy ha \(m_j \leq \varepsilon\) teljesül, akkor kész vagyunk. A görbe a \(\textbf{b}_0\) és \(\textbf{b}_n\) pontokat összekötő szakasszal helyettesíthető.
Hogy ha nem teljesül, akkor osszuk fel a görbét a \(t = j / n\) paraméternél! Rekurzívan folytassuk a kirajzolást az így kapott két görbére!
Megjegyzés
Zárt görbék esetében a görbét kettévágva (\(t = 0.5\) paraméternél) már tudjuk alkalmazni az algoritmust.
3.12. Interpoláció¶
Megtehetjük, hogy úgy keressük egy Bézier-görbének a kontrollpontjait, hogy a kapott görbe bizonyos pontokon áthaladjon. Így tehát interpolációs problémák megoldására is használható közvetve az eredendően approximációs görbe.
Tekintsük az interpolációs alapfeladatot a \(\textbf{p}_0, \textbf{p}_1, \textbf{p}_2, \ldots, \textbf{p}_n\) interpolációs pontokkal, és \(0 \leq u_0 < u_1 < \cdots < u_n \leq 1\) paraméter értékekkel!
Keressük azokat a \({\textbf{b}_i}_{i=0}^n\) kontrollpontokat, amelyekre teljesül, hogy
A Bernstein polinomos alakot felhasználva ebből adódik, hogy
Ezt mátrixos alakra hozva a következő (inhomogén lineáris) egyenletrendszert kapjuk:
Feltételezve, hogy az \(u_i\) értékek különbözőek, az egyenletrendszereket (koordinátánként megoldva) mindig lesz egyértelmű megoldásunk.
3.13. Kérdések, elméleti feladatok¶
Mi az a de Casteljau algoritmus? (Mutassa be ábrával, számításokkal szemléltetve!)
Definiálja az \(n\)-edfokú Bernstein polinomot! Milyen tulajdonságai vannak?
Hogyan írható fel a Bézier görbe paraméteres alakja a Bernstein polinom segítségével?
Milyen kapcsolat van a de Casteljau algoritmus és a Bernstein polinomok között?
Ismertesse a Bézier görbe tulajdonságait!
Mit nevezünk hodográfnak? Hogyan írható ez fel a Bézier görbe esetében?
Milyen kapcsolat van a Bézier görbe deriváltja és a de Casteljau algoritmus között?
Hogyan tudunk egy Bézier görbét a \(c \in \mathbb{R}\) paraméterénél kettévágni?
Hogyan tudunk Bézier görbékből Bézeier-spline-t készíteni? Milyen módon garantálhatóak a nullad-, első- és másodrendű folytonosságok?
Hogyan tudjuk egy Bézier görbének növelni a fokszámát?
Hogyan érdemes a Bézier görbére töröttvonalas közelítést adni? (Mutassa be az erre vonatkozó algoritmust!)
Hogyan tudjuk Bézier görbe segítségével megoldani az interpolációs problémát!
3.14. Számítási feladatok¶
Megjegyzés
A számításokat 4 tizedesjegy pontossággal végezze!
Tegyük fel, hogy adottak a \(\textbf{p}_0 = (0, 0), \textbf{p}_1 = (2, 5), \textbf{p}_2 = (4, 3), \textbf{p}_3 = (5, -1)\) kontrollpontok.
Számítsa ki a Bézier-görbe pontját a \(t = 0.4\) paraméterértéknél de Casteljau algoritmus segítségével!
Határozza meg a Bézier-görbe pontját a \(t = 0.2\) paraméternél a Bernstein polinomos paraméteres alak segítségével!
Határozza meg a görbe érintőjét a \(t = 0.3\) paraméternél!
Írja fel a görbe érintőjének egyenletét és a ponthoz tartozó normálvektort a \(t = 0.4\) pontban!
Vágjuk ketté a görbét a \(t = 0.25\) paraméternél! Határozzuk meg mindkét kapott görbének a kontrollpontjait!
Számítsuk ki annak az 5-ödfokú görbének a kontrollpontjait, amely ugyanezt a görbét állítja elő!
3.15. Programozási feladatok¶
3.15.1. A de Casteljau algoritmus¶
Implementáljuk a de Casteljau algoritmust!
Rajzoljuk be egy adott pont számítása esetén a segédvonalakat!
Oldjuk meg, hogy a kijelölt ponthoz tartozó \(t\) paramétert lehessen módosítani (például csúszkával vagy görgővel)!
3.15.2. Binomiális együtthatók számítása¶
Ábrázoljuk az \(n\)-edfokú Bernstein polinomokat! (Rögzített \(n\) esetén, vagy oldjuk meg, hogy a programban megadható legyen tetszőleges \(n\) érték!)
Vizsgáljuk meg a binomiális együttható faktoriálisokkal és rekurzív formulával történő számítási módját!
Utóbbinál vizsgáljuk meg a gyorsítótárazás hatását!
Készítsünk méréseket és ábrázoljuk a kapott eredményeket!
3.15.3. Görbe kettévágása¶
Készítsünk egy alkalmazást a görbe kettévágásának szemléltetésére!
Színekkel különítsük el a kettévágással kapott görbék kontrollpontjait!
Oldjuk meg, hogy a kettévágáshoz használt paramétert lehessen megadni/módosítani!
3.15.4. Fokszám növelése¶
Implementáljunk egy algoritmust, amellyel interaktív módon (a görbe kontrollpontjainak módosíthatóságát megtartva) tudjuk egy Bézier görbének növelni a fokszámát!
3.15.5. Görbe megjelenítése¶
Implementáljuk a Bézier-görbe megjelenítéséhez azt az algoritmust, amelyik igyekszik minimalizálni a szükséges szakaszok számát a töröttvonalas megjelenítésnél!
3.15.6. Bézier interpoláció¶
Implementáljunk egy alkalmazást, amely \((n+1)\) pontra megoldja a Bézier interpolációs problémát! Hasonlítsuk össze a Lagrange és a Bézier interpolációs görbéket azonos kontroll pontok esetében!
3.16. További feladatok¶
Vizsgáljuk meg, hogy egy Bézier görbékkel határolt síkidomnak hogyan tudjuk kiszámítani/közelíteni a területét!
Vizsgáljuk meg, hogy milyen lehetőségek vannak az Bézier approximáció és interpoláció egyidejű használatára vonatkozóan!
Tegyük fel, hogy tetszőleges sok pontra szeretnénk egy \(n\)-edrendű Bézier görbét illeszteni! Vizsgáljuk meg a szóbajöhető approximációs, optimalizálási módszereket!
Hasonlítsa össze a konvergencia sebességét a Bézier görbe kettévágása és a fokszámnövelés viszonylatában!
Implementáljunk egy alkalmazást, amely egy zárt Bézier görbén belül pattogó pontot jelenít meg!
Hogyan tudunk kontrollpontokon áthaladó (interpoláló) \(G^1\) folytonos görbét megadni úgy, hogy az csak egyenes szakaszokból és körívekből áll, ismerjük ezek arányát, és minimális a görbe hossza?