Punct pCurent;
Curbă cInterpolator;
fnFuncţia.Iniţializează(strFuncţia); //Iniţializează funcţia cu expresia dată
PentruFiecare(Întreg nI = 1; nI <= nX; nI++)
{
cInterpolator.Şterge();
PentruFiecare(Întreg nJ = 1; nJ <= nY; nJ++)
Dacă(sdSecţiuni.m[nI, nJ])
{
pCurent(0, IndexÎnRealPtY(nJ), sdSecţiuni[nI, nJ])
cInterpolator.Adună(pCurent);
} //Dacă
cInterpolator.Interpolează(nY, nOrdinCurbei); //interpolează
PentruFiecare(Întreg nJ = 1; nJ <= nY; nJ++)
Dacă(bTotul SAU m[nI, nJ])
PuneLa(nI, nJ, cInterpolator[nJ], nModulDePunere);
} //PentruFiecare
} //PuneInterpolareXDir
NOTĂ: Se poate observa că s-au folosit două noi metode ale clasei Curbă, una care crează şi interpolează o curbă cunoscând un set de puncte de control şi o alta care şterge toate punctele dintr-o listă cu puncte. De asemennea, funcţia geamănă PuneInterpolareYDir nu a fost prezentată.
Algoritmii din această familie pot fi găsiţi ca produs shareware la adresa ftp.simtel.net\pub\msdos\cad\tmesh0.zip sau ftp.simtel.net\pub\msdos\cad\tpck20lt.zip şi sunt descrişi pe larg în [DM05..DM11].
Figura 4.13 Interpolare prin secţiuni pe SD
-
interpolare liniară
-
interpolare cubică
-
diferenţa dintre cele două
Exemple procesate utilizând TechnoCAD V2.0 si DSView V1.0.
În figurile următoare se pot observa diferenţele, pentru acelaşi set de curbe de control (o linie înclinată la –100.0 un V la 0.0 şi un sinus la 100.0): două interpolări - una liniară (a), una superioară de ordinul trei (b) şi diferenţa relativă dintre cele două (c) - nuanţele de albastru sunt utilizate pentru a figura valoarea abaterii negative, nuanţele de verde sunt înspre zero roşu înspre plus (palete de analiză standard curcubeu).
Dostları ilə paylaş: |