NimicCurbă.Roteşte(Întreg nDeCâteOri) //roteşte o curbă cu nDeCâteOri paşi
{
PentruFiecare(Întreg nI = 1; nI < nNr; nI++)
{
PuneLa(nNr, [1]);
Şterge(1);
} //PentruFiecare
} //Roteşte
Real Curbă.AriaCuSemn() //returnează aria cu semn pentru a detecta direcţia
{
Real rAria = 0.0;
Punct pStart = [1], pEnd;
PentruFiecare(Întreg nI = 2; nI < nNr; nI++)
{
pEnd = [nI];
rAria = rAria + (pEnd.rX – pStart.rX) * (pEnd.rY + pStart.rY);
} //PentruFiecare
return(rAria / 2.0);
} //AriaCuSemn
NimicCurbă.FăTrigonometric() //transformă o curbă în sens trigonometric
{
Dacă(AriaCuSemn > 0.0)
SchimbăSensul();
} //FăTrigonometric
NimicCurbă.FăOrar() //transformă o curbă în sens orar
{
Dacă(AriaCuSemn < 0.0)
SchimbăSensul();
} //FăOrar
NimicFamiliaDeCurbe.FăTrigonometric() //transformă curbele în sens trigonometric
{
Curbă c;
PentruFiecare(Întreg nI = 1; nI < nNr; nI++)
{
c = [nI];
c.FăTrigonometric();
} //PentruFiecare
} //FăTrigonometric
NimicFamiliaDeCurbe.FăOrar() //transformă curbele în sens orar
{
Curbă c;
PentruFiecare(Întreg nI = 1; nI < nNr; nI++)
{
c = [nI];
c.FăOrar();
} //PentruFiecare
} //FăOrar
NimicFamiliaDeCurbe.Roteşte() //roteşte curbele până au punctul de start minim
{
Curbă cStart, cEnd;
cStart = [1];
PentruFiecare(Întreg nI = 2; nI < nNr; nI++)
{
cEnd = [nI];
pStart = cStart[1];
Întreg nRoteşte = 0;
Real rDist = 1e100;
PentruFiecare(Întreg nCurbă = 1; nCurbă < cEnd.nNr; nCurbă++)
{
pEnd = cEnd[nCurbă];
if (DistXYZ(pStart, pEnd) < rDist)
{
rDist = DistXYZ(pStart, pEnd);
nRoteşte = nCurbă;
} //Dacă
} //PentruFiecare
Roteşte(nRoteşte);
cStart = cEnd;
} //PentruFiecare
} //Roteşte
NimicFamiliaDeCurbe.Spirală(Întreg nPuncte = 100) //transformă curbele în spirale
{
Curbă cStart, cEnd;
cStart = [1];
PentruFiecare(Întreg nI = 2; nI < nNr; nI++)
{
cEnd = [nI];
PentruFiecare(Întreg nT = 2; nT < nPuncte; nT++)
{
pStart = cStart.IaDeLaT(nT/nPuncte);
pEnd = cEnd.IaDeLaT(nT/nPuncte);
Add(pStart + (pEnd - pStart) * nT / nPuncte);
} //PentruFiecare
cStart = cEnd;
} //PentruFiecare
} //Spirală
//transformă SDC în spirale
NimicSuprafaţăDiscretă.SpiraleleLuiBillator(FamiliaDeCurbe fcOut, Real rStep = 1.0)
{
SuprafaţăDiscretă sdTemp;
sdTemp.TransfEchirugozitate(sdAceasta, 255);
sdTemp.Înmoaie(5); //face media celor patru vecini de 5 ori creşte continuitatea !
sdtemp.CreazăToateCurbele(fcOut, rStep);
fcOut.FăOrar();
fcOut.Roteşte();
fcOut.Spirală();
ProiecteazăToateCurbele(fcOut); //citeşte cota Z !
} //SpiraleleLuiBillator
Aşa arată, în pseudocod, o versiune simpificată a calculului “Spiralelor lui Billator” (SLB), care suportă doar un singur maxim local pe SDER. De menţionat că, rezolvarea cazurilor cu multiple maxime locale este o problemă destul de complicată, care necesită liste de incluziune locală şi tehnici de “scanline“. Implemetarea algoritmului care rezolvă toate cazurile necesită mai mult de 40 pagini de pseudocod.
Câteva repere transformate în SLB şi frezate se pot observa în figurile următoare.
Figura 6.54 Un reper analizat în vederea frezării cu curbe echirugozitate.
-
curbele echirugozitate proiectate pe suprafaţa discretă corecţie de sculă (SDCS);
-
curbele transformate într-o spirală continuă şi proiectate pe SDCS (Spirala lui Billator);
-
simularea fişierului NC rezultant, cu varierea culorii din 5 în 5 spire.
Figura 6.55 Un reper analizat în vederea frezării cu curbe echirugozitate.
-
curbele echirugozitate proiectate pe suprafaţa discretă corecţie de sculă (SDCS);
-
curbele transformate într-o spirală continuă şi proiectate pe SDCS (Spirala lui Billator);
-
simularea fişierului NC rezultant, cu varierea culorii din 5 în 5 spire.
Figura 6.56 Un reper analizat în vederea frezării cu curbe echirugozitate.
-
curbele echirugozitate proiectate pe suprafaţa discretă corecţie de sculă (SDCS);
-
curbele transformate într-o spirală continuă şi proiectate pe SDCS (Spirala lui Billator);
-
simularea fişierului NC rezultant, cu varierea culorii din 5 în 5 spire.
F
Figura 6.57 Un reper analizat în vederea frezării cu curbe echirugozitate.
-
curbele echirugozitate proiectate pe suprafaţa discretă corecţie de sculă (SDCS);
-
curbele transformate într-o spirală continuă şi proiectate pe SDCS (Spirala lui Billator);
-
simularea fişierului NC rezultant, cu varierea culorii din 5 în 5 spire.
iecare reper a fost prezentat în trei ipostaze: momentul în care a fost convertit în curbe echirugozitate ordonate şi cu acelaşi sens (a), momentul în care a fost convertit în SLB (b), şi calitatea şi distribuţia rugozităţii, după ce a fost simulată o frezare cu fişierul NC generat din SLB (c).
Dostları ilə paylaş: |