tiistai 30. joulukuuta 2014

Polynomikäyriä ja -pintoja Bézier'n tapaan

Koulussa opetetaan polynomilaskentaa. Lähinnähän tämä on pohjaa lausekkeiden muokkaamiseen ja sieventämiseen, mikä saattaisi olla aiheen rehellisempi nimi.  Monelle ehkä jää hieman hämäräksi, missä polynomeja oikeastaan voi käyttää.  Tämä onkin hankala kysymys, niin monessa yhteydessä polynomeilla on käyttöä.  Yhtenä esimerkkinä ovat autojen peltien muodot. Puolisen vuosisataa sitten alkoivat nimittäin ranskalaiset Paul de Casteljau (Citroënilla) ja Pierre Bézier (Renaultilla) käyttää polynomeja tietokoneavusteisen suunnittelun (CAD, Computer Aided Design) apuvälineinä. Tekniikkaa käytetään nykyään muuallakin, mm. kuvankäsittelyohjelmissa.

Kyse on käyrien ja pintojen esittämisestä sopivan parametrisoinnin avulla.  Käyrän parametriesitys on periaatteessa muotoa \[ x = f(t), \quad y = g(t),  \] avaruudessa lisäksi $z = h(t)$. Jokaista parametrin $t$ arvoa vastaamaan saadaan yksi käyrän piste. Pinnan tapauksessa parametreja on kaksi, $u$ ja $v$: \[ x = f(u,v), \quad y = g(u,v), \quad z = h(u,v).  \] Funktioista $f$, $g$ ja $h$ riippuu, millainen käyrä tai pinta syntyy.  Suunnittelutehtävissä nämä ovat polynomeja, joiden kertoimet määräytyvät ns. ohjauspisteiden sijainnin perusteella. Siirtämällä näitä hiirellä tietokoneen ruudulla voidaan käyrää tai pintaa muunnella ja hakea sille haluttu muoto.

Ohjauspisteiden tulee olla sellaisia, että suunnittelija voi mieltää helposti niiden vaikutuksen käyrän tai pinnan muotoon. Luonnollisimmaksi on osoittautunut kolmannen asteen polynomin käyttö (pinnan tapauksessa kummankin parametrin suhteen erikseen). Tällöin puhutaan Bézier'n käyristä ja pinnoista. Perustapauksessa käyrällä on neljä ohjauspistettä, pinnalla 16. Käyrän vektorimuotoinen parametriesitys on \[ \vec{r}(t) = (1 - t)^3\vec{p}_1 + 3t(1 - t)^2\vec{p}_2 + 3t^2(1 - t)\vec{p}_3 + t^3\vec{p}_4, \] missä $\vec{p}_j$ tarkoittaa ohjauspisteen paikkavektoria. Pinnan tapauksessa lauseke on selvästi mutkikkaampi: \[ \vec{r}(u,v) = \sum_{j=0}^3\sum_{k=0}^3 \binom{3}{j}\binom{3}{k} u^j(1-u)^{3-j}v^k (1 - v)^{3-k}\vec{p}_{jk}, \]

Bézier'n käyrä. Ohjauspisteet punaisella.

Bézier'n pinta. Ohjauspisteet vihreän verkon solmupisteitä.


Jos halutaan pitempi ja mutkikkaampi käyrä, saattaisi tuntua luonnolliselta nostaa polynomin astelukua, jolloin ohjauspisteitäkin tulee lisää. Tällöin kuitenkin menetetään intuitiivisuus: ei ole enää aivan helppoa hahmottaa, mitä ohjauspisteitä on siirrettävä haluttuun tulokseen pääsemiseksi. Parempi ratkaisu on tyytyä kolmannen asteen polynomeihin, mutta siirtyä paloittain jatkuviin funktioihin: parametrin osaväleillä lausekkeet ovat kolmannen asteen polynomeja, mutta lauseke vaihtuu yhteenliimauskohdissa. Käyrän laskennasta tulee monimutkaisempaa ja algoritmien tehokkuuteen on kiinnitettävä huomiota (tietokoneissakin). Tällöin puhutaan splinikäyristä. (Sana 'splini' tarkoittaa alunperin piirtäjän työkalua, joustavasta metalliliuskasta tehtyä viivainta, joka voitiin taivuttaa halutulle mutkalle ja sen avulla piirtää käyrä.  Nimitys on säilynyt, vaikka suunnittelija onkin siirtynyt käyttämään kynän sijasta tietokonetta.)

Splinikäyrä. Ohjauspisteet punaisella.


Kuvia vastaavat laskentaohjelma Mathematicalla tehdyt koodit ovat lukijan käytettävissä, mutta tähän tarvitaan ilmainen CDF Player (Wolfram Research), joka on ensin asennettava omaan koneeseen. Linkit alla.

Yksinkertainen Bézier'n käyrä. Punaisia ohjauspisteitä voi siirtää hiirellä.

Splinikäyrä. Useita punaisia ohjauspisteitä, joita voi siirrellä.

Bézier'n pinta. Ohjauspisteet merkitty kaksinkertaisilla indekseillä, vasemmanpuolisessa ruudukossa säädetään x- ja y-koordinaatti, oikeanpuolisilla janoilla z-koordinaatti.  Painikkeissa on muutamia valmiita esimerkkejä (joita myös voi muokata).

2 kommenttia:

tfmatik kirjoitti...

Hieno blogi tämä. Itsekin tuossa omaa matikkablogia pistin pystyyn, mutta vähän toisesta näkökulmasta on sinne tarkoitus kirjoitella. Mutta tuosta LaTeXista kysyisin sen verran, että miten olet tuon mathjax-scriptin tuonne vääntänyt? Vähän koetin googlea penkoa, ja päättelin, että täytyisi ilmeisesti jonkinlainen "gadget" asiaa varten rustata, mutta lienenkö oikeassa vai väärässä?

Simo Kivelä kirjoitti...

Tarvittavat MathJax-skriptit (jotka löytyvät MathJaxin nettisivuilta) piti sijoittaa Googlen Bloggerin konfigurointiin paikkaan, joka ei ollut ihan helposti löydettävissä. Ota yhteys sähköpostilla, niin yritän antaa ohjeita: simo.kivela@elisanet.fi.