Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,4 @@ geom-ctl-io.c
geomtst
nlopt-constants.scm
utils/test-prism
*.dat
12 changes: 6 additions & 6 deletions utils/geom.c
Original file line number Diff line number Diff line change
Expand Up @@ -2314,12 +2314,12 @@ double min_distance_to_quadrilateral(vector3 p, vector3 o, vector3 v1, vector3 v

// fc==0/1 for floor/ceiling
double min_distance_to_prism_roof_or_ceiling(vector3 pp, prism *prsm, int fc) {
int num_vertices = prsm->vertices_p.num_items;
int num_vertices = prsm->vertices_p.num_items, i;
vector3 op = {0.0, 0.0, 0.0}; // origin of floor/ceiling
vector3 vps[num_vertices];
if (fc == 1) {
memcpy(vps, prsm->vertices_top_p.items, num_vertices * sizeof(vector3));
for (int i = 0; i < num_vertices; i++) {
for (i = 0; i < num_vertices; i++) {
vps[i].z = 0;
}
op.z = prsm->height;
Expand Down Expand Up @@ -2450,7 +2450,7 @@ double get_prism_volume(prism *prsm) {
return get_area_of_polygon_from_nodes(prsm->vertices_p.items, prsm->vertices_p.num_items) * fabs(prsm->height);
}
else {
int num_vertices = prsm->vertices_p.num_items;
int num_vertices = prsm->vertices_p.num_items, nv;
double bottom_polygon_area = get_area_of_polygon_from_nodes(prsm->vertices_p.items, prsm->vertices_p.num_items);
double top_polygon_area = get_area_of_polygon_from_nodes(prsm->vertices_top_p.items, prsm->vertices_top_p.num_items);
double volume;
Expand All @@ -2467,7 +2467,7 @@ double get_prism_volume(prism *prsm) {
volume = fabs(top_polygon_area * prsm->height);
memcpy(wedges_a, prsm->vertices_top_p.items, num_vertices * sizeof(vector3));
memcpy(wedges_b, prsm->vertices_top_p.items, num_vertices * sizeof(vector3));
for (int nv = 0; nv < num_vertices; nv++) {
for (nv = 0; nv < num_vertices; nv++) {
wedges_b[nv].z = 0.0;
}
memcpy(wedges_c, prsm->vertices_p.items, num_vertices * sizeof(vector3));
Expand All @@ -2476,12 +2476,12 @@ double get_prism_volume(prism *prsm) {
volume = fabs(bottom_polygon_area * prsm->height);
memcpy(wedges_a, prsm->vertices_p.items, num_vertices * sizeof(vector3));
memcpy(wedges_b, prsm->vertices_p.items, num_vertices * sizeof(vector3));
for (int nv = 0; nv < num_vertices; nv++) {
for (nv = 0; nv < num_vertices; nv++) {
wedges_b[nv].z = prsm->height;
}
memcpy(wedges_c, prsm->vertices_top_p.items, num_vertices * sizeof(vector3));
}
for (int nv = 0; nv < num_vertices; nv++) {
for (nv = 0; nv < num_vertices; nv++) {
int nvp1 = (nv + 1 == num_vertices ? 0 : nv + 1);
volume += get_volume_irregular_triangular_prism(wedges_a[nv], wedges_b[nv], wedges_c[nv], wedges_a[nvp1], wedges_b[nvp1], wedges_c[nvp1]);
}
Expand Down
25 changes: 13 additions & 12 deletions utils/test-prism.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,7 @@ double relative_error(double actual, double expected) {
}

int test_helper_functions_on_octagonal_c_prism() {
int i;
double tolerance = 5.0e-5;

void *m = NULL;
Expand Down Expand Up @@ -660,12 +661,12 @@ int test_helper_functions_on_octagonal_c_prism() {
point_in_prism_expected_normal_sidewall[24] = 0; // center of the c

int point_in_prism_actual_normal_sidewall[point_in_prism_test_points_normal_sidewall.num_items];
for (int i = 0; i < point_in_prism_test_points_normal_sidewall.num_items; i++) {
for (i = 0; i < point_in_prism_test_points_normal_sidewall.num_items; i++) {
num_tests_normal++;
point_in_prism_actual_normal_sidewall[i] = point_in_fixed_pobjectp(point_in_prism_test_points_normal_sidewall.items[i], &octagon_c_normal_sidewall_geom_object);
}

for (int i = 0; i < point_in_prism_test_points_normal_sidewall.num_items; i++) {
for (i = 0; i < point_in_prism_test_points_normal_sidewall.num_items; i++) {
if (point_in_prism_actual_normal_sidewall[i] != point_in_prism_expected_normal_sidewall[i]) {
ctl_printf("\tAt (%f, %f, %f) we expected point_in_fixed_pobjectp on the normal sidewall prism to return %i, but instead it returned %i\n", point_in_prism_test_points_normal_sidewall.items[i].x, point_in_prism_test_points_normal_sidewall.items[i].y, point_in_prism_test_points_normal_sidewall.items[i].z, point_in_prism_expected_normal_sidewall[i], point_in_prism_actual_normal_sidewall[i]);
num_failed_normal++;
Expand Down Expand Up @@ -729,12 +730,12 @@ int test_helper_functions_on_octagonal_c_prism() {
point_in_prism_expected_tapered_sidewall[24] = 0; // center of the c

int point_in_prism_actual_tapered_sidewall[point_in_prism_test_points_tapered_sidewall.num_items];
for (int i = 0; i < point_in_prism_test_points_tapered_sidewall.num_items; i++) {
for (i = 0; i < point_in_prism_test_points_tapered_sidewall.num_items; i++) {
num_tests_tapered++;
point_in_prism_actual_tapered_sidewall[i] = point_in_fixed_pobjectp(point_in_prism_test_points_tapered_sidewall.items[i], &octagon_c_two_half_degree_sidewall_geom_object);
}

for (int i = 0; i < point_in_prism_test_points_tapered_sidewall.num_items; i++) {
for (i = 0; i < point_in_prism_test_points_tapered_sidewall.num_items; i++) {
if (point_in_prism_actual_tapered_sidewall[i] != point_in_prism_expected_tapered_sidewall[i]) {
ctl_printf("\tAt (%f, %f, %f) we expected point_in_fixed_pobjectp on the tapered sidewall prism to return %i, but instead it returned %i\n", point_in_prism_test_points_tapered_sidewall.items[i].x, point_in_prism_test_points_tapered_sidewall.items[i].y, point_in_prism_test_points_tapered_sidewall.items[i].z, point_in_prism_expected_tapered_sidewall[i], point_in_prism_actual_tapered_sidewall[i]);
num_failed_tapered++;
Expand Down Expand Up @@ -809,12 +810,12 @@ int test_helper_functions_on_octagonal_c_prism() {
normal_to_prism_expected_normal_sidewall[29] = make_vector3(0.0000000, 0.0000000, 1.0000000);

vector3 normal_to_prism_actual_normal_sidewall[normal_to_prism_test_points_normal_sidewall.num_items];
for (int i = 0; i < normal_to_prism_test_points_normal_sidewall.num_items; i++) {
for (i = 0; i < normal_to_prism_test_points_normal_sidewall.num_items; i++) {
num_tests_normal++;
normal_to_prism_actual_normal_sidewall[i] = unit_vector3(normal_to_object(normal_to_prism_test_points_normal_sidewall.items[i], octagon_c_normal_sidewall_geom_object));
}

for (int i = 0; i < normal_to_prism_test_points_normal_sidewall.num_items; i++) {
for (i = 0; i < normal_to_prism_test_points_normal_sidewall.num_items; i++) {
if (!vector3_nearly_equal(normal_to_prism_expected_normal_sidewall[i], normal_to_prism_actual_normal_sidewall[i], tolerance)
&& !vector3_nearly_equal(normal_to_prism_expected_normal_sidewall[i], vector3_scale(-1, normal_to_prism_actual_normal_sidewall[i]), tolerance)) {
num_failed_normal++;
Expand Down Expand Up @@ -892,12 +893,12 @@ int test_helper_functions_on_octagonal_c_prism() {
normal_to_prism_expected_tapered_sidewall[29] = make_vector3(0.0000000, 0.0000000, 1.0000000);

vector3 normal_to_prism_actual_tapered_sidewall[normal_to_prism_test_points_tapered_sidewall.num_items];
for (int i = 0; i < normal_to_prism_test_points_tapered_sidewall.num_items; i++) {
for (i = 0; i < normal_to_prism_test_points_tapered_sidewall.num_items; i++) {
num_tests_tapered++;
normal_to_prism_actual_tapered_sidewall[i] = unit_vector3(normal_to_object(normal_to_prism_test_points_tapered_sidewall.items[i], octagon_c_two_half_degree_sidewall_geom_object));
}

for (int i = 0; i < normal_to_prism_test_points_tapered_sidewall.num_items; i++) {
for (i = 0; i < normal_to_prism_test_points_tapered_sidewall.num_items; i++) {
if (!vector3_nearly_equal(normal_to_prism_expected_tapered_sidewall[i], normal_to_prism_actual_tapered_sidewall[i], tolerance)
&& !vector3_nearly_equal(normal_to_prism_expected_tapered_sidewall[i], vector3_scale(-1, normal_to_prism_actual_tapered_sidewall[i]), tolerance)) {
num_failed_tapered++;
Expand Down Expand Up @@ -967,7 +968,7 @@ int test_helper_functions_on_octagonal_c_prism() {
intersect_line_with_prism_b_normal_sidewall[8] = 300; // between top point 3 and center of c on bottom

double intersect_line_with_prism_actual_normal_sidewall[intersect_line_with_prism_test_points_normal_sidewall.num_items];
for (int i = 0; i < intersect_line_with_prism_test_points_normal_sidewall.num_items; i++) {
for (i = 0; i < intersect_line_with_prism_test_points_normal_sidewall.num_items; i++) {
num_tests_normal++;
vector3 p = intersect_line_with_prism_test_points_normal_sidewall.items[i];
vector3 d = intersect_line_with_prism_test_vectors_normal_sidewall[i];
Expand All @@ -977,7 +978,7 @@ int test_helper_functions_on_octagonal_c_prism() {
intersect_line_with_prism_actual_normal_sidewall[i] = intersect_line_segment_with_object(p, d, o, a, b);
}

for (int i = 0; i < intersect_line_with_prism_test_points_normal_sidewall.num_items; i++) {
for (i = 0; i < intersect_line_with_prism_test_points_normal_sidewall.num_items; i++) {
double actual = intersect_line_with_prism_actual_normal_sidewall[i];
double expected = intersect_line_with_prism_expected_normal_sidewall[i];
if (fabs(fabs(actual)-fabs(expected)) > tolerance * fmax(fabs(actual), fabs(expected))) {
Expand Down Expand Up @@ -1052,7 +1053,7 @@ int test_helper_functions_on_octagonal_c_prism() {
intersect_line_with_prism_b_tapered_sidewall[8] = 300; // between top point 3 and center of c on bottom

double intersect_line_with_prism_actual_tapered_sidewall[intersect_line_with_prism_test_points_tapered_sidewall.num_items];
for (int i = 0; i < intersect_line_with_prism_test_points_tapered_sidewall.num_items; i++) {
for (i = 0; i < intersect_line_with_prism_test_points_tapered_sidewall.num_items; i++) {
num_tests_tapered++;
vector3 p = intersect_line_with_prism_test_points_tapered_sidewall.items[i];
vector3 d = intersect_line_with_prism_test_vectors_tapered_sidewall[i];
Expand All @@ -1062,7 +1063,7 @@ int test_helper_functions_on_octagonal_c_prism() {
intersect_line_with_prism_actual_tapered_sidewall[i] = intersect_line_segment_with_object(p, d, o, a, b);
}

for (int i = 0; i < intersect_line_with_prism_test_points_tapered_sidewall.num_items; i++) {
for (i = 0; i < intersect_line_with_prism_test_points_tapered_sidewall.num_items; i++) {
double actual = intersect_line_with_prism_actual_tapered_sidewall[i];
double expected = intersect_line_with_prism_expected_tapered_sidewall[i];
if (fabs(fabs(actual)-fabs(expected)) > tolerance * fmax(fabs(actual), fabs(expected))) {
Expand Down