PDA

Voir la version complète : Calcul des normales en COFFEE



César Vonc
09/12/2011, 22h51
Bonjour,

Je vous partage un petit script COFFEE qui calcule les normales des sommets, des polygones, ainsi que le centre de chaque polygone.

J'en suis assez satisfait dans la mesure où une seule boucle permet le calcul de ces données.



ptGlob(obj, pt) {
return obj->GetMg()->GetMulP(obj->GetPoint(pt));
}

main(doc, op)
{
if (!op) return;

var opNpol = op->GetPolygonCount();
var opNpt = op->GetPointCount();

var opNorPol = new(array, opNpol); // Tableau des normales des polys
var opNorPt = new(array, opNpt); // Tableau des normales des sommets
var opPosPol = new(array, opNpol); // Tableau de la position des polys

var i;
for (i = 0 ; i < opNpol ; i++) {
var poly = op->GetPolygon(i);
var ptnA = poly->a; // Indice du sommet
var ptnB = poly->b;
var ptnC = poly->c;
var ptnD = poly->d;

var ptnAp = ptGlob(op, ptnA); // Position globale du sommet
var ptnBp = ptGlob(op, ptnB);
var ptnCp = ptGlob(op, ptnC);
var ptnDp = ptGlob(op, ptnD);

opNorPol[i] = vcross((ptnAp - ptnCp) , (ptnBp - ptnDp)); // Normale du polygone

if (!opNorPt[ptnA]) opNorPt[ptnA] = opNorPol[i]; // Normale du sommet
else opNorPt[ptnA] += opNorPol[i];
if (!opNorPt[ptnB]) opNorPt[ptnB] = opNorPol[i];
else opNorPt[ptnB] += opNorPol[i];
if (!opNorPt[ptnC]) opNorPt[ptnC] = opNorPol[i];
else opNorPt[ptnC] += opNorPol[i];
if (!opNorPt[ptnD]) opNorPt[ptnD] = opNorPol[i];
else opNorPt[ptnD] += opNorPol[i];

if (ptnD == ptnC) opPosPol[i] = (ptnAp + ptnBp + ptnCp)/3; // Calcul du centre du polygone, si c'est un triangle...
else opPosPol[i] = (ptnAp + ptnBp + ptnCp + ptnDp)/4; // ...ou un quadrangle.

}

// Le tableau opNorPol contient maintenant le vecteur normale de chaque polygone.
// Le tableau opNorPt contient maintenant le vecteur normale de chaque sommet.
// Le tableau opPosPol contient maintenant les coordonnées du centre de chaque polygone.

}
Pour ceux qui se demandent ce que c'est, ou bien à quoi ça peut bien servir, voici une petite application :

Les normales des sommets sont les cônes bleus, et ceux des polygones sont les rouges.
Les normales des sommets sont la moyenne de celles des polygones avoisinant.

clemz
10/12/2011, 11h49
merci César :) . J'avais jamais manipulé les polygones en Coffee , je découvre les fonctions grace à toi là ( notamment les points bordants les polys )

intéressant ta manière de calculer la normales sur les sommets :) .