1 |
|
1 |
/*****************************************************************
|
2 |
|
|
|
3 |
|
|
r3d_comp_face.c Type:Func
|
4 |
|
|
|
5 |
|
|
Comparaison des faces d une octree
|
6 |
|
|
|
7 |
|
|
Date de creation : Wed Jul 23 14:45:18 1997
|
8 |
|
|
|
9 |
|
|
Derniere version : Thu Jul 24 11:49:11 1997
|
10 |
|
|
|
11 |
|
|
|
12 |
|
|
|
13 |
|
|
Vincent FRANCOIS
|
14 |
|
|
|
15 |
|
|
*****************************************************************/
|
16 |
|
|
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
|
20 |
|
|
|
21 |
|
|
/**************************/
|
22 |
|
|
/* include */
|
23 |
|
|
#include <stdio.h>
|
24 |
|
|
#include <string.h>
|
25 |
|
|
#include <math.h>
|
26 |
|
|
#include "const.h"
|
27 |
|
|
#include "memoire.h"
|
28 |
|
|
#include "struct.h"
|
29 |
|
|
#include "prototype.h"
|
30 |
|
|
|
31 |
|
|
/**************************/
|
32 |
|
|
/* variables globales */
|
33 |
|
|
extern struct s_acis *acis;
|
34 |
|
|
extern struct environnement env;
|
35 |
|
|
extern struct s_mesh *mesh;
|
36 |
|
|
extern struct s_param *para;
|
37 |
|
|
|
38 |
|
|
|
39 |
|
|
|
40 |
|
|
/**************************/
|
41 |
|
|
/* programme principal */
|
42 |
|
|
|
43 |
|
|
void r3d_comp_face(struct s_octree *oct,int nb_face,float dens)
|
44 |
|
|
{
|
45 |
|
|
int num,nb_entite,j,ok,k,type;
|
46 |
|
|
struct s_face *face;
|
47 |
|
|
struct s_plane *plane;
|
48 |
|
|
struct s_cone *cone;
|
49 |
|
|
char type_entite[20],mess[255];
|
50 |
|
|
float dir[4],ox[4],oy[4],oz[4],carac[20],vec[4],vec2[4],ps1,ps2;
|
51 |
|
|
struct r_face l_face[20];
|
52 |
|
|
int l_body[2];
|
53 |
|
|
|
54 |
|
|
|
55 |
|
|
nb_entite=0;
|
56 |
|
|
for (j=0;j<oct->nb_face;j++)
|
57 |
|
|
{
|
58 |
|
|
face=oct->face[j];
|
59 |
|
|
if (strcmp(acis->type_entite[face->surface],"plane-surface")==0)
|
60 |
|
|
{
|
61 |
|
|
plane=(struct s_plane *)acis->entity[face->surface];
|
62 |
|
|
memcpy(dir,plane->normal,3*sizeof(float));
|
63 |
|
|
eval_vecteur(dir);
|
64 |
|
|
l_face[nb_entite].nb_carac=3;
|
65 |
|
|
l_face[nb_entite].type=PLANE;
|
66 |
|
|
l_face[nb_entite].gtrouve=0;
|
67 |
|
|
l_face[nb_entite].num=face->num;
|
68 |
|
|
memcpy(l_face[nb_entite].carac,dir,3*sizeof(float));
|
69 |
|
|
memcpy(l_face[nb_entite].carac+3,plane->root,3*sizeof(float));
|
70 |
|
|
}
|
71 |
|
|
if (strcmp(acis->type_entite[face->surface],"cone-surface")==0)
|
72 |
|
|
{
|
73 |
|
|
cone=(struct s_cone *)acis->entity[face->surface];
|
74 |
|
|
memcpy(ox,cone->param->u,3*sizeof(float));
|
75 |
|
|
memcpy(oy,cone->param->v,3*sizeof(float));
|
76 |
|
|
memcpy(oz,cone->param->w,3*sizeof(float));
|
77 |
|
|
eval_vecteur(ox);
|
78 |
|
|
eval_vecteur(oy);
|
79 |
|
|
eval_vecteur(oz);
|
80 |
|
|
l_face[nb_entite].nb_carac=10;
|
81 |
|
|
l_face[nb_entite].type=CONE;
|
82 |
|
|
l_face[nb_entite].gtrouve=0;
|
83 |
|
|
l_face[nb_entite].num=face->num;
|
84 |
|
|
memcpy(l_face[nb_entite].carac,ox,3*sizeof(float));
|
85 |
|
|
memcpy(l_face[nb_entite].carac+3,oy,3*sizeof(float));
|
86 |
|
|
memcpy(l_face[nb_entite].carac+6,oz,3*sizeof(float));
|
87 |
|
|
l_face[nb_entite].carac[9]=cone->param->tg;
|
88 |
|
|
l_face[nb_entite].carac[10]=cone->param->a;
|
89 |
|
|
l_face[nb_entite].carac[11]=cone->param->b;
|
90 |
|
|
memcpy(l_face[nb_entite].carac+12,cone->param->centre,3*sizeof(float));
|
91 |
|
|
}
|
92 |
|
|
nb_entite++;
|
93 |
|
|
}
|
94 |
|
|
|
95 |
|
|
for (j=0;j<nb_face;j++)
|
96 |
|
|
{
|
97 |
|
|
r3d_file(mess);
|
98 |
|
|
sscanf(mess,"%s",type_entite);
|
99 |
|
|
if (strcmp(type_entite,"PLANE")==0)
|
100 |
|
|
{
|
101 |
|
|
sscanf(mess,"%s %d %f %f %f %f %f %f",type_entite,&num,&carac[3],&carac[4],&carac[5],&carac[0],&carac[1],&carac[2]);
|
102 |
|
|
type=PLANE;
|
103 |
|
|
}
|
104 |
|
|
if (strcmp(type_entite,"CONE")==0)
|
105 |
|
|
{
|
106 |
|
|
sscanf(mess,"%s %d %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",type_entite,&num,&carac[12],&carac[13],&carac[14],&carac[10],&carac[0],&carac[1],&carac[2],&carac[11],&carac[3],&carac[4],&carac[5],&carac[6],&carac[7],&carac[8],&carac[9]);
|
107 |
|
|
type=CONE;
|
108 |
|
|
}
|
109 |
|
|
ok=0;
|
110 |
|
|
for (k=0;k<nb_entite;k++)
|
111 |
|
|
{
|
112 |
|
|
if (ok==0)
|
113 |
|
|
if (l_face[k].gtrouve==0)
|
114 |
|
|
if (type==l_face[k].type)
|
115 |
|
|
if ( ((l_face[k].nb_carac>0) && (EGAL(carac[0],l_face[k].carac[0],0.0001))) || (l_face[k].nb_carac<1) )
|
116 |
|
|
if ( ((l_face[k].nb_carac>1) && (EGAL(carac[1],l_face[k].carac[1],0.0001))) || (l_face[k].nb_carac<2) )
|
117 |
|
|
if ( ((l_face[k].nb_carac>2) && (EGAL(carac[2],l_face[k].carac[2],0.0001))) || (l_face[k].nb_carac<3) )
|
118 |
|
|
if ( ((l_face[k].nb_carac>3) && (EGAL(carac[3],l_face[k].carac[3],0.0001))) || (l_face[k].nb_carac<4) )
|
119 |
|
|
if ( ((l_face[k].nb_carac>4) && (EGAL(carac[4],l_face[k].carac[4],0.0001))) || (l_face[k].nb_carac<5) )
|
120 |
|
|
if ( ((l_face[k].nb_carac>5) && (EGAL(carac[5],l_face[k].carac[5],0.0001))) || (l_face[k].nb_carac<6) )
|
121 |
|
|
if ( ((l_face[k].nb_carac>6) && (EGAL(carac[6],l_face[k].carac[6],0.0001))) || (l_face[k].nb_carac<7) )
|
122 |
|
|
if ( ((l_face[k].nb_carac>7) && (EGAL(carac[7],l_face[k].carac[7],0.0001))) || (l_face[k].nb_carac<8) )
|
123 |
|
|
if ( ((l_face[k].nb_carac>8) && (EGAL(carac[8],l_face[k].carac[8],0.0001))) || (l_face[k].nb_carac<9) )
|
124 |
|
|
if ( ((l_face[k].nb_carac>9) && (EGAL(carac[9],l_face[k].carac[9],0.0001))) || (l_face[k].nb_carac<10) )
|
125 |
|
|
{
|
126 |
|
|
if (type==PLANE)
|
127 |
|
|
{
|
128 |
|
|
vec[0]=carac[0];vec[1]=carac[1];vec[2]=carac[2];
|
129 |
|
|
vec2[0]=carac[3]-l_face[k].carac[3];
|
130 |
|
|
vec2[1]=carac[4]-l_face[k].carac[4];
|
131 |
|
|
vec2[2]=carac[5]-l_face[k].carac[5];
|
132 |
|
|
ps1=PSCA(vec,vec2);
|
133 |
|
|
ps2=0.;
|
134 |
|
|
}
|
135 |
|
|
if (type==CONE)
|
136 |
|
|
{
|
137 |
|
|
ps1=carac[10]*l_face[k].carac[11]-carac[11]*l_face[k].carac[10];
|
138 |
|
|
vec2[0]=carac[12]-l_face[k].carac[12];
|
139 |
|
|
vec2[1]=carac[13]-l_face[k].carac[13];
|
140 |
|
|
vec2[2]=carac[14]-l_face[k].carac[14];
|
141 |
|
|
ps2=(float)sqrt((double)PSCA(vec2,vec2));
|
142 |
|
|
ps2=carac[10]-ps2*carac[9]-l_face[k].carac[10];
|
143 |
|
|
}
|
144 |
|
|
if (EGAL(ps1,0.,0.0001))
|
145 |
|
|
if (EGAL(ps2,0.,0.0001))
|
146 |
|
|
{
|
147 |
|
|
ok=1;
|
148 |
|
|
l_face[k].gtrouve=1;
|
149 |
|
|
}
|
150 |
|
|
}
|
151 |
|
|
}
|
152 |
|
|
if (ok==0) r3d_zone(ORIGINAL,OLD,oct,dens,FACE,num,0,l_body);
|
153 |
|
|
}
|
154 |
|
|
|
155 |
|
|
for (k=0;k<nb_entite;k++)
|
156 |
|
|
if (l_face[k].gtrouve==0)
|
157 |
|
|
r3d_zone(RETARDE3,NEW,oct,dens,FACE,l_face[k].num,0,l_body);
|
158 |
|
|
|
159 |
|
|
|
160 |
|
|
|
161 |
|
|
|
162 |
|
|
return;
|
163 |
|
|
}
|