Bézier' kõverate uurija

Uuri Bézier' kõveraid interaktiivselt. Lohista juhtpunkte ja jälgi de Casteljau konstruktsiooni.

Interaktiivse simulatsiooni laadimine...

Ükski keskmine juhtpunkt ei saa kunagi kätte 🖖

Lohista sisemine juhtpunkt kaugele eemale: kõver kaldub sinnapoole, kuid ei jõua kohale. Sisemise punkti Bernsteini kaalul on kindel ülempiir — kuupvõrrandi eelseadetes on see b₁,₃(t) = 3t(1−t)², mille maksimum asub kohal t = 1/3 ja on vaid 4/9. Otspunktid kannavad seevastu kohtadel t = 0 ja t = 1 täpselt kaalu 1, mistõttu kõver algab ja lõpeb just nendel. Astme tõstmisel kahaneb sisemine mõju veelgi: 5. astme eelseades on piirid 0,410 ja 0,346. Just seepärast ahendavad disainerid lühikesi kuupkõveraid, mitte ei sobita ühte kõrge astme kõverat — mida rohkem juhtpunkte lisad, seda vähem suudab igaüks neist.

Nurkade lõikamine korduvate keskmistega 🖖

Sujuva kõvera taga peitub üksainus tagasihoidlik tehe, mida korratakse ikka ja jälle: kahe punkti sirgjooneline keskmine. De Casteljau algoritm võtab su juhtpunktid, leiab igal ühendaval lõigul punkti murdosa t kaugusel ja kordab seda uute punktidega, kuni järele jääb üks ainus punkt — see ongi B(t). Lohista liugurit ja vaata, kuidas kogu tellingud vajuvad kokku üheks punktiks, mis joonistab kõvera.

Nime sai vale leiutaja järgi 🖖

Algoritmi, mida see tööriist animeerib, lõi Paul de Casteljau Citroënis 1959. aastal — kolm aastat enne, kui Pierre Bézier avaldas sarnase töö konkurendi Renault' juures. Citroën käsitles de Casteljau uurimistööd ärisaladusena ja jättis selle avaldamata, nii et kõverad said hoopis Bézier' nime. Mõlemad insenerid vormisid autode plekki — kirjatüüpide ja animatsiooni matemaatika sündis tehasepõrandal.

BÉZIER' KÕVERAD — MIDA KONTROLLPUNKTID SAAVAD SUNDIDA JA MIDA MITTE

Millist Bézier' juhtumit sa joonistad?

Mitu kontrollpunkti sa kasutad, otsustab, millised kujud on üldse saavutatavad; kuhu sa need paned, otsustab, millise neist sa saad. Kolm punkti suudavad joonistada ainult tüki paraboolist — ei S-i, ei tippu, ei silmust, ükskõik mida sa keskmisega teed. Lisa neljas ja kõik kolm muutuvad võimalikuks, eraldatud piiridega, mida saab välja arvutada. Kolm alumist kuupkõverat jagavad punkte P0, P1 ja P2 ning erinevad ainult punktis P3 — täpselt selles punktis, mis viib kuupkõvera silmusest üle tipu tavalise S-ini.

Ruutkõver — kolm punkti ja alati parabool κ ≠ 0 ∀t
Kuupkõver käänupunktiga — see S, mida ruutkõver ei suuda κ(0.5) = 0
Tipp — koht, kus kõver jääb seisma ja pöörab ümber B′(0.5) = (0, 0)
Silmus — üks punkt, külastatud kaks korda B(0.211) = B(0.789)
Aste 5 — rohkem punkte, vähem kontrolli min |B − P₃| = 134

01

Ruutkõver — kolm punkti ja alati parabool

Mida sa tead: Kolm kontrollpunkti, aste 2. Kõver lahkub punktist P0 täpselt P1 suunas ja saabub punkti P2 täpselt P1 poolt; see üksainus keskmine punkt on kogu hoob, mis sul on.

Kuidas ära tunda: κ ≠ 0 ∀t

Näidisarvutus: P0 (50, 250), P1 (250, 30), P2 (450, 250) → B(0,50) = (250, 140), täpselt poolel teel P1 ja kõõlu keskpunkti (250, 250) vahel. Lähemale kui 110 px ei jõua kõver punktile P1 kunagi.

