92 const double delta,
const bool delta_relative,
const size_t n,
const double* coor,
93 std::vector<size_t>& coincide) {
99 if (n == 0) {
return; }
102 for (
size_t i = 0; i != n; ++i) { coincide.push_back(i); }
106 double bb_min[3] = {coor[0], coor[1], coor[2]};
107 double bb_max[3] = {coor[0], coor[1], coor[2]};
108 for (
size_t i = 3; i != 3 * n; ++i) {
110 if (coor[i] < bb_min[j]) { bb_min[j] = coor[i]; }
111 if (coor[i] > bb_max[j]) { bb_max[j] = coor[i]; }
116 double delta_abs = delta;
117 if (delta_relative) {
118 const double bb_extent[3] = {
119 bb_max[0] - bb_min[0], bb_max[1] - bb_min[1], bb_max[2] - bb_min[2]};
121 const double bb_extent_max = std::max(bb_extent[0], std::max(bb_extent[1], bb_extent[2]));
123 delta_abs = bb_extent_max * delta;
125 const double delta_abs_2 = delta_abs * delta_abs;
128 const double box_size = 2 * delta_abs;
130 std::vector<Point> points(n,
Point());
133 double box_start_a[3] = {bb_min[0], bb_min[1], bb_min[2]};
134 for (
size_t i = 0; i != n; ++i) {
135 Point& p = points[i];
137 for (
int j = 0; j != 3; ++j) {
138 p.signature.d[j] = T((coor[3 * i + j] - box_start_a[j]) / box_size);
141 std::sort(points.begin(), points.end());
142 for (
size_t i = 0; i + 1 < n;) {
143 const size_t j = i++;
145 if (points[i].signature != points[j].signature) {
break; }
146 const size_t ii = points[i].index;
147 const size_t jj = points[j].index;
148 const double* ci = &coor[3 * ii];
149 const double* cj = &coor[3 * jj];
150 const double d[3] = {ci[0] - cj[0], ci[1] - cj[1], ci[2] - cj[2]};
151 if (coincide[ii] == ii && d[0] * d[0] + d[1] * d[1] + d[2] * d[2] < delta_abs_2) {
152 coincide[ii] = coincide[jj];
158 double box_start_b[3] = {
159 bb_min[0] + 0.5 * box_size, bb_min[1] + 0.5 * box_size, bb_min[2] + 0.5 * box_size};
160 for (
size_t i = 0; i != n; ++i) {
161 Point& p = points[i];
163 for (
int j = 0; j != 3; ++j) {
164 p.signature.d[j] = T((coor[3 * i + j] - box_start_b[j]) / box_size);
167 std::sort(points.begin(), points.end());
168 for (
size_t i = 0; i + 1 < n;) {
169 const size_t j = i++;
171 if (points[i].signature != points[j].signature) {
break; }
172 const size_t ii = points[i].index;
173 const size_t jj = points[j].index;
174 const double* ci = &coor[3 * ii];
175 const double* cj = &coor[3 * jj];
176 const double d[3] = {ci[0] - cj[0], ci[1] - cj[1], ci[2] - cj[2]};
177 if (coincide[ii] == ii && d[0] * d[0] + d[1] * d[1] + d[2] * d[2] < delta_abs_2) {
178 coincide[ii] = coincide[jj];
184 for (
size_t i = 0; i != n; ++i) { coincide[i] = coincide[coincide[i]]; }
220 const double delta,
const bool delta_relative,
const size_t n,
const double* coor,
221 std::vector<std::pair<size_t, size_t> >& coincide) {
224 std::vector<size_t> vcoincide;
225 find_coinciding_points<T>(delta, delta_relative, n, coor, vcoincide);
227 assert(vcoincide.size() == n);
229 for (
size_t i = 0; i != n; ++i) {
230 coincide.push_back(std::pair<size_t, size_t>(vcoincide[i], i));
232 std::sort(coincide.begin(), coincide.end());
void find_coinciding_points(const double delta, const bool delta_relative, const size_t n, const double *coor, std::vector< size_t > &coincide)
Definition b2find_coinciding_points.H:91