Skip to content

Commit 51c88ea

Browse files
rootroot
authored andcommitted
Add an extra condition
1 parent 304a495 commit 51c88ea

File tree

2 files changed

+209
-205
lines changed

2 files changed

+209
-205
lines changed

gdist_c_api.cpp

Lines changed: 142 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -1,142 +1,142 @@
1-
#include <iostream>
2-
#include <fstream>
3-
4-
#include "geodesic_library/geodesic_algorithm_exact.h"
5-
6-
7-
void compute_gdist_impl(
8-
unsigned number_of_vertices,
9-
unsigned number_of_triangles,
10-
double *vertices,
11-
int *triangles,
12-
unsigned number_of_source_indices,
13-
unsigned number_of_target_indices,
14-
unsigned *source_indices_array,
15-
unsigned *target_indices_array,
16-
double *distance,
17-
double distance_limit
18-
) {
19-
20-
std::vector<double> points (vertices, vertices + number_of_vertices);
21-
std::vector<unsigned> faces (triangles, triangles + number_of_triangles);
22-
std::vector<unsigned> source_indices (source_indices_array, source_indices_array + number_of_source_indices);
23-
std::vector<unsigned> target_indices (target_indices_array, target_indices_array + number_of_target_indices);
24-
25-
geodesic::Mesh mesh;
26-
mesh.initialize_mesh_data(points, faces); // create internal mesh data structure including edges
27-
28-
geodesic::GeodesicAlgorithmExact algorithm(&mesh); // create exact algorithm for the mesh
29-
30-
std::vector<geodesic::SurfacePoint> all_sources, stop_points;
31-
32-
for (unsigned i = 0; i < number_of_source_indices; ++i) {
33-
all_sources.push_back(geodesic::SurfacePoint(&mesh.vertices()[source_indices[i]]));
34-
}
35-
36-
for (unsigned i = 0; i < number_of_target_indices; ++i) {
37-
stop_points.push_back(geodesic::SurfacePoint(&mesh.vertices()[target_indices[i]]));
38-
}
39-
40-
algorithm.propagate(all_sources, distance_limit, &stop_points);
41-
42-
for (unsigned i = 0; i < stop_points.size(); ++i) {
43-
algorithm.best_source(stop_points[i], distance[i]);
44-
}
45-
}
46-
47-
double* local_gdist_matrix_impl(
48-
unsigned number_of_vertices,
49-
unsigned number_of_triangles,
50-
double *vertices,
51-
unsigned *triangles,
52-
unsigned *sparse_matrix_size,
53-
double max_distance
54-
) {
55-
std::vector<double> points (vertices, vertices + number_of_vertices);
56-
std::vector<unsigned> faces (triangles, triangles + number_of_triangles);
57-
58-
geodesic::Mesh mesh;
59-
mesh.initialize_mesh_data(points, faces); // create internal mesh data structure including edges
60-
geodesic::GeodesicAlgorithmExact algorithm(&mesh); // create exact algorithm for the mesh
61-
std::vector <unsigned> rows_vector, columns_vector;
62-
std::vector <double> data_vector;
63-
64-
double distance = 0;
65-
66-
std::vector<geodesic::SurfacePoint> targets(number_of_vertices), source;
67-
68-
for (unsigned i = 0; i < number_of_vertices; ++i) {
69-
targets[i] = geodesic::SurfacePoint(&mesh.vertices()[i]);
70-
}
71-
for (unsigned i = 0; i < number_of_vertices / 3; ++i) {
72-
source.push_back(geodesic::SurfacePoint(&mesh.vertices()[i]));
73-
algorithm.propagate(source, max_distance, NULL);
74-
source.pop_back();
75-
for (unsigned j = 0; j < number_of_vertices / 3; ++j) {
76-
algorithm.best_source(targets[j], distance);
77-
if (distance != geodesic::GEODESIC_INF && distance != 0) {
78-
rows_vector.push_back(i);
79-
columns_vector.push_back(j);
80-
data_vector.push_back(distance);
81-
}
82-
}
83-
}
84-
85-
double *data;
86-
data = new double[3 * rows_vector.size()];
87-
88-
*sparse_matrix_size = rows_vector.size();
89-
90-
std::copy(rows_vector.begin(), rows_vector.end(), data);
91-
std::copy(columns_vector.begin(), columns_vector.end(), data + data_vector.size());
92-
std::copy(data_vector.begin(), data_vector.end(), data + 2 * data_vector.size());
93-
94-
return data;
95-
}
96-
97-
98-
extern "C" {
99-
double* compute_gdist(
100-
unsigned number_of_vertices,
101-
unsigned number_of_triangles,
102-
double *vertices,
103-
int *triangles,
104-
unsigned number_of_source_indices,
105-
unsigned number_of_target_indices,
106-
unsigned *source_indices_array,
107-
unsigned *target_indices_array,
108-
double *distance,
109-
double distance_limit
110-
) {
111-
compute_gdist_impl(
112-
number_of_vertices,
113-
number_of_triangles,
114-
vertices,
115-
triangles,
116-
number_of_source_indices,
117-
number_of_target_indices,
118-
source_indices_array,
119-
target_indices_array,
120-
distance,
121-
distance_limit
122-
);
123-
}
124-
125-
double* local_gdist_matrix(
126-
unsigned number_of_vertices,
127-
unsigned number_of_triangles,
128-
double *vertices,
129-
unsigned *triangles,
130-
unsigned *sparse_matrix_size,
131-
double max_distance
132-
) {
133-
return local_gdist_matrix_impl(
134-
number_of_vertices,
135-
number_of_triangles,
136-
vertices,
137-
triangles,
138-
sparse_matrix_size,
139-
max_distance
140-
);
141-
}
142-
};
1+
#include <iostream>
2+
#include <fstream>
3+
4+
#include "geodesic_library/geodesic_algorithm_exact.h"
5+
6+
7+
void compute_gdist_impl(
8+
unsigned number_of_vertices,
9+
unsigned number_of_triangles,
10+
double *vertices,
11+
int *triangles,
12+
unsigned number_of_source_indices,
13+
unsigned number_of_target_indices,
14+
unsigned *source_indices_array,
15+
unsigned *target_indices_array,
16+
double *distance,
17+
double distance_limit
18+
) {
19+
20+
std::vector<double> points (vertices, vertices + number_of_vertices);
21+
std::vector<unsigned> faces (triangles, triangles + number_of_triangles);
22+
std::vector<unsigned> source_indices (source_indices_array, source_indices_array + number_of_source_indices);
23+
std::vector<unsigned> target_indices (target_indices_array, target_indices_array + number_of_target_indices);
24+
25+
geodesic::Mesh mesh;
26+
mesh.initialize_mesh_data(points, faces); // create internal mesh data structure including edges
27+
28+
geodesic::GeodesicAlgorithmExact algorithm(&mesh); // create exact algorithm for the mesh
29+
30+
std::vector<geodesic::SurfacePoint> all_sources, stop_points;
31+
32+
for (unsigned i = 0; i < number_of_source_indices; ++i) {
33+
all_sources.push_back(geodesic::SurfacePoint(&mesh.vertices()[source_indices[i]]));
34+
}
35+
36+
for (unsigned i = 0; i < number_of_target_indices; ++i) {
37+
stop_points.push_back(geodesic::SurfacePoint(&mesh.vertices()[target_indices[i]]));
38+
}
39+
40+
algorithm.propagate(all_sources, distance_limit, &stop_points);
41+
42+
for (unsigned i = 0; i < stop_points.size(); ++i) {
43+
algorithm.best_source(stop_points[i], distance[i]);
44+
}
45+
}
46+
47+
double* local_gdist_matrix_impl(
48+
unsigned number_of_vertices,
49+
unsigned number_of_triangles,
50+
double *vertices,
51+
unsigned *triangles,
52+
unsigned *sparse_matrix_size,
53+
double max_distance
54+
) {
55+
std::vector<double> points (vertices, vertices + number_of_vertices);
56+
std::vector<unsigned> faces (triangles, triangles + number_of_triangles);
57+
58+
geodesic::Mesh mesh;
59+
mesh.initialize_mesh_data(points, faces); // create internal mesh data structure including edges
60+
geodesic::GeodesicAlgorithmExact algorithm(&mesh); // create exact algorithm for the mesh
61+
std::vector <unsigned> rows_vector, columns_vector;
62+
std::vector <double> data_vector;
63+
64+
double distance = 0;
65+
66+
std::vector<geodesic::SurfacePoint> targets(number_of_vertices), source;
67+
68+
for (unsigned i = 0; i < number_of_vertices; ++i) {
69+
targets[i] = geodesic::SurfacePoint(&mesh.vertices()[i]);
70+
}
71+
for (unsigned i = 0; i < number_of_vertices / 3; ++i) {
72+
source.push_back(geodesic::SurfacePoint(&mesh.vertices()[i]));
73+
algorithm.propagate(source, max_distance, NULL);
74+
source.pop_back();
75+
for (unsigned j = 0; j < number_of_vertices / 3; ++j) {
76+
algorithm.best_source(targets[j], distance);
77+
if (distance != geodesic::GEODESIC_INF && distance != 0 && distance <= max_distance) {
78+
rows_vector.push_back(i);
79+
columns_vector.push_back(j);
80+
data_vector.push_back(distance);
81+
}
82+
}
83+
}
84+
85+
double *data;
86+
data = new double[3 * rows_vector.size()];
87+
88+
*sparse_matrix_size = rows_vector.size();
89+
90+
std::copy(rows_vector.begin(), rows_vector.end(), data);
91+
std::copy(columns_vector.begin(), columns_vector.end(), data + data_vector.size());
92+
std::copy(data_vector.begin(), data_vector.end(), data + 2 * data_vector.size());
93+
94+
return data;
95+
}
96+
97+
98+
extern "C" {
99+
double* compute_gdist(
100+
unsigned number_of_vertices,
101+
unsigned number_of_triangles,
102+
double *vertices,
103+
int *triangles,
104+
unsigned number_of_source_indices,
105+
unsigned number_of_target_indices,
106+
unsigned *source_indices_array,
107+
unsigned *target_indices_array,
108+
double *distance,
109+
double distance_limit
110+
) {
111+
compute_gdist_impl(
112+
number_of_vertices,
113+
number_of_triangles,
114+
vertices,
115+
triangles,
116+
number_of_source_indices,
117+
number_of_target_indices,
118+
source_indices_array,
119+
target_indices_array,
120+
distance,
121+
distance_limit
122+
);
123+
}
124+
125+
double* local_gdist_matrix(
126+
unsigned number_of_vertices,
127+
unsigned number_of_triangles,
128+
double *vertices,
129+
unsigned *triangles,
130+
unsigned *sparse_matrix_size,
131+
double max_distance
132+
) {
133+
return local_gdist_matrix_impl(
134+
number_of_vertices,
135+
number_of_triangles,
136+
vertices,
137+
triangles,
138+
sparse_matrix_size,
139+
max_distance
140+
);
141+
}
142+
};

0 commit comments

Comments
 (0)