Interpolarea desenează grafică netedă cu ajutorul curbelor bezier

Orei bune a zilei, harbachitatel.

Formularea problemei
Există o serie de puncte Y situate uniform pe axa X. Trebuie să obțineți un grafic neted ce trece prin toate punctele date. Exemplu în imaginea de mai jos:

Interpolarea desenează grafică netedă cu ajutorul curbelor bezier

Toți cei care sunt interesați, întreabă sub tăiere.

Există o serie de soluții standard, pentru o curbă lină prin punctele (în acest sens, o mulțime de lucruri interesante scrise în articolul menționat deja), cum ar fi, de exemplu, interpolare spline. Atunci când al treilea curs a fost inventat acest algoritm, cuvântul „interpolare“, mă umple de groază, și gugleniya la cerere „netezirea grafice“ nu a dat rezultate în puterea de înțelegere. Dar cumva am ajuns la curbele Bezier și mi-a plăcut cu adevărat. Trage rapid, algoritmul este intuitiv ... Ce altceva este necesar pentru fericire. Păi, într-un fel a concurat.

Ideea principală

Voi sparge ideea în trei paragrafe pentru ao face mai ușor de înțeles și mai ușor de citit.

Interpolarea desenează grafică netedă cu ajutorul curbelor bezier

  • Distanța de la punctul A la punctele B1 și C1 a fost considerată a fi egală cu jumătate din treapta în X dintre punctele B și A. A și C. Este dificil pentru mine să justific această alegere într-un fel, dar este important ca această distanță să fie mai mică decât pasul X dintre punctele A și B. În caz contrar, se poate dovedi ceva asemănător imaginii de mai jos. Este important să înțelegem că cu cât este mai mare această distanță, cu atât mai mult va fi curba și vice-versa. Distanta de jumatate de pas in X mi se pare optima, dar exista deja optiuni posibile.

    Interpolarea desenează grafică netedă cu ajutorul curbelor bezier

    Astfel, se pare că problema este redusă la căutarea liniei drepte (B1 C1) și, de fapt, la punctele de referință B1 și C1. pe care vom construi mai târziu curbele Bezier.

    Căutați o adresă directă

    După cum se știe, linia din plan este exprimată prin formula y = kx + b. unde k este panta pantei liniei la axa X. Cand gasim k. atunci știind că linia dreaptă trece prin punctul A. și știind coordonatele sale, putem găsi cu ușurință b. b = YA-kXA. Astfel, totul se rezumă la găsirea coeficientului k.

    Căutați coeficientul k

    Am spus dinainte că k = tg (φ) = tg ((α-β) / 2) = (sqrt ((2 + Ax (YA -YB) 2) * (2 + Ax (YA -YC) 2)) - dx 2 - (YA -YB) * (YA -YC)) / (* Ax ((YA -YB) - (YA -YC))). unde ΔX este distanța în X între puncte (îmi amintesc că punctele noastre sunt distribuite uniform pe X). Mai jos este o dovadă matematică a corectitudinii formulării, dar dacă nu sunteți în starea de spirit, puteți să o ignorați.

    Interpolarea desenează grafică netedă cu ajutorul curbelor bezier

    Determinarea matematică a coeficientului k

  • (6) ∠C1 AC = ∠C1 AD + ∠DAC = φ + ∠DAC
    (7) ∠DAC = ∠O2 CA = β - ca unghiuri versatile interne formate de două linii paralele (AD) și (O2 C) și secant (AC)

    Prin paranteze pătrate se înțelege lungimea segmentului (nu am vrut să folosesc linii drepte verticale - sper că cititorul mă va ierta)

  • Din paragraful precedent rezultă:
    Interpolarea desenează grafică netedă cu ajutorul curbelor bezier

    Și așa, k am găsit; b știm de asemenea (vezi mai sus) și astfel linia pe care se află punctele de sprijin este cunoscută de noi.

    Căutăm puncte de referință

    Interpolarea desenează grafică netedă cu ajutorul curbelor bezier

    Un pic de matematică, ceea ce dovedește asta

    Din trigonometrie, ne amintim că:

    Dacă luăm [AC1] egal cu jumătate din pasul în X între punctele principale ale graficului (punctele B și A. A și C. etc.), atunci:

    Pentru plăcere!

    Exemplu de implementare pe JSFiddle