MIDAS  0.75
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros
dupl.cpp
Go to the documentation of this file.
1 #include "dupl.h"
2 
3 #include "geometry.h"
4 
5 #include "mathlib.h"
6 
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <math.h>
10 
11 
12 namespace midaspace {
13 
17 
18 void DuplicatePoints :: add_point_to_cell (long id, long pos[])
19 {
20  int *ccellp = ccellpoints[pos[0]][pos[1]][pos[2]];
21  long *cellp = cellpoints[pos[0]][pos[1]][pos[2]];
22 
23  if (ccellp == NULL) {
24  ccellp = new int;
25  *ccellp = 0;
26  }
27  allocate_another_val (*ccellp, cellp);
28 
29  cellp[*ccellp] = id;
30  (*ccellp)++;
31 
32  ccellpoints[pos[0]][pos[1]][pos[2]] = ccellp;
33  cellpoints [pos[0]][pos[1]][pos[2]] = cellp;
34 }
35 
36 bool DuplicatePoints :: point_is_in_cell (long id, long pos[], double offset)
37 {
38  if (pos[0]==-1 || pos[1]==-1 || pos[2]==-1 ) return false;
39  if (pos[0]==cc[0] || pos[1]==cc[1] || pos[2]==cc[2]) return false;
40 
41  if ( points[id]->x > (mincoo[0] + pos[0]*dcoo[0] - offset) && points[id]->x < (mincoo[0] + (pos[0]+1)*dcoo[0] + offset) &&
42  points[id]->y > (mincoo[1] + pos[1]*dcoo[1] - offset) && points[id]->y < (mincoo[1] + (pos[1]+1)*dcoo[1] + offset) &&
43  points[id]->z > (mincoo[2] + pos[2]*dcoo[2] - offset) && points[id]->z < (mincoo[2] + (pos[2]+1)*dcoo[2] + offset) )
44  return true;
45 
46  return false;
47 }
48 
50 {
51  long i,j, k, l, m;
52 
53  // set boundary box
54  for (i=0; i<3; i++) {
55  mincoo[i] = (*points[0])[i];
56  maxcoo[i] = (*points[0])[i];
57  }
58 
59  for (i=1; i<np; i++)
60  for (j=0; j<3; j++)
61  if (mincoo[j] > (*points[i])[j]) mincoo[j] = (*points[i])[j];
62  else if (maxcoo[j] < (*points[i])[j]) maxcoo[j] = (*points[i])[j];
63 
64  for (i=0; i<3; i++) {
65  mincoo[i] -= 1.2*Zero_dist; // az to bude chodit, tak tady dej 1.2*Zero_dist misto Zero
66  maxcoo[i] += 1.2*Zero_dist; // !!!!!!!!!!
67  }
68 
69  // set count of cells in direction of axes
70  for (i=0; i<3; i++) {
71  cc[i] = 1 + (maxcoo[i] - mincoo[i]) / averdist;
72  dcoo[i] = (maxcoo[i] - mincoo[i]) / cc[i];
73  }
74 
75  // alloc cellpoints
76  allocate (ccellpoints, cc[0], cc[1], cc[2]);
77  allocate ( cellpoints, cc[0], cc[1], cc[2]);
78  fill_all_by (ccellpoints, cc[0], cc[1], cc[2], (int*)NULL);
79  fill_all_by ( cellpoints, cc[0], cc[1], cc[2], (long*)NULL);
80 
81  // allocate points to cells
82  long pos[3],pos2[3]; // position
83  for (i=0; i<np; i++) {
84  for (j=0; j<3; j++)
85  pos[j] = ((*points[i])[j] - mincoo[j]) / dcoo[j] ;
86 
87  add_point_to_cell (i, pos);
88 
89  if (! point_is_in_cell (i, pos, -1.1*Zero_dist))
90  for (k=-1; k<2; k++) {
91  pos2[0] = pos[0] + k;
92  for (l=-1; l<2; l++) {
93  pos2[1] = pos[1] + l;
94  for (m=-1; m<2; m++) {
95  pos2[2] = pos[2] + m;
96 
97  if (k==0 && l==0 && m==0) continue;
98 
99  if (point_is_in_cell (i, pos2, 1.1*Zero_dist))
100  add_point_to_cell (i, pos2);
101  }
102  }
103  }
104  }
105 
106  // print
107  if (PRINT) {
108  long aux;
109 
110  fprintf (stdout,"\n Class DuplicatePoints - control print START \n\n");
111 
112  fprintf (stdout," mincoo = [%lf][%lf][%lf]\n",mincoo[0],mincoo[1],mincoo[2]);
113  fprintf (stdout," maxcoo = [%lf][%lf][%lf]\n",maxcoo[0],maxcoo[1],maxcoo[2]);
114  fprintf (stdout," cc = [%ld][%ld][%ld]\n",cc[0],cc[1],cc[2]);
115  for (k=0; k<cc[0]; k++)
116  for (l=0; l<cc[1]; l++)
117  for (m=0; m<cc[2]; m++) {
118  if (ccellpoints[k][l][m] == NULL) aux = 0;
119  else aux = ccellpoints[k][l][m][0];
120 
121  fprintf (stdout," cc[%ld][%ld][%ld] :: ccellps %ld cellps ", k,l,m, aux);
122 
123  for (i=0; i<aux; i++)
124  fprintf (stdout," %ld", cellpoints[k][l][m][i]+1);
125 
126  fprintf (stdout,"\n");
127 
128  }
129 
130  fprintf (stdout,"\n Class DuplicatePoints - control print END \n");
131 
132  }
133 }
134 
139 void DuplicatePoints :: find_duplicitys (long &nd, long *Cduplicity, long **duplicity)
140 {
141  // finds duplicity nodes in each cell
142  long i,j, k, l, m, aux;
143  long cP, *P, **D;
144  double d2, d2max;
145 
146  d2max = Zero_dist * Zero_dist;
147  nd=0;
148  for (k=0; k<cc[0]; k++) {
149  for (l=0; l<cc[1]; l++) {
150  for (m=0; m<cc[2]; m++) {
151  // JEDNA BUNKA
152  if (ccellpoints[k][l][m] == NULL) continue; // no point in cell
153 
154  cP = ccellpoints[k][l][m][0]; // count of points in one cell
155  P = cellpoints[k][l][m]; // id numbers of points in one cell
156 
157  allocate (D, cP, cP);
158  for (i=0; i<cP; i++) D[i][0] = 0;
159 
160  // pokud se najde duplicita mezi points dvou bodu
161  // tak do radku 1. bodu se ulozi lid(local id = cistlo radku) 2. bodu a naopak
162  // do D[i][0] se uklada pocet pocet bodu duplicitnich s i-th bodem
163  // od D[i][1] dal, se ukladaji lid duplicitnich bodu
164  for (i=0; i<cP-1; i++)
165  for (j=i+1; j<cP; j++) {
166  d2 = points[P[i]]->dist2_to (points[P[j]]);
167  if (d2 < d2max) {
168  D[i][++D[i][0]] = j;
169  D[j][++D[j][0]] = i;
170  }
171  }
172 
173  // predpokad:
174  // * v bunce muze byt nekolik duplicitnich skupinek
175  // * kazda duplicitni skupinka o 2 a vice bodech musi byt 'uzavrena'
176  // tj. vsechny body musi byt duplicitni kazdy s kazdym
177  // predpoklada se totiz ze retez duplicit neprekracuje d2max
178 
179  // najdou se dupl. skupinky a ulozi se do answer poli
180  for (i=0; i<cP-1; i++) {
181  if (D[i][0] == 0) continue; // nalezena dupl. skupina
182 
183  // z matice D se zrusi radky se stejnou dupl. skupinou
184  for (j=i+1; j<cP; j++)
185  if (D[j][0] && is_member_of_array(i, D[j][0], D[j]+1)) {
186  if (D[i][0] != D[j][0]) _errorr("error");
187  D[j][0] = 0;
188  }
189 
190  aux = D[i][0]+1;
191  D[i][0] = i;
192 
193  // hledam, zda dupl.skup. uz nebyla objevena v jine cell
194  for (j=0; j<nd; j++)
195  if (duplicity[j][0] == P[i]) break;
196 
197  // byla objevena
198  if (j!=nd) {
199  // zkontroluju ze jsou opravdu stejne
200  if (Cduplicity[j] != aux) _errorr("error");
201  aux = j;
202  for (j=0; j<Cduplicity[aux]; j++)
203  if (duplicity[aux][j] != P[D[i][j]]) _errorr("error");
204  }
205  // nebyla objevena
206  else {
207  // duplicitni skupinka se lokalizuje do answer poli
208  Cduplicity[nd] = aux;
209  duplicity[nd] = new long[Cduplicity[nd]];
210  for (j=0; j<Cduplicity[nd]; j++)
211  duplicity[nd][j] = P[D[i][j]];
212 
213  nd++;
214  }
215  }
216 
217  deallocateCheck ( D, cP);
218 
219  delete ccellpoints[k][l][m];
220  delete [] cellpoints[k][l][m];
221  // JEDNA BUNKA
222  }
223  delete [] ccellpoints[k][l];
224  delete [] cellpoints[k][l];
225  }
226  delete [] ccellpoints[k];
227  delete [] cellpoints[k];
228  }
229  delete [] ccellpoints;
230  delete [] cellpoints;
231 
232  // kontrola, ve vsech dupl skupinkach dohromady by nemel byt zadny stejny point
233  long ndp = 0;
234  for (k=0; k<nd; k++) ndp += Cduplicity[k];
235 
236  long *dp = new long[ndp];
237 
238  ndp = 0;
239  for (k=0; k<nd; k++)
240  for (l=0; l<Cduplicity[k]; l++)
241  dp[ndp++] = duplicity[k][l];
242 
243  if (! members_are_unique (ndp, dp)) _errorr ("error is not unique");
244 
245  delete [] dp;
246 
247 
248  // print
249  if (PRINT) {
250  fprintf (stdout,"\n DUPLICITY: START \n");
251 
252  fprintf (stdout,"\n Number of duplicities %ld\n",nd);
253  for (i=0; i<nd; i++) {
254  fprintf (stdout," duplicity[%ld] :: ", i+1);
255  for (j=0; j<Cduplicity[i]; j++)
256  fprintf (stdout,", %ld", duplicity[i][j]+1);
257  //if ((i+1)%10 == 0) fprintf (stdout,"\n");
258  fprintf (stdout,"\n");
259  }
260 
261  fprintf (stdout,"\n DUPLICITY: END \n");
262  }
263 }
264 
265 } // namespace midaspace
double dist2_to(const PoinT *p) const
Definition: arrays.h:102
void add_point_to_cell(long id, long pos[])
*** *** *** *** CLASS MESHGEOMETRY *** *** *** ***
Definition: dupl.cpp:18
long is_member_of_array(ArgType val, long n, const ArgType *array)
check out "val" is member of "array"
Definition: gelib.h:311
Duplicity.
void allocate_another_val(long n, ArgType *&old_field)
*** *** *** *** REALLOCATE TEMPLATES *** *** *** ***
Definition: gelib.h:251
bool members_are_unique(long n, const ArgType *array)
check out all members of array "a" are uniq
Definition: gelib.h:319
const PoinT ** points
Definition: dupl.h:27
static const bool PRINT
Definition: dupl.h:24
bool point_is_in_cell(long id, long pos[], double offset)
Definition: dupl.cpp:36
long **** cellpoints
Definition: dupl.h:35
#define _errorr(_1)
Definition: gelib.h:151
void assign_cellpoints(void)
Definition: dupl.cpp:49
Mathematic functions.
void find_duplicitys(long &nd, long *Cduplicity, long **duplicity)
return duplicity squads = 2 or more points with same coordinates nd ...
Definition: dupl.cpp:139
void allocate(ArgType *&p, long a)
*** *** *** *** ALLOCATE TEMPLATES *** *** *** ***
Definition: gelib.h:183
Class Geometry, Model and Mesh.
int **** ccellpoints
Definition: dupl.h:34
void deallocateCheck(ArgType *p, bool check=true)
*** *** *** *** DEALLOCATE TEMPLATES *** *** *** ***
Definition: gelib.h:192
void fill_all_by(ArgType *p, long a, ArgType value)
*** *** *** *** FILL TEMPLATES *** *** *** ***
Definition: gelib.h:238