Ava see juhtum: Ruutkõver
Ruutkõver — kolm punkti ja alati parabool. Hari asub kohas (250, 140) — täpselt poolel teel kontrollpunkti ja kõõlu vahel. Kolm kontrollpunkti, aste 2. Kõver lahkub punktist P0 täpselt P1 suunas ja saabub punkti P2 täpselt P1 poolt; see üksainus keskmine punkt on kogu hoob, mis sul on.
Hari asub kohas (250, 140) — täpselt poolel teel kontrollpunkti ja kõõlu vahel.

02

Kuupkõver käänupunktiga — see S, mida ruutkõver ei suuda

Mida sa tead: Neli kontrollpunkti, aste 3, kusjuures P1 tõmbab kõõlust ülalt ja P2 alt. Kõver kaardub esmalt ühele ja siis teisele poole.

Kuidas ära tunda: κ(0.5) = 0

Näidisarvutus: P0 (50, 250), P1 (150, 50), P2 (350, 250), P3 (450, 50) → korrutis B′ × B″ langeb sirgjooneliselt positiivsest kohas t = 0 negatiivseks kohas t = 1, läbides nulli kohal t = 0,50, nii et ainus käänupunkt asub täpselt kohas B(0,50) = (250, 150).

Ava see juhtum: Kuup-S
Kuupkõver käänupunktiga — see S, mida ruutkõver ei suuda. Kõverus läbib nulli kohal t = 0,50: kaardumine pöördub kohas (250, 150). Neli kontrollpunkti, aste 3, kusjuures P1 tõmbab kõõlust ülalt ja P2 alt. Kõver kaardub esmalt ühele ja siis teisele poole.
Kõverus läbib nulli kohal t = 0,50: kaardumine pöördub kohas (250, 150).

03

Tipp — koht, kus kõver jääb seisma ja pöörab ümber

Mida sa tead: Neli punkti, kus P1 ja P2 on üksteise taha visatud nii, et mõlemad kiiruse komponendid saavad otsa samal hetkel. Aste 3.

Kuidas ära tunda: B′(0.5) = (0, 0)

Näidisarvutus: P0 (100, 200), P1 (400, 50), P2 (100, 50), P3 (400, 200) → x′(t) = 900(1 − 2t)² ja y′(t) = 450(2t − 1), seega B′(0,50) = (0, 0). Kõver jõuab punkti (250, 87,5), peatub ja lahkub suunas, kust ta tuli.

Ava see juhtum: Tipp
Tipp — koht, kus kõver jääb seisma ja pöörab ümber. B′(0,5) = (0, 0): joonistav punkt peatub kohas (250, 87,5) ja pöörab ümber. Neli punkti, kus P1 ja P2 on üksteise taha visatud nii, et mõlemad kiiruse komponendid saavad otsa samal hetkel. Aste 3.
B′(0,5) = (0, 0): joonistav punkt peatub kohas (250, 87,5) ja pöörab ümber.

04

Silmus — üks punkt, külastatud kaks korda

Mida sa tead: Täpselt tipu P0, P1 ja P2, kuid P3 on tõmmatud kohalt x = 400 kohale x = 280, nii et kontrollmurdjoon lõikub iseendaga teravamalt. Aste 3.

Kuidas ära tunda: B(0.211) = B(0.789)

Näidisarvutus: P0 (100, 200), P1 (400, 50), P2 (100, 50), P3 (280, 200) → B(t) = B(1 − t) kohal t = ½ ∓ √3/6, ehk t ≈ 0,211 ja t ≈ 0,789, ning mõlemad maanduvad täpselt punktis (220, 125).

Ava see juhtum: Kuupsilmus
Silmus — üks punkt, külastatud kaks korda. Kaks parameetrit, üks punkt: nii t ≈ 0,211 kui t ≈ 0,789 annavad (220, 125). Täpselt tipu P0, P1 ja P2, kuid P3 on tõmmatud kohalt x = 400 kohale x = 280, nii et kontrollmurdjoon lõikub iseendaga teravamalt. Aste 3.
Kaks parameetrit, üks punkt: nii t ≈ 0,211 kui t ≈ 0,789 annavad (220, 125).

05

Aste 5 — rohkem punkte, vähem kontrolli

Mida sa tead: Kuus kontrollpunkti, aste 5. Igal neist on igal t väärtusel nullist erinev kaal, seega ükskõik millise punkti nihutamine muudab kogu kõverat.

Kuidas ära tunda: min |B − P₃| = 134

Näidisarvutus: Kuus punkti ulatuvad y suunas 20-st 280-ni, kuid kõver ise katab ainult y väärtused 150 kuni 250 ja punktile P3 (300, 20) ei jõua ta kunagi lähemale kui 134 px. Kohal t = 0,5 on kaalud 0,031, 0,156, 0,313, 0,313, 0,156, 0,031 — iga punkt loeb, ükski ei käsuta.

Ava see juhtum: Aste 5
Aste 5 — rohkem punkte, vähem kontrolli. Kõver ei tõuse kunagi kõrgemale kui y = 150, kuigi ta enda kontrollpunktid ulatuvad y = 20-ni. Kuus kontrollpunkti, aste 5. Igal neist on igal t väärtusel nullist erinev kaal, seega ükskõik millise punkti nihutamine muudab kogu kõverat.
Kõver ei tõuse kunagi kõrgemale kui y = 150, kuigi ta enda kontrollpunktid ulatuvad y = 20-ni.
Allikad (3)
  • The Bernstein basis and its weight bounds: Farouki, R. T. (2012). "The Bernstein polynomial basis: A centennial retrospective." Computer Aided Geometric Design 29(6), 379–419.
  • The algorithm the tool animates, and the naming: Farin, G. Curves and Surfaces for CAGD: A Practical Guide, 5th ed. Morgan Kaufmann, 2002 — de Casteljau’s algorithm, the convex-hull property and endpoint interpolation. ISBN 978-1-55860-737-8.
  • De Casteljau’s own account of the unpublished Citroën work: de Casteljau, P. (1999). "De Casteljau’s autobiography: My time at Citroën." Computer Aided Geometric Design 16(7), 583–586. No DOI is linked here because the record could not be resolved to one.

Ülesanded täielikult lahendatud

  1. Kõvera punkt kohal t = 0,50, kus lõpeb ühes suunas paindumine 6 sammu

    Lehel oleval kuupkõveral on juhtpunktid P0 = (50, 250), P1 = (150, 50), P2 = (350, 250), P3 = (450, 50) raamis 500 × 300, kus y-st koordinaati mõõdetakse allapoole. Paneel kuvab kõvera punkti väärtusel t = 0.50. Näita, et see punkt on ainus koht, kus kõver lõpetab paindumise ühele poole ja hakkab painduma teisele poole.

    1. Väärtusel t = 1/2 on neli Bernsteini kaalu 1/8, 3/8, 3/8, 1/8, mistõttu kaks sisemist punkti kaaluvad kolm korda rohkem kui otsad. Selles kogu arvutus seisnebki: x = (50 + 450 + 1050 + 450)/8 ja y = (250 + 150 + 750 + 50)/8.

    2. Paindumine on teine tuletis ning kuupkõvera kahekordsel diferentseerimisel jääb järele midagi sellist, mis on t suhtes lineaarne. Kumbki kahest vektorist, millest see moodustub, on kolme järjestikuse juhtpunkti teine vahe.

    3. Arvuta need välja. Need osutuvad suuruselt võrdseks ja vastassuunaliseks — see on juhtmurdjoone omadus, mis on teada enne ühegi kõvera joonistamist.

    4. Seega on teine tuletis üks kindel suund, (100, 400), mida on skaleeritud teguriga 1 − 2t. Selle mõlemad komponendid muutuvad 0-ks väärtusel t = 1/2 ega ühegi teise t väärtuse korral selles vahemikus.

    5. Pelk nullkiirendus ei tee punktist veel käänupunkti; ka täielikult seiskuval kõveral on see olemas. Niisiis kontrolli kiirust. See on (450, 0): horisontaalne ja rõhutatult mitte null, seega liigub punkt sellest lameda koha kaudu edasi, mitte ei pööra seal ümber.

    6. Kõverusel on sama märk mis avaldisel x′y″ − y′x″. Sulud lahti korrutades taandub avaldis — kaks t-st sõltuvat osa taanduvad konstandiks 3 —, jättes lugeja täpselt võrdeliseks avaldisega 1 − 2t. t suhtes lineaarne suurus läbib nulli ühe korra, seega on sellel kuupkõveral täpselt üks käänupunkt ja see asub kohal t = 1/2.

    Vastus

    (250.0, 150.0) on kõvera ainus käänupunkt. Selle asukoht ei ole nende konkreetsete arvude juhuslik tulemus. Tingimus, mis kaotas teise tuletise, P3 − P2 = P1 − P0, avaldub ümber kujul P0 + P3 = P1 + P2 = (500, 300) — ning B(t) + B(1 − t) on ise kuup-Bézier' kõver pööratud ja liidetud juhtpunktidel P0+P3, P1+P2, P2+P1, P3+P0. Kõik neli on üks ja seesama punkt, seega on see summa konstantne (500, 300) iga t korral. Kontrolli seda veerandpöördel: B(0.25) = (140.625, 162.5) ja B(0.75) = (359.375, 137.5) annavad liitmisel täpselt selle. Kõver on punktisümmeetriline punkti (250.0, 150.0) suhtes ning kujund, mis näeb pärast poolpööret ümber punkti välja identne, ei saa seal kummale poolegi painduda. Katkendlik juhtmurdjoon kannab kogu tõestust: selle esimene ja viimane lõik on sama vektor, (100, −200), seega asub käänupunkt keskpunktis juba enne kõvera olemasolu.

  2. Diferentseeruvate polünoomide poolt punktis B(0,50) joonistatud nurk 6 sammu

    Teravikuolekus kasutatakse juhtpunkte P0 = (100, 200), P1 = (400, 50), P2 = (100, 50), P3 = (400, 200) ning paneel kuvab B(0.50) = (250.0, 87.5). Mõlemad koordinaadid on t-st sõltuvad polünoomid, seega on liikumine lõpmata palju kordi diferentseeruv. Näita, et selle joonistatud kujundil on selles punktis sellest hoolimata nurk.

    1. Samad kaalud nagu igal kuupkõveral parameetri poole peal: 1/8, 3/8, 3/8, 1/8. x = (100 + 1200 + 300 + 400)/8 ja y = (200 + 150 + 150 + 200)/8.

    2. Kuup-Bézier' kõvera tuletis moodustub juhtmurdjoone kolmest servast, mida kaalutakse ruut-Bernsteini baasiga. Diferentseerimiseks pole kunagi vaja punkte endid, vaid üksnes samme nende vahel.

    3. Siin kulgeb keskmine serv tagurpidi. P1 − P0 ja P3 − P2 mõlemad suunavad paremale, samal ajal kui P2 − P1 suunab 300 võrra vasakule — ning selle vertikaalne osa on 0, mistõttu ei saa see midagi y-st taandada.

    4. Kogu komponendid kokku ja mõlemad taanduvad üheks liikmeks. Horisontaalne kiirus on täisruut, mistõttu ei muutu see kunagi negatiivseks; vertikaalne kiirus on lineaarne ja muudab märki. Need muutuvad nulliks üheaegselt väärtusel t = 1/2, mis tähendab joonistava punkti täielikku seiskumist.

    5. Peatus ei tähenda automaatselt nurka — suund võiks pausi üle elada. Võta jagatis ja see läheneb 0-le mõlemalt poolt, seega on puutuja sisenemisel vertikaalne ja väljumisel vertikaalne, kusjuures y′ muudab selle kohal märki. Suund pöördub 180° võrra.

    6. Nagu teise tuletise puhul, on peatus murdjoone omadus. B′(1/2) avaldub kolmveerandina avaldisest (P2 + P3) − (P0 + P1), mis muutub nulliks täpselt siis, kui esimese serva keskpunkt ja viimase serva keskpunkt on sama punkt. Mõlemad on (250, 125).

    Vastus

    Joonistav punkt seiskub täielikult kohal (250.0, 87.5) ja liigub tagasi vastassuunas. Parameetrilises esituses pole midagi nurgelist — x(t) ja y(t) on kuupfunktsioonid, lõpmata palju kordi diferentseeruvad —, kuid trajektooril on sellegipoolest terav nurk. Seetõttu hinnatakse kõvera pidevust kahel viisil: C¹ küsib, kas kiirus on pidev, G¹ küsib, kas suund on pidev, ning nullkiirus rahuldab esimest, kuid hävitab teise. Sellel on ka mõõdetav tagajärg. Kuna y′ = 450(2t − 1) on enne peatumist negatiivne ja pärast positiivne, on y = 87.5 kõvera vähim väärtus, seega on teravik ekraani kõrgeim punkt ja kogu kõver on lõksus sellest allpool. P1 ja P2 asuvad kohal y = 50; kõver jõuab neist 37.5 kaugusele ega lähe lähemale, mis on kahe sisemise juhtpidemega kuupkõvera tõmbamise hind.

Näiteülesanded

  • Ruutkõver - Ruutkõver: aste 2, tipp kohas B(0,50) = (250, 140)
  • Kuup-S - S-kujuline kuupkõver: käänupunkt kohas B(0,50) = (250, 150)
  • Tipp - Tipp: puutuja kaob kohas B(0,50) = (250, 87,5)
  • Kuupsilmus - Silmusega kuupkõver: 3. astme kõver, mis lõikub iseendaga
  • Aste 5 - 5. aste kuuest kontrollpunktist