Úvod

Aproximácia (interpolácia) je generujúci princíp, ktorý umožňuje modelovať súvislé oblúky čiar z diskrétnych usporiadaných množín bodov rozšíreného euklidovského priestoru. Vnútorné geometrické vlastnosti modelovaných čiar sú závislé od tvaru polynomických interpolačných funkcií určujúcich analytické reprezentácie modelovaných útvarov. Požadované geometrické vlastnosti stanovujú podmienky pre určenie koeficientov pri mocninách premennej u.

Interpolačné polynómy:

\[ Pl_i(u) = a_{in}u^n + a_{in-1}u{^n-1} + ... + a_{i1}u + a_{i0} \] Podmienka: súčet polynómov vzťahujúcich sa na vlastné body riadiaceho útvaru (v danom usporiadaní) sa rovná jednej.

Usporiadaná n-tica bodov: M

Matica interpolácie: I(u)

Modelovaný oblúk je určený bodovou funkciou na intervale <0,1> :

\[ r(u) = M.I^T(u) = \sum_{i=1}^n P_i Pl_i(u) = \left( \sum_{i=1}^nx_iPl_i(u),\sum_{i=1}^ny_iPl_i(u),\sum_{i=1}^nz_iPl_i(u),\sum_{i=1}^nh_iPl_i(u) \right) \]

Fergusonova kubika

Fergusonova kubika je interpolačná čiara určená začiatočným a koncovým bodom a vektormi dotyčníc v týchto bodoch. Interpolácia je určená kubickými Hermitovými polynómami. \[ F_0(u) = 2u^3 - 3u^2 + 1 \] \[ F_1(u) = -2u^3 + 3u^2 \] \[ G_0(u) = u^3 - 2u^2 + u \] \[ G_1(u) = u^3 - u^2 \]

F0 -> G1 sú Hermitove interpolačné polynómy, pričom \[ \sum_{i=1}^1 F_i = 1 \]

modelovaný útvar: \[ r(u) = M.I^T(u) = P_0F_0(u) + P_1F_1(u) + a_0G_0(u) + a_1G_1(u), u \in <0,1> \]

Výpočet

P0 <- c(0, 0, 1) # pociatocny bod (3. suradnica, znamena, ze je vlastny)
P1 <- c(4, 2, 1) # koncovy bod (3. suradnica, znamena, ze je vlastny)
a0 <- c(1, 3, 0) # vektor dotycnice (3. suradnica, znamena, ze je nevlastna)
a3 <- c(2, -4, 0) # vektor dotycnice (3. suradnica, znamena, ze je nevlastna)
#F0(u)= 2u^3 - 3u^2 + 1
#F1(u)= -2u^3 + 3u^2
#G0(u)= u^3 - 2u^2 + u
#G1(u)= u^3 - u^2
#x funkcia = 4*F1 + 1*G0 + 2*G1
dat <- data.frame(u=seq(0, 1, 0.01))
xCurve <- function(u) 4*(-2*u^3 + 3*u^2)+ 1*(u^3 - 2*u^2 + u)+ 2*(u^3 - u^2)
yCurve <- function(u) 2*(-2*u^3 + 3*u^2) + 3*(u^3 - 2*u^2 + u) -4*(u^3 - u^2)
dat$y=yCurve(dat$u)
dat$x=xCurve(dat$u)
with(dat, plot(x,y, type="l", col = "green"))

Bèzierova kubika (kubický aproximačný oblúk)

Bèzierova kubika je aproximačná čiara určená štyrmi vlastnými bodmi riadiaceho tvaru. Aproximácia je určená Bernštejnovými kubickými polynómami. \[ Be_{03}(u) = (1-u)^3 \] \[ Be_{13}(u) = 3u(1-u)^2 \] \[ Be_{23}(u) = 3u^2(1-u) \] \[ Be_{33}(u) = u^3 \]

Be03 -> Be33 sú Bernštejnove aproximačné polynómy, pričom \[ \sum_{i=1}^3 Be_{i3} = 1 \]

\[ Be_{in}(u)={n\choose i}u^i(1-u)^{n-i} \]pre n=3

modelovaný útvar: \[ r(u) = M.I^T(u) = P_0Be_{03}(u) + P_1Be_{13}(u) + P_2Be_{23}(u) + P_3Be_{33}(u), u \in <0,1> \]

Výpočet

P0 <- c(0, 0, 0, 1)
P1 <- c(1, 4, 0, 1)
P2 <- c(2, 3, 0, 1)
P3 <- c(3, -2, 0, 1)
#Be03(u)= (1-u)^3
#Be13(u)= 3*u*(1-u)^2
#Be23(u)= 3*u^2*(1-u)
#Be33(u)= u^3
#x funkcia = 1*Be1 + 2*Be2 + 3*Be3
dat <- data.frame(u=seq(0, 1, 0.01))
xCurve <- function(u) 3*u*(1-u)^2 + 2*3*u^2*(1-u) + 3*u^3
yCurve <- function(u) 4*u*(1-u)^2 + 3*3*u^2*(1-u) + -2*u^3
dat$y=yCurve(dat$u)
dat$x=xCurve(dat$u)
with(dat, plot(x,y, type="l", col = "red"))

BSpline krivka

B-splajn kubika je aproximačná čiara určená, rovnako ako bezierova, štyrmi vlastnými bodmi riadiaceho útvaru. Aproximácia je určená Coonsovými kubickými polynómami.

\[ Co_{03}(u) = -\frac{1}{6}u^3 + \frac{1}{2}u^2 + \frac{1}{2}u+ \frac{1}{6}\] \[ Co_{13}(u) = \frac{1}{2}u^3 - u^2 + \frac{2}{3}\] \[ Co_{23}(u) = -\frac{1}{2}u^3 + \frac{1}{2}u^2 + \frac{1}{2}u+ \frac{1}{6}\] \[ Co_{33}(u) = \frac{1}{6}u^3\]

Co03 -> Co33sú Coonsove aproximačné polynómy, pričom \[ \sum_{i=1}^3 Co_{i3} = 1 \]

Výpočet

P0 <- c(0, 0, 0, 1)
P1 <- c(1, 4, 0, 1)
P2 <- c(2, 3, 0, 1)
P3 <- c(3, -2, 0, 1)

#x funkcia = 1*Co1 + 2*Co2 + 3*co3
dat <- data.frame(u=seq(0, 1, 0.01))
xCurve <- function(u) (1/2)*u^3 - u^2 + 2/3 + 2*(-(1/2)*u^3 + (1/2)*u^2+ (1/2)*u+ (1/6)) +3*((1/6)*u^3)  
yCurve <- function(u) 4*((1/2)*u^3 - u^2 + 2/3) + 3*(-(1/2)*u^3 + (1/2)*u^2+ (1/2)*u+ (1/6)) -2*((1/6)*u^3)
dat$y=yCurve(dat$u)
dat$x=xCurve(dat$u)
with(dat, plot(x,y, type="l", col = "Blue"))