ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/acismesh/m2d_i_segment.cpp
Revision: 1
Committed: Mon Jun 11 22:53:07 2007 UTC (17 years, 11 months ago)
File size: 3508 byte(s)
Log Message:

File Contents

# Content
1 /*****************************************************************
2
3 m2d_i_segment.c Type:Func
4
5 Insertion d un nouveau segment
6
7 Date de creation : Wed Feb 26 15:54:11 1997
8
9 Derniere version : Wed May 28 11:50:10 1997
10
11
12
13
14
15
16
17
18
19
20
21 Vincent FRANCOIS
22
23 *****************************************************************/
24
25
26
27
28
29 /**************************/
30 /* include */
31 #include <stdio.h>
32 #include <math.h>
33 #include <stdlib.h>
34 #include "const.h"
35 #include "memoire.h"
36 #include "struct.h"
37 #include "prototype.h"
38
39 /**************************/
40 /* variables globales */
41 extern struct environnement env;
42 extern struct s_mesh *mesh;
43
44
45 /**************************/
46 /* programme principal */
47
48 int m2d_i_segment(struct s_face *face,struct s_segment **nv_seg,int n1,int n2,int type)
49 {
50 struct s_noeud *no1,*no2,*ac_no;
51 struct s_segment *ac_seg;
52 struct s_quadtree *quad;
53 float longueur;
54 float ui,vi,u1,v1,u2,v2,du,dv,uii,vii;
55 int i,j,res,num2,nb_liste;
56 struct s_quadtree **liste_quad;
57
58
59 no1=ADRESSE(n1,noeud,mesh->);
60 no2=ADRESSE(n2,noeud,mesh->);
61 /* decalage */
62 if (mesh->rev_u!=0.) du=0.5*mesh->rev_u-no1->u; else du=0.;
63 if (mesh->rev_v!=0.) dv=0.5*mesh->rev_v-no1->v; else dv=0.;
64 eval_decale(&u1,du,no1->u,U);
65 eval_decale(&v1,dv,no1->v,V);
66 eval_decale(&u2,du,no2->u,U);
67 eval_decale(&v2,dv,no2->v,V);
68
69 liste_quad=(struct s_quadtree **)calloc(mesh->nb_quadtree+1,sizeof(struct s_quadtree *));
70 ERREUR_ALLOC(liste_quad);
71 ui=0.5*(u1+u2);
72 vi=0.5*(v1+v2);
73 eval_decale(&uii,-du,ui,U);
74 eval_decale(&vii,-dv,vi,V);
75 longueur=(float)sqrt((double)((u2-u1)*(u2-u1)+(v2-v1)*(v2-v1)));
76 nb_liste=0;
77 qu_rechercher(ui-du,vi-dv,longueur/2.,mesh->root,liste_quad,&nb_liste);
78 for (j=0;j<nb_liste;j++)
79 {
80 quad=liste_quad[j];
81 for (i=0;i<quad->nb_segment;i++)
82 {
83 ac_seg=quad->segment[i];
84 if (((ac_seg->front>0)&&(type==FRONT)) || (type==TOUS))
85 {
86 if ( ((n1==ac_seg->n1) && (n2==ac_seg->n2)) || ((n1==ac_seg->n1) && (n2==ac_seg->n2)))
87 {
88 free(liste_quad);
89 return(0);
90 }
91 res=m2d_int_seg_seg(n1,n2,ac_seg->n1,ac_seg->n2);
92 if (res!=0)
93 {
94 free(liste_quad);
95 return(0);
96 }
97 }
98 }
99 }
100
101 free(liste_quad);
102 NEW_ENTITE(ac_seg,segment,mesh->);
103 ac_seg->n1=n1;
104 ac_seg->n2=n2;
105 ac_seg->num=mesh->nb_segment-1;
106 ac_seg->type=FACE;
107 ac_seg->num_ent=face->num;
108 ac_seg->longueur=eval_distance(face,u1,v1,u2,v2,du,dv);
109 qu_ins_obj(SEGMENT,ac_seg->num,mesh->root);
110 ac_no=ADRESSE(n1,noeud,mesh->);
111 NEW_POINTEUR(num2,segment,ac_no->);
112 ac_no->segment[num2]=ac_seg;
113 ac_no=ADRESSE(n2,noeud,mesh->);
114 NEW_POINTEUR(num2,segment,ac_no->);
115 ac_no->segment[num2]=ac_seg;
116 *nv_seg=ac_seg;
117 return(1);
118 }