/* Adds a triangle by interpolating over the given edges (which are expected to * contain an intersection). * The edges are specified by their vertices (u is the first edge, v the second, * etc.) */ void interpolate_edges(triangle *triangles, unsigned char isovalue, cell c, int u0, int u1, int v0, int v1, int w0, int w1) { vec3 p1, p2, p3; p1 = interpolate_points(isovalue, c.p[u0], c.p[u1], c.value[u0], c.value[u1]); p2 = interpolate_points(isovalue, c.p[v0], c.p[v1], c.value[v0], c.value[v1]); p3 = interpolate_points(isovalue, c.p[w0], c.p[w1], c.value[w0], c.value[w1]); triangles->p[0] = p1; triangles->p[1] = p2; triangles->p[2] = p3; // the surface-normal is the cross-product between 2 of the edges making up // the face vec3 normal = v3_crossprod(v3_subtract(p1, p2), v3_subtract(p3, p1)); normal = v3_normalize(normal); normal = v3_multiply(normal, -1); triangles->n[0] = normal; triangles->n[1] = normal; triangles->n[2] = normal; }
int stp_curve_compose(stp_curve_t **retval, stp_curve_t *a, stp_curve_t *b, stp_curve_compose_t mode, int points) { stp_curve_t *ret; double *tmp_data; double gamma_a = stp_curve_get_gamma(a); double gamma_b = stp_curve_get_gamma(b); unsigned points_a = stp_curve_count_points(a); unsigned points_b = stp_curve_count_points(b); double alo, ahi, blo, bhi; if (a->piecewise && b->piecewise) return 0; if (a->piecewise) { stp_curve_t *a_save = a; a = stp_curve_create_copy(a_save); stp_curve_resample(a, stp_curve_count_points(b)); } if (b->piecewise) { stp_curve_t *b_save = b; b = stp_curve_create_copy(b_save); stp_curve_resample(b, stp_curve_count_points(a)); } if (mode != STP_CURVE_COMPOSE_ADD && mode != STP_CURVE_COMPOSE_MULTIPLY) return 0; if (stp_curve_get_wrap(a) != stp_curve_get_wrap(b)) return 0; stp_curve_get_bounds(a, &alo, &ahi); stp_curve_get_bounds(b, &blo, &bhi); if (mode == STP_CURVE_COMPOSE_MULTIPLY && (alo < 0 || blo < 0)) return 0; if (stp_curve_get_wrap(a) == STP_CURVE_WRAP_AROUND) { points_a++; points_b++; } if (points == -1) { points = lcm(points_a, points_b); if (stp_curve_get_wrap(a) == STP_CURVE_WRAP_AROUND) points--; } if (points < 2 || points > curve_point_limit || ((stp_curve_get_wrap(a) == STP_CURVE_WRAP_AROUND) && points > curve_point_limit - 1)) return 0; if (gamma_a && gamma_b && gamma_a * gamma_b > 0 && mode == STP_CURVE_COMPOSE_MULTIPLY) return create_gamma_curve(retval, alo * blo, ahi * bhi, gamma_a + gamma_b, points); tmp_data = stp_malloc(sizeof(double) * points); if (!interpolate_points(a, b, mode, points, tmp_data)) { stp_free(tmp_data); return 0; } ret = stp_curve_create(stp_curve_get_wrap(a)); if (mode == STP_CURVE_COMPOSE_ADD) { stp_curve_rescale(ret, (ahi - alo) + (bhi - blo), STP_CURVE_COMPOSE_MULTIPLY, STP_CURVE_BOUNDS_RESCALE); stp_curve_rescale(ret, alo + blo, STP_CURVE_COMPOSE_ADD, STP_CURVE_BOUNDS_RESCALE); } else { stp_curve_rescale(ret, (ahi - alo) * (bhi - blo), STP_CURVE_COMPOSE_MULTIPLY, STP_CURVE_BOUNDS_RESCALE); stp_curve_rescale(ret, alo * blo, STP_CURVE_COMPOSE_ADD, STP_CURVE_BOUNDS_RESCALE); } if (! stp_curve_set_data(ret, points, tmp_data)) goto bad1; *retval = ret; stp_free(tmp_data); return 1; bad1: stp_curve_destroy(ret); stp_free(tmp_data); return 0; }
static int generate_tetrahedron_triangles(triangle *triangles, unsigned char isovalue, cell c, int v0, int v1, int v2, int v3) { int w1 = 0, w2 = 0, w3 = 0, w0 = 0; if(volume[(int)c.value[v0]] > isovalue) w0 = 1; if(volume[(int)c.value[v1]] > isovalue) w1 = 1; if(volume[(int)c.value[v2]] > isovalue) w2 = 1; if(volume[(int)c.value[v3]] > isovalue) w3 = 1; /* interpolate as shown in figure 10 of assignment. */ if((w3 == 0 && w2 == 0 && w1 == 0 && w0 == 1) || (w3 == 1 && w2 == 1 && w1 == 1 && w0 == 0)) { triangles[0].p[0] = interpolate_points(isovalue, c.p[v0], c.p[v1], c.value[v0], c.value[v1]); triangles[0].p[1] = interpolate_points(isovalue, c.p[v0], c.p[v2], c.value[v0], c.value[v2]); triangles[0].p[2] = interpolate_points(isovalue, c.p[v0], c.p[v3], c.value[v0], c.value[v3]); return 1; } if((w3 == 0 && w2 == 0 && w1 == 1 && w0 == 0) || (w3 == 1 && w2 == 1 && w1 == 0 && w0 == 1)) { triangles[0].p[0] = interpolate_points(isovalue, c.p[v0], c.p[v1], c.value[v0], c.value[v1]); triangles[0].p[1] = interpolate_points(isovalue, c.p[v1], c.p[v2], c.value[v1], c.value[v2]); triangles[0].p[2] = interpolate_points(isovalue, c.p[v1], c.p[v3], c.value[v1], c.value[v3]); return 1; } if((w3 == 0 && w2 == 1 && w1 == 0 && w0 == 0) || (w3 == 1 && w2 == 0 && w1 == 1 && w0 == 1)) { triangles[0].p[0] = interpolate_points(isovalue, c.p[v2], c.p[v0], c.value[v2], c.value[v0]); triangles[0].p[1] = interpolate_points(isovalue, c.p[v1], c.p[v2], c.value[v1], c.value[v2]); triangles[0].p[2] = interpolate_points(isovalue, c.p[v2], c.p[v3], c.value[v2], c.value[v3]); return 1; } if((w3 == 1 && w2 == 0 && w1 == 0 && w0 == 0) || (w3 == 0 && w2 == 1 && w1 == 1 && w0 == 1)) { triangles[0].p[0] = interpolate_points(isovalue, c.p[v3], c.p[v0], c.value[v3], c.value[v0]); triangles[0].p[1] = interpolate_points(isovalue, c.p[v1], c.p[v3], c.value[v1], c.value[v3]); triangles[0].p[2] = interpolate_points(isovalue, c.p[v2], c.p[v3], c.value[v2], c.value[v3]); return 1; } if((w3 == 0 && w2 == 0 && w1 == 1 && w0 == 1) || (w3 == 1 && w2 == 1 && w1 == 0 && w0 == 0)) { triangles[0].p[0] = interpolate_points(isovalue, c.p[v0], c.p[v1], c.value[v0], c.value[v1]); triangles[0].p[1] = interpolate_points(isovalue, c.p[v1], c.p[v2], c.value[v1], c.value[v2]); triangles[0].p[2] = interpolate_points(isovalue, c.p[v1], c.p[v3], c.value[v1], c.value[v3]); triangles[1].p[0] = interpolate_points(isovalue, c.p[v0], c.p[v1], c.value[v0], c.value[v1]); triangles[1].p[1] = interpolate_points(isovalue, c.p[v0], c.p[v2], c.value[v0], c.value[v2]); triangles[1].p[2] = interpolate_points(isovalue, c.p[v0], c.p[v3], c.value[v0], c.value[v3]); return 2; } if((w3 == 0 && w2 == 1 && w1 == 0 && w0 == 1) || (w3 == 1 && w2 == 0 && w1 == 1 && w0 == 0)) { triangles[0].p[0] = interpolate_points(isovalue, c.p[v0], c.p[v1], c.value[v0], c.value[v1]); triangles[0].p[1] = interpolate_points(isovalue, c.p[v0], c.p[v2], c.value[v0], c.value[v2]); triangles[0].p[2] = interpolate_points(isovalue, c.p[v0], c.p[v3], c.value[v0], c.value[v3]); triangles[1].p[0] = interpolate_points(isovalue, c.p[v2], c.p[v0], c.value[v2], c.value[v0]); triangles[1].p[1] = interpolate_points(isovalue, c.p[v1], c.p[v2], c.value[v1], c.value[v2]); triangles[1].p[2] = interpolate_points(isovalue, c.p[v2], c.p[v3], c.value[v2], c.value[v3]); return 2; } if((w3 == 0 && w2 == 1 && w1 == 1 && w0 == 0) || (w3 == 1 && w2 == 0 && w1 == 0 && w0 == 1)) { triangles[0].p[0] = interpolate_points(isovalue, c.p[v2], c.p[v0], c.value[v2], c.value[v0]); triangles[0].p[1] = interpolate_points(isovalue, c.p[v1], c.p[v2], c.value[v1], c.value[v2]); triangles[0].p[2] = interpolate_points(isovalue, c.p[v2], c.p[v3], c.value[v2], c.value[v3]); triangles[1].p[0] = interpolate_points(isovalue, c.p[v0], c.p[v1], c.value[v0], c.value[v1]); triangles[1].p[1] = interpolate_points(isovalue, c.p[v1], c.p[v2], c.value[v1], c.value[v2]); triangles[1].p[2] = interpolate_points(isovalue, c.p[v1], c.p[v3], c.value[v1], c.value[v3]); return 2; } return 0; }