Az interpoláció a sima grafikát a bezier görbék segítségével rajzolja meg

A nap kedves ideje, harbachitatel.

A probléma megfogalmazása
Az X tengely mentén egyenletesen elhelyezkedő Y pontok sorozata van, és egy sima gráfra van szükség, amely átmegy az összes ponton. Példa az alábbi képre:

Az interpoláció a sima grafikát a bezier görbék segítségével rajzolja meg

Mindenki, aki érdekli, kérdezem a vágás alatt.

Számos szabványos megoldások egy sima görbe pontokon keresztül (ebben a tekintetben sok érdekes dolgot írt a már említett cikket), mint például a spline interpoláció. Amikor a harmadik során találták ezt az algoritmust, a „interpoláció” tölt el, horror, és gugleniya kérésre „kiegyenlítési grafikonok” nem ad eredményeket hatáskörben megértést. De valahogy eljutottam a Bezier-görbékhez, és nagyon tetszett nekik. Gyorsan rajzolódik, az algoritmus intuitív ... Mire van szükség a boldogsághoz? Nos, valahogy versenyzett.

A fő ötlet

Megszüntetem az ötletet három bekezdésbe, hogy érthetőbbé és érthetőbbé tegyem.

Az interpoláció a sima grafikát a bezier görbék segítségével rajzolja meg

  • Az A ponttól a B1 és C1 pontig terjedő távolságot úgy határozták meg, hogy a B és A pontok és az A és C pont közötti X lépésben megegyeznek. Nehéz nekem igazolni ezt a választást valahogy, de fontos, hogy ez a távolság kisebb, mint az A és a B pont közötti X lépés. Egyébként valami hasonló az alábbi képhez. Fontos megérteni, hogy minél nagyobb ez a távolság, annál nagyobb a csavarodás a görbe és fordítva. Az X-es lépés fél lépése számomra optimálisnak tűnik, de már léteznek lehetőségek.

    Az interpoláció a sima grafikát a bezier görbék segítségével rajzolja meg

    Így kiderül, hogy a probléma csökken az egyenes (B1 C1) és a B1 és C1 referenciapontok keresésére. amelyen később felépítjük a Bezier-görbéket.

    Közvetlen keresés

    Mint ismeretes, a síkban lévő vonalat az y = kx + b képlet adja meg. ahol k a vonal meredeksége az X tengelyhez, amikor k. majd tudva, hogy az egyenes vonal áthalad az A ponton és tudta a koordinátáit, könnyen megtalálhatjuk b. b = YA-kXA. Így minden a k koefficiens megtalálásához vezet.

    Keresse meg a k együtthatót

    Azt előre megmondani, hogy k = tg (φ) = tg ((α-β) / 2) = (SQRT ((AX 2 + (YA -YB) 2) * (AX 2 + (YA -YC) 2)) - ΔX 2 - (YA-YB) * (YA-YC)) / (ΔX * ((YA-YB) - (YA-YC))). ahol ΔX az X pont távolsága a pontok között (emlékszem arra, hogy pontunk egyenletesen eloszlik az X mentén). Az alábbiakban egy matematikai igazolás található a képlet helyességéről, de ha nem vagy a hangulatban, egyszerűen kihagyhatod.

    Az interpoláció a sima grafikát a bezier görbék segítségével rajzolja meg

    A k együttható matematikai származtatása

  • (6) ∠C1 AC = ∠C1 AD + ∠DAC = φ + ∠DAC
    (7) ∠DAC = ∠O2 CA = β - mint két párhuzamos (AD) és (O2 C) és secant (AC)

    Szögletes zárójelekkel a szegmens hossza (nem akartam függőleges egyenes vonalakat használni - remélem, hogy az olvasó megbocsát nekem)

  • Az előző albekezdésből az következik:
    Az interpoláció a sima grafikát a bezier görbék segítségével rajzolja meg

    És így találtunk; b mi is tudjuk (lásd fent), és így a vonal, amelyen a támogatási pontok hazugság ismert nekünk.

    Referenciapontokat keresünk

    Az interpoláció a sima grafikát a bezier görbék segítségével rajzolja meg

    Egy kis matematika, ami bizonyítja

    A trigonometria alapján emlékszünk arra, hogy:

    Ha az [AC1] -et egyenlítjük a grafikon fő pontjainak X lépése felénél (B, A és C pont stb.), Akkor:

    A kellemes!

    Példa végrehajtás a JSFiddle-en