diff options
Diffstat (limited to 'libdimension/cube.c')
-rw-r--r-- | libdimension/cube.c | 94 |
1 files changed, 0 insertions, 94 deletions
diff --git a/libdimension/cube.c b/libdimension/cube.c index bb71d0b..d8a1236 100644 --- a/libdimension/cube.c +++ b/libdimension/cube.c @@ -21,97 +21,3 @@ #include "dimension.h" #include <stdlib.h> /* For malloc */ #include <math.h> /* For sqrt */ - -static dmnsn_array *dmnsn_cube_intersections_fn(const dmnsn_object *cube, - dmnsn_line line); -static int dmnsn_cube_inside_fn(const dmnsn_object *cube, - dmnsn_vector point); - -/* Allocate a new cube object */ -dmnsn_object * -dmnsn_new_cube() -{ - dmnsn_object *cube = dmnsn_new_object(); - if (cube) { - cube->intersections_fn = &dmnsn_cube_intersections_fn; - cube->inside_fn = &dmnsn_cube_inside_fn; - } - return cube; -} - -/* Delete a cube */ -void -dmnsn_delete_cube(dmnsn_object *cube) -{ - dmnsn_delete_object(cube); -} - -/* Intersections callback for a cube */ -static dmnsn_array * -dmnsn_cube_intersections_fn(const dmnsn_object *cube, dmnsn_line line) -{ - double t; - dmnsn_vector p; - dmnsn_array *array = dmnsn_new_array(sizeof(double)); - - /* Six ray-plane intersection tests (x, y, z) = +/- 1.0 */ - - if (line.n.x != 0.0) { - /* x = -1.0 */ - t = (-1.0 - line.x0.x)/line.n.x; - p = dmnsn_line_point(line, t); - if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0) { - dmnsn_array_push(array, &t); - } - - /* x = 1.0 */ - t = (1.0 - line.x0.x)/line.n.x; - p = dmnsn_line_point(line, t); - if (p.y >= -1.0 && p.y <= 1.0 && p.z >= -1.0 && p.z <= 1.0) { - dmnsn_array_push(array, &t); - } - } - - if (line.n.y != 0.0) { - /* y = -1.0 */ - t = (-1.0 - line.x0.y)/line.n.y; - p = dmnsn_line_point(line, t); - if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0) { - dmnsn_array_push(array, &t); - } - - /* y = 1.0 */ - t = (1.0 - line.x0.y)/line.n.y; - p = dmnsn_line_point(line, t); - if (p.x >= -1.0 && p.x <= 1.0 && p.z >= -1.0 && p.z <= 1.0) { - dmnsn_array_push(array, &t); - } - } - - if (line.n.z != 0.0) { - /* z = -1.0 */ - t = (-1.0 - line.x0.z)/line.n.z; - p = dmnsn_line_point(line, t); - if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0) { - dmnsn_array_push(array, &t); - } - - /* z = 1.0 */ - t = (1.0 - line.x0.z)/line.n.z; - p = dmnsn_line_point(line, t); - if (p.x >= -1.0 && p.x <= 1.0 && p.y >= -1.0 && p.y <= 1.0) { - dmnsn_array_push(array, &t); - } - } - - return array; -} - -/* Inside callback for a cube */ -static int -dmnsn_cube_inside_fn(const dmnsn_object *cube, dmnsn_vector point) -{ - return point.x > -1.0 && point.x < 1.0 - && point.y > -1.0 && point.y < 1.0 - && point.z > -1.0 && point.z < 1.0; -} |