diff options
author | Tavian Barnes <tavianator@gmail.com> | 2010-04-06 01:24:42 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2010-04-06 01:24:42 -0400 |
commit | b7405924923986314b09460995c2ebce3b717100 (patch) | |
tree | b1bd9c4defdbaabda88e90af69d4ea9dfa75a817 /libdimension/geometry.c | |
parent | e328a1d560b7924084b7a45160a75f2a0d3a6e27 (diff) | |
download | dimension-b7405924923986314b09460995c2ebce3b717100.tar.xz |
New dmnsn_bounding_box type.
Diffstat (limited to 'libdimension/geometry.c')
-rw-r--r-- | libdimension/geometry.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libdimension/geometry.c b/libdimension/geometry.c index fd21d52..7dc6725 100644 --- a/libdimension/geometry.c +++ b/libdimension/geometry.c @@ -359,6 +359,53 @@ dmnsn_matrix_vector_mul(dmnsn_matrix lhs, dmnsn_vector rhs) return dmnsn_vector_div(r, w); } +/* Give an axis-aligned box that contains the given box transformed by `lhs' */ +dmnsn_bounding_box +dmnsn_matrix_bounding_box_mul(dmnsn_matrix trans, dmnsn_bounding_box box) +{ + dmnsn_vector corner; + dmnsn_bounding_box ret; + ret.min = dmnsn_matrix_vector_mul(trans, box.min); + ret.max = ret.min; + + corner = dmnsn_new_vector(box.min.x, box.min.y, box.max.z); + corner = dmnsn_matrix_vector_mul(trans, corner); + ret.min = dmnsn_vector_min(ret.min, corner); + ret.max = dmnsn_vector_max(ret.max, corner); + + corner = dmnsn_new_vector(box.min.x, box.max.y, box.min.z); + corner = dmnsn_matrix_vector_mul(trans, corner); + ret.min = dmnsn_vector_min(ret.min, corner); + ret.max = dmnsn_vector_max(ret.max, corner); + + corner = dmnsn_new_vector(box.min.x, box.max.y, box.max.z); + corner = dmnsn_matrix_vector_mul(trans, corner); + ret.min = dmnsn_vector_min(ret.min, corner); + ret.max = dmnsn_vector_max(ret.max, corner); + + corner = dmnsn_new_vector(box.max.x, box.min.y, box.min.z); + corner = dmnsn_matrix_vector_mul(trans, corner); + ret.min = dmnsn_vector_min(ret.min, corner); + ret.max = dmnsn_vector_max(ret.max, corner); + + corner = dmnsn_new_vector(box.max.x, box.min.y, box.max.z); + corner = dmnsn_matrix_vector_mul(trans, corner); + ret.min = dmnsn_vector_min(ret.min, corner); + ret.max = dmnsn_vector_max(ret.max, corner); + + corner = dmnsn_new_vector(box.max.x, box.max.y, box.min.z); + corner = dmnsn_matrix_vector_mul(trans, corner); + ret.min = dmnsn_vector_min(ret.min, corner); + ret.max = dmnsn_vector_max(ret.max, corner); + + corner = dmnsn_new_vector(box.max.x, box.max.y, box.max.z); + corner = dmnsn_matrix_vector_mul(trans, corner); + ret.min = dmnsn_vector_min(ret.min, corner); + ret.max = dmnsn_vector_max(ret.max, corner); + + return ret; +} + /* Solve for the t value such that x0 + t*n = x */ double dmnsn_line_index(dmnsn_line l, dmnsn_vector x) |