de Nash Vail

Nerding cu curbe Bezier

Nerding cu curbe Bezier

Din ultimele zile am încercat să scriu propria mea bibliotecă de animație JavaScript. Știu că știu că nimănui nu-i pasă cu adevărat de o nouă bibliotecă de animație, dar, ideea este că, în procesul în care am dat peste curbele Bezier. Am petrecut câteva ore cercetând, încercând să le înțeleg în timpul cărora am dat peste acest proaspăt articol – „Intuitia matematică din spatele curbelor Bezier”, Care se întâmplă, de asemenea, să fie inspirația pentru acest articol. Este mat și se pare că se adresează oamenilor inteligenți, prin urmare am avut un moment dificil să-mi învăluiesc capul în jurul conceptului. Dar, din fericire, până la urmă am făcut-o și acest lucru a condus la învățarea unui număr de lucruri noi și interesante despre curbele Bezier, pe care sunt foarte încântat să le împărtășesc cu dvs.

Ce veți învăța

Voi începe cu o introducere a curbelor, ce sunt, de ce sunt mișto, reprezentarea lor matematică. Nu vă faceți griji cu privire la matematică, totuși, ca să fiu sincer, cam oarecum îi suge la matematică, așa că trebuie să vin cu modalități de a-mi explica mie și sunt sigur că „căile” vor funcționa și pentru voi :).

Apoi, vom trece la curbele Bezier. Ce sunt și ce le face diferite. Formula lor matematică.

Spre final vom construi propriul nostru motor de desenare a curbei Bezier în JavaScript și SVG. Cat de tare e asta?

Curbe

Nu trebuie să dau o definiție formală a curbei aici, nu? Toate aceste linii sunt curbe, uită-te la ele

Nerding cu curbe Bezier
Curbe, curbe toate curbele

Curbele sunt destul de dulci, pot reprezenta o serie de lucruri. De exemplu, curba de mai jos arată numărul de Twitter-ul meu adepți în timp.

1612124053 439 Nerding cu curbe Bezier

Bine, bine, arată ca o linie mâzgălită la întâmplare. Permiteți-mi să adaug un context.

1612124054 195 Nerding cu curbe Bezier
Scuză-mi scrierea de mână

Acum ar trebui să ofere o idee mai bună despre ceea ce reprezintă. Pe axa orizontală este numărul de zile de când m-am alăturat Twitterului și pe axa verticală este numărul de adepți pe care i-am câștigat.

În prima mea zi pe Twitter, am avut 0 adepți, apoi a crescut încet, am pierdut unii, am câștigat unii, apoi în a doua jumătate, după cum puteți vedea, am câștigat un număr de adepți noi. Aceasta nu este singura informație pe care o putem descifra din această curbă. De asemenea, pot afla numărul exact de adepți pe care i-am avut într-o zi dată. Este doar o chestiune de a trasa două linii.

Să presupunem că aș vrea să știu numărul de adepți pe care i-am avut în a 60-a zi.

1612124054 316 Nerding cu curbe Bezier

Trag o linie verticală din 60 pe axa orizontală, apoi din punctul în care această linie intersectează curba trasez o linie orizontală. Această linie orizontală intersectează axa verticală (axa cu numărul de adepți) într-un punct. Valoarea acelui punct de pe axa verticală îmi oferă numărul exact de adepți pe care i-am avut în a 60-a zi, adică 126.

Acum, unde cele două linii roșii se intersectează, este ceea ce se numește a punct. Pe un grafic bidimensional, la fel ca graficul nostru de adepți Twitter, un punct este identificat în mod unic prin două valori, coordonata sa orizontală (X) și coordonata sa verticală (y). Prin urmare scrierea (X y) este tot ce este necesar pentru a reprezenta un punct. În cazul nostru, punctul roșu, unde se intersectează cele două linii roșii, poate fi scris ca (60, 126).

(60 = x / coordonată orizontală, 126 = y / coordonată verticală)

Destul de bine pentru ce este un punct, știai asta deja. Să vorbim despre curbă, care de fapt este un colectarea multor astfel de puncte nu-i așa?

Luați o serie de date, cum ar fi în ziua a 0-a 0 adepți, prima zi 50 adepți … a 10-a zi 76 adepți … a 100-a zi 500 adepți … și așa mai departe Convertiți aceste date în puncte (0, 0) (1, 50) … (10, 76) … (100, 500) … Plasați punctele de pe grafic unindu-le împreună și acolo, aveți o curbă.

Deci, pentru o curbă aveți nevoie de puncte, iar pentru puncte aveți nevoie de valorile corespunzătoare x și y. Prin urmare, acum acordați o atenție deosebită aici, o curbă poate fi reprezentată în mod unic de ceva care poate scuipa valorile x și y pentru noi. Acel „ceva” este ceea ce numim în matematică a funcţie.

Există multe funcții standard în matematică. Considera sinus funcţie.

1612124054 212 Nerding cu curbe Bezier

În astfel de funcții, alegerea lui x este a noastră. Îi dăm un X, ne oferă o y. Și împreună formăm un punct (x, y). Îi dăm încă un x, ne dă un alt y, așa și așa mai departe ajungem cu o colecție de puncte, le trasăm și obținem o formă unică.

1612124055 967 Nerding cu curbe Bezier
Sursă: http://forum.kerbalspaceprogram.com/index.php?/topic/69707-sine-graphs-and-orbital-paths/

O funcție poate fi reprezentată și în formă parametrică. În formă parametrică nu este necesar să furnizăm o parte din coordonatele punctului așa cum am făcut (x) în exemplul anterior. În schimb, furnizăm un parametru / variabilă, în general scris ca t și pentru fiecare t le primim pe amândouă X și y coordonate, pe scurt oferim un t obținem un punct.

Veți dori să știți ce este forma parametrică atunci când vorbim despre matematica din spatele curbelor Bezier.

Curbele Bezier

Curbele Bezier sunt curbe foarte speciale. Matematica și ideea din spatele lor m-au suflat și ar trebui să te pregătești să fii și tu năucit.

Întrucât citiți acest lucru, presupun că sunteți un designer sau un dezvoltator și ați tratat anterior curbele Bezier, în special curbele Bezier cubice, vom ajunge la curbele Cub Bezier într-o secundă. Acum aceste curbe sunt folosite într-o varietate de locuri, pentru a crea grafică vectorială, căi de animație, animație ușurând curbele etc doar pentru că așa sunt ușor de controlat. Nu este nevoie să cunoașteți o mulțime de matematică, niciunul pentru a îndoi aceste curbe la capriciile voastre. Gândiți-vă dacă curbele Bezier nu existau și oamenii ar fi trebuit să vină cu funcții matematice unice pentru curbe, să zicem să desenăm grafică vectorială precum fonturi, de exemplu, un coșmar, desigur.

Matematica?

Bine, este timpul pentru niște matematici. Voi începe cu formula generală pentru curbele Bezier, este destul de descurajantă la prima vedere, dar ne vom croi drum.

1612124055 920 Nerding cu curbe Bezier
Formula generală pentru curba Bezier de grad n

„Whoa! Vai! Vai! Einstein! ”. Hei, așteaptă, nu face clic. Este ușor, uite, l-am făcut atât de colorat?

Să începem să descompunem formula. Puteți sări peste piesele pe care le cunoașteți deja.

B

1612124055 937 Nerding cu curbe Bezier

B pentru că este un Bcurba ezier. După cum sa menționat anterior în articolul despre forma parametrică a curbelor, t este un parametru. Vă conectați t și iese X și y, un punct. În curând vom vedea cum funcționează acest lucru cu ecuația de mai sus. Va fi bine să menționăm aici că pentru Bezier curbe valoarea t ar trebui să fie între 0 și 1, ambele incluse.

Σ / Sigma

1612124055 252 Nerding cu curbe Bezier

Acest simbol, Σ, în Matematică se numește operator de însumare. Modul în care funcționează este astfel, în partea dreaptă a acestui simbol este o expresie cu o variabilă i, iar i pot păstra doar valori întregi. În partea de sus și de jos a simbolului scriem limitele lui i. Pentru fiecare valoare a lui i se evaluează expresia din dreapta și se adaugă la total până când i ajunge la n.

Aici sunt cateva exemple.

1612124056 120 Nerding cu curbe Bezier
1612124056 947 Nerding cu curbe Bezier

Doar o notație mai scurtă pentru ceva mai lung.

Bine, se pare că suntem clari cu sigma.

nCi

1612124056 455 Nerding cu curbe Bezier

Acest C aici este C din Permutări și Combinații. Hai să avem o lecție de combinații improvizate. Acum, în formulă, această parte este ceea ce se numește coeficient binomial. Modul de a citi nCi este așa, n Alege eu. Ceea ce înseamnă a fi date n elemente în câte moduri puteți alege i elemente din acesta (n este întotdeauna mai mare sau egal cu i). Bine, s-ar putea să nu fi avut mult sens, ia în considerare acest exemplu: Am 3 elemente un cerc, un pătrat și un triunghi. Prin urmare, aici, n = 3. În câte moduri pot alege 2 (i = 2) itemi din 3. În limbajul matematicii care ar fi scris ca 3C2 (3 Alegeți 2). Răspunsul este 3.

1612124057 892 Nerding cu curbe Bezier

În mod similar,

1612124057 645 Nerding cu curbe Bezier

Și când i este 0, există doar o singură modalitate de a alege 0 elemente din n, 1, de a alege deloc.

În loc să desenați schițe și să aflați răspunsul la o expresie dată de combinație, există această formulă generalizată.

1612124057 360 Nerding cu curbe Bezier

P sub i

1612124058 230 Nerding cu curbe Bezier

Acesta este elementul important. În formula generală pentru curba Bezier există t, i și n. Nu am atins cu adevărat ce este n. n este ceea ce se numește gradul curbei Bezier. n este ceea ce decide dacă o curbă Bezier este liniară sau pătratică sau cubică sau altceva.

Vedeți, dacă ați folosit instrumentul stilou înainte, faceți clic pe două locații distincte pentru a crea două puncte distincte și apoi controlați curba care se formează între cele două puncte folosind mânere. O curbă Bezier va avea întotdeauna cel puțin două puncte de ancorare, iar restul sunt puncte de control care sunt utilizate pentru a controla forma curbei. De asemenea, ceea ce numiți mânere sunt doar punctele de control conectate de o linie la un punct de ancorare, sunt doar acolo pentru a oferi un model mental mai bun. Deci, atunci când reglați mânerele, în realitate schimbați pur și simplu coordonatele punctelor de control.

1612124058 599 Nerding cu curbe Bezier
O curbă Bezier cubică

Să scăpăm de toate accesoriile și să ne concentrăm asupra miezului.

1612124058 655 Nerding cu curbe Bezier
Curba cubică Bezier

Curba pe care o vedeți în imaginea de mai sus este a Curba Bezier cubică, sau cu alte cuvinte, gradul curbei Bezier prezentat mai sus este 3 sau în formula generală pentru curbele Bezier conectați n = 3.

n = 1 vă oferă o curbă liniară Bezier cu două puncte de ancorare P0 și P1 și fără puncte de control, astfel încât în ​​esență ajunge să fie o linie dreaptă.

n = 2 vă oferă o curbă Bezier pătratică cu două puncte de ancorare P0 și P2 și un punct de control P1

și în mod similar n = 3 vă oferă o curbă Cub Bezier cu două puncte de ancorare P0 și P3 și două puncte de control P1 și P2. Cu cât este mai mare n, cu atât pot fi desenate forme mai complicate.

Acum vom forma din ecuația generală ecuația pentru curba Cub Bezier care implică înlocuirea n = 3 în formula generală. Ecuația pe care o vom obține va fi în variabilă t care, așa cum am menționat anterior, este un parametru a cărui valoare variază între 0 și 1. De asemenea, pentru ecuație vom avea nevoie de 4 Pis (citiți: Pee eyes) P0, P1, P2 și P3. Alegerea acestor puncte depinde de noi, la urma urmei, când desenăm grafică vectorială, spunem că folosind instrumentul stilou, alegem poziția punctelor de ancorare, iar punctele de control nu-i așa? După modificări, ecuația noastră pentru curba Cubic Bezier arată cam așa.

1612124059 302 Nerding cu curbe Bezier
Ecuație extinsă pentru o curbă Cub Bezier

Folosim puțină concizie aici, în realitate fiecare punct (P) are două coordonate x și y și, de asemenea, la trecerea t la ecuația generală, ar trebui să obținem un punct care are și coordonate x și y. Prin urmare, putem scrie ecuația de mai sus ca

1612124059 172 Nerding cu curbe Bezier
Ecuație extinsă pentru curba Cub Bezier

Sunteți pe punctul de a asista la ceva foarte special despre aceste ecuații.

1612124060 281 Nerding cu curbe Bezier

Pentru a recapitula, ecuația menționată este forma parametrică a curbei Bezier cu parametrul t care poate conține valori care variază între 0 și 1. O curbă este o colecție de puncte. Fiecare unic t treci în B oferă un punct unic care creează întreaga curbă Bezier.

Lucrul magic al ecuației este că atunci când t = 0, B (0) = P0 și când t = 1, B (1) = P3, prin urmare, valorile extreme ale t, 0 și 1 dau cele mai multe puncte extreme ale curbă care sunt desigur punctele de ancorare. Acest lucru nu este valabil doar pentru curbele Bezier cubice, pentru o curbă de grad n B (0) = P0 și B (1) = Pn.

Pentru orice altă valoare a t între 0 și 1 (de exemplu, t = 0,2 din figura de mai sus) obțineți un punct care creează curba.

Deoarece întreaga ecuație este dependentă de poziția Pis (ochii Pee), schimbarea poziției lor schimbă forma curbei. Și așa funcționează curbele Bezier.

Acum, că cunoaștem matematica din spatele curbelor Bezier, să folosim aceste cunoștințe.

Am creat un program JavaScript simplu care redă o curbă Bezier cubică, nu există nicio interfață pentru a interacționa cu ea, deoarece nu am vrut ca logica să se estompeze în tot codul UI și, de asemenea, pentru că sunt leneș. Dar asta nu înseamnă că nu poți interacționa cu el :).

Nerding cu curbe Bezier

A fost un pic prea mult de luat? Am început cu definirea care sunt curbele, de acolo ne-am mutat în puncte și cum sunt elementele de bază ale unei curbe. Apoi am mers la curbele Bezier și am înțeles matematica pentru a găsi puncte care fac o curbă Bezier sus. Sper că ai învățat ceva și ai lăsat acest articol mai inteligent decât atunci când ai început să-l citești.

Codul pentru micul motor personalizat Cubic Bezier poate fi găsit în acesta Repo GitHub.

Actualizați: Generatorul poate genera acum o curbă Bezier de orice grad și nu doar curbe Cub Bezier :).

Căutați mai multe? Public regulat pe blog la nashvail.me. Ne vedem acolo, are unul bun!

1612124061 828 Nerding cu curbe Bezier