NimicCDiscretSurface.AdunăCurbă(FamiliaDeCurbe fcOut, int nX, nY)
{
//prea laboriosă pentru a fi descrisă.
} //EndAdunăCurbă
NimicCDiscretSurface.CreazăCurbe(FamiliaDeCurbe fcOut, Real rPentruZ)
{
//y0
PentruFiecare(Întreg nI = 1; nI < nX; nI++)
Dacă ([nI, 0] > rPentruZ ŞI [nI + 1, 0] < rPentruZ SAU
[nI, 0] < rPentruZ ŞI [nI + 1, 0] > rPentruZ)
AdunăCurbă(fcOut, nI, 0);
//y max
PentruFiecare(Întreg nI = 1; nI < nX; nI++)
Dacă ([nI, nNrY] > rPentruZ ŞI [nI + 1, nNrY] < rPentruZ SAU
[nI, nNrY] < rPentruZ ŞI [nI + 1, nNrY] > rPentruZ)
AdunăCurbă(fcOut, nI, nNrY);
//x 0
PentruFiecare(Întreg nJ = 1; nJ < nY; nJ++)
Dacă ([0, nJ] > rPentruZ ŞI [0, nJ] < rPentruZ SAU
[0, nJ] < rPentruZ ŞI [0, nJ] > rPentruZ)
AdunăCurbă(fcOut, 0, nJ);
//x max
PentruFiecare(Întreg nJ = 1; nJ < nY; nJ++)
Dacă ([nNrX, nJ] > rPentruZ ŞI [nNrX, nJ] < rPentruZ SAU
[nNrX, nJ] < rPentruZ ŞI [nNrX, nJ] > rPentruZ)
AdunăCurbă(fcOut, nNrX, nJ);
//curbele închise interioare
PentruFiecare(Întreg nI = 2; nI < nX-1; nI++)
PentruFiecare(Întreg nJ = 2; nJ < nY-1; nJ++)
AdunăCurbă(fcOut, nI, nJ);
} //EndCreazăCurbe
NimicCDiscretSurface.CreazăToateCurbele( //crează toate curbele
FamiliaDeCurbe fcOut, //locul unde sunt stocate curbele
Real rZStep = 1.0, //pasul
Boolean bAuto = ADEVĂRAT, //dacă calculează automat cotele de start şi sfârşit
Real rZStart = 0.0, //cota de pornire
Real rZEnd = 10.0) //cota de oprire
{
Dacă(bAuto)
{
rZStart = pMax.rZ; //atribuie automat Z maxim
rZEnd = pMin.rZ; //atribuie automat Z minim
}
PentruFiecare(Real rZ = rZStart; rZ < rZEnd; rZ += rZStep)
CreazăCurbe(fcOut, rZ);
} //EndCreazăToateCurbele
NOTĂ: Detaliile de implementare a metodei AdunăCurbă() nu au fost expuse, deoarece metoda este destul de simplă, dar lungă; ea se bazează pe conceptele expuse la începutul capitolului.
3.2.2.Proiectarea unei familii de curbe pe suprafaţa discretă
Această metodă dă consistenţă şi generalitate algoritmului de conversie în curbe echipotenţiale şi deschide posibilităţi nelimitate pentru toţi algoritmii de generare a fişierului NC prin tehnici proiective (spirale, radiale, offset, morf etc).
Tehnica este destul de simplă şi este expusă în continuare:
NimicCDiscretSurface.ProiecteazăCurbă(Curbă cProiectează)
{
PentruFiecare(Întreg nI = 1; nI < c.nNr; nI++)
{
Punctp = cProiectează[nI];
p.rZ = IaDeLaR(p.rX, p.rY);
cProiectează.PuneLa(nI, p);
} //PentruFiecare
} //EndProiecteazăCurbă
NimicCDiscretSurface.ProiecteazăCurbe(FamiliaDeCurbe fcProiectează)
{
PentruFiecare(Întreg nI = 1; nI < c.nNr; nI++)
ProiecteazăCurbă(fcProiectează[nI])
} //EndProiecteazăCurbe
Notă: algoritmul expus proiectează doar noduri; în mod similar se poate descrie un algoritm care proiectează toate liniile, cu un anumit pas dat; un exemplu despre cele două familii de algoritmi, cel de conversie în curbe echipotenţiale a unei SD, după care proiectarea pe o altă SD, se prezintă în figura 5.3.
Figura 5.24 Exemplu de conversie echipotenţială şi proiecţie pe SD, cu EdgeCAM V3.0
3.2.3.Offset pe SD
O
Figura 5.25 Exemplificarea algoritmului de offset inteligent pe suprafaţa discretă. Procesări făcute pe repere importate din diferite sisteme CAD/CAM, pornind de la dreptunghi sau de la drepte paralele
ffsetul sau echidistanţarea unei curbe pe o SD este deosebit de utilă pentru generarea fişierelor NC de frezare cu rugozitate constantă (cea mai eficientă metodă de frezare). Algoritmul va fi prezentat în detaliu în subcapitolul “Calculul curbelor echirugozitate”. Câteva exemple ale conceptului se pot observa în următoarea figură, unde se prezintă, în nuanţe diferite, offsetarea pe SD a unui dreptunghi sau a două drepte paralele.
Dostları ilə paylaş: |