NimicSuprafaţăDiscretă.InitCapDeSculă( //Crează SD bazându-se pe o geom. de sculă
Curbă cCapDeSculă, //Curba care descrie geometria capului
Real rPas //Pasul de discretizare
)
{
Real rRazaCurentă, rRaza = cCapDeSculă.IaDeLaX();
Întreg nNr = rRaza / rPas + 0.5;
Iniţializează(nNr, nNr, (-rRaza, -rRaza, 0.0), (rRaza, rRaza, 0.0), “Scula”);
m.PuneLaAll(FALS); //pune în toată masca fals
PentruFiecare(Întreg nI = 1; nI <= nX; nI++)
PentruFiecare(Întreg nJ = 1; nJ <= nY; nJ++)
{
rRazaCurentă = Sqrt(IndexÎnRealPtX(nI)* IndexÎnRealPtX(nI) + IndexÎnRealPtY(nJ) *
IndexÎnRealPtY(nJ));
Dacă(rRazaCurentă < rRaza)
{
PuneLa(nI, nJ, cCapDeSculă.IaDeLaY(rRazaCurentă));
m.PuneLa(ADEVĂRAT);
} //Dacă
} //PentruFiecare
} //EndInitCapDeSculă
Această metodă asigură crearea şi generarea sculelor pentru frezare. Similar se pot crea SD care conţin electrozi, la analizarea prelucrării prin electroeroziune.
2.2.9.Calculul SD înfăşurătoare şi SD de racordare statice
Principalii beneficiari ai capetelor de sculă sunt algoritmii de racordare şi de calcul ai înfăşurătoarei.
Dorind a trata generic problema, se poate spune că algoritmul enunţat în continuare calculează SD înfăşurătoare, pentru orice geometrie a SD şi a sculei, deci se poate vorbi de racordări care nu sunt sferice, ci de orice altă formă. Algoritmul are abilitatea de a calcula înfăşurătoarea şi a face calculul total de interferenţă într-un singur pas.
NimicSuprafaţăDiscretă.InitÎnfăşurătoareStatic( //înfăşoară în spaţiu o SD sculă
SuprafaţăDiscretă sdSupafaţa, //suprafaţa care trebuie înfăşurată
SuprafaţăDiscretă sdSculă, //geometria capului utilizat
Boolean bDirecţiaSus = ADEVĂRAT //înfăşurătoarea în sus sau în jos
Boolean bTotul = ADEVĂRAT //toată suprafaţa sau în mască
)
{
Real rtemp, rZ;
PentruFiecare(Întreg nSDX = 1; nSDX <= nX; nSDX++)
PentruFiecare(Întreg nSDY = 1; nSDY <= nY; nSDY++)
{
Dacă(bDirecţiaSus)
rTemp = -1e100;
Altfel
rTemp = 1e100;
PentruFiecare(Întreg nSCX = 1; nSCX <= nX; nSCX++)
PentruFiecare(Întreg nSCY = 1; nSCY <= nY; nSCY++)
Dacă(bTotul SAU sdSuprafaţa.m[nSCX, nSCY]) ŞI
sdSculă.m[nSCX, nSCY] ŞI nSDX + nSCX < nX ŞI nSDY + nSCY < nY)
Dacă(bDirecţiaSus)
{
rZ=sdSuprafaţă[nSDX+nSCX, nSDY+nSCY]+sdSCulă[nSCX, nSCY]);
Dacă(rZ > rTemp)
rTemp = rZ;
} //Dacă
Altfel
{
rZ=sdSuprafaţă[nSDX+nSCX, nSDY+nSCY]-sdSCulă[nSCX, nSCY]);
Dacă(rZ < rTemp) rTemp = rZ;
} //Altfel
PuneLa(nSDX, nSDY, rTemp);
} //PentruFiecare
} //EndInitCapDeSculăStatic
Se poate observa uşor că algoritmul este de complexitate O(n4) (patru cicluri PentruFiecare), deci presupune calcule îndelungate. În prezent, autorul foloseşte o versiune mult îmbunătăţită (de peste 10 ori mai rapidă), dar complexitatea acestuia depăşeşte cadrul lucrării. Timpul necesar algoritmului prezentat este de domeniul zecilor de minute, pentru o reprezentare de 1000 x 1000 mm şi o sculă de 50 x 50 mm, iar cu cel optimizat, de numai 2 minute. Aceste tipuri de optimizări ar conduce la o implementare de peste 1000 de linii de cod, ceea ce ar reduce destul de mult simplitatea algoritmului prezentat.
Calculul suprafeţei de racordare se execută la fel, dar în direcţia opusă, folosind pentru acesta comutatorul bDirecţiaSus.
Calculul înfăşurătoarei utilizând o mască se poate face cu acelaşi algoritm, folosind comutatorul bTotul.
Calculul suprafeţei de racordare este simplu. De menţionat că suprafaţa de racordare cu o sculă statică (care nu-şi modifică diametrul) este utilizată în fabricaţie la simularea suprafeţei teoretice de contact (backoffset), care reprezintă suprafaţa teoretică absolută ce poate fi obţinută, folosind o sculă de orice formă şi luând în considerare calculul total de interferenţă. Făcând o diferenţă discretă între suprafaţa de racordare şi cea normală se va obţine suprafaţa cu materialul nefrezabil.
NimicSuprafaţăDiscretă.InitRacordareStatic( //înfăşoară în spaţiu o SD sculă
SuprafaţăDiscretă sdSupafaţa, //suprafaţa care trebuie înfăşurată
SuprafaţăDiscretă sdScalare, //geometria coeficienţilor de scalare
SuprafaţăDiscretă sdSculă, //geometria capului utilizat
Boolean bDirecţiaSus //înfăşurătoarea în sus sau în jos
Boolean bTotul //toată suprafaţa sau în mască
)
{
SuprafaţăDiscretă sdTemp;
sdTemp.InitÎnfăşurătoareStatic(sdSupafaţa, sdScalare, sdSculă, bDirecţiaSus, bTotul);
InitÎnfăşurătoareStatic(sdTemp, sdScalare, sdSculă, !bDirecţiaSus, bTotul);
} //EndInitRacordareStatic
Dostları ilə paylaş: |