1 |
/*****************************************************************
|
2 |
|
3 |
o3d_cal_qual.cpp Type:Func
|
4 |
|
5 |
Calcul de la qualite 3D non algebrique
|
6 |
|
7 |
Date de creation : 9-9-1997 11 :6 :23
|
8 |
Derniere version : 9-9-1997 11 :6 :23
|
9 |
|
10 |
Vincent FRANCOIS
|
11 |
|
12 |
*****************************************************************/
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
/**************************/
|
19 |
/* include */
|
20 |
#include <stdio.h>
|
21 |
#include <math.h>
|
22 |
#include "const.h"
|
23 |
#include "struct.h"
|
24 |
#include "memoire.h"
|
25 |
#include "prototype.h"
|
26 |
|
27 |
/**************************/
|
28 |
/* variables globales */
|
29 |
extern struct environnement env;
|
30 |
extern struct s_mesh *mesh;
|
31 |
|
32 |
|
33 |
|
34 |
/**************************/
|
35 |
/* programme principal */
|
36 |
|
37 |
float o3d_cal_qual(int n1,int n2,int n3,int n4)
|
38 |
{
|
39 |
struct s_noeud *no1,*no2,*no3,*no4;
|
40 |
float x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,crits;
|
41 |
double ab[4],ac[4],cb[4],dac,dab,dcb,dmax,crit;
|
42 |
double db[4],da[4],dc[4],dda,ddb,ddc,pvec[4],vol,som;
|
43 |
|
44 |
no1=ADRESSE(n1,noeud,mesh->);
|
45 |
no2=ADRESSE(n2,noeud,mesh->);
|
46 |
no3=ADRESSE(n3,noeud,mesh->);
|
47 |
no4=ADRESSE(n4,noeud,mesh->);
|
48 |
x1=no1->x;y1=no1->y;z1=no1->z;
|
49 |
x2=no2->x;y2=no2->y;z2=no2->z;
|
50 |
x3=no3->x;y3=no3->y;z3=no3->z;
|
51 |
x4=no4->x;y4=no4->y;z4=no4->z;
|
52 |
ab[0]=x2-x1;ab[1]=y2-y1;ab[2]=z2-z1;
|
53 |
ac[0]=x3-x1;ac[1]=y3-y1;ac[2]=z3-z1;
|
54 |
cb[0]=x2-x3;cb[1]=y2-y3;cb[2]=z2-z3;
|
55 |
db[0]=x2-x4;db[1]=y2-y4;db[2]=z2-z4;
|
56 |
da[0]=x1-x4;da[1]=y1-y4;da[2]=z1-z4;
|
57 |
dc[0]=x3-x4;dc[1]=y3-y4;dc[2]=z3-z4;
|
58 |
dab=sqrt(ab[0]*ab[0]+ab[1]*ab[1]+ab[2]*ab[2]);
|
59 |
dac=sqrt(ac[0]*ac[0]+ac[1]*ac[1]+ac[2]*ac[2]);
|
60 |
dcb=sqrt(cb[0]*cb[0]+cb[1]*cb[1]+cb[2]*cb[2]);
|
61 |
ddb=sqrt(db[0]*db[0]+db[1]*db[1]+db[2]*db[2]);
|
62 |
dda=sqrt(da[0]*da[0]+da[1]*da[1]+da[2]*da[2]);
|
63 |
ddc=sqrt(dc[0]*dc[0]+dc[1]*dc[1]+dc[2]*dc[2]);
|
64 |
dmax=dab;
|
65 |
if (dac>dmax)dmax=dac;
|
66 |
if (dcb>dmax)dmax=dcb;
|
67 |
if (ddb>dmax)dmax=ddb;
|
68 |
if (dda>dmax)dmax=dda;
|
69 |
if (ddc>dmax)dmax=ddc;
|
70 |
PVEC(pvec,ab,ac);
|
71 |
vol=pvec[0]*da[0]+pvec[1]*da[1]+pvec[2]*da[2];
|
72 |
vol=fabs(vol);
|
73 |
NORME(pvec);
|
74 |
som=pvec[3]/2.;
|
75 |
PVEC(pvec,ab,da);
|
76 |
NORME(pvec);
|
77 |
som=som+pvec[3]/2.;
|
78 |
PVEC(pvec,ac,dc);
|
79 |
NORME(pvec);
|
80 |
som=som+pvec[3]/2.;
|
81 |
PVEC(pvec,cb,db);
|
82 |
NORME(pvec);
|
83 |
som=som+pvec[3]/2.;
|
84 |
crit = vol/som ;
|
85 |
crit = (crit/dmax)/0.408249 ;
|
86 |
crits=(float)crit;
|
87 |
return(crits) ;
|
88 |
}
|