diff options
author | Michele Calgaro <[email protected]> | 2020-09-11 14:38:47 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2020-09-11 14:38:47 +0900 |
commit | 884c8093d63402a1ad0b502244b791e3c6782be3 (patch) | |
tree | a600d4ab0d431a2bdfe4c15b70df43c14fbd8dd0 /debian/fireflies/fireflies-2.08/libgfx/include/gfx/geom3d.h | |
parent | 14e1aa2006796f147f3f4811fb908a6b01e79253 (diff) | |
download | extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.tar.gz extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.zip |
Added debian extra dependency packages.
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'debian/fireflies/fireflies-2.08/libgfx/include/gfx/geom3d.h')
-rw-r--r-- | debian/fireflies/fireflies-2.08/libgfx/include/gfx/geom3d.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/debian/fireflies/fireflies-2.08/libgfx/include/gfx/geom3d.h b/debian/fireflies/fireflies-2.08/libgfx/include/gfx/geom3d.h new file mode 100644 index 00000000..817bb6f2 --- /dev/null +++ b/debian/fireflies/fireflies-2.08/libgfx/include/gfx/geom3d.h @@ -0,0 +1,133 @@ +#ifndef GFXGEOM3D_INCLUDED +#define GFXGEOM3D_INCLUDED +#if !defined(__GNUC__) +# pragma once +#endif + +/************************************************************************ + + Handy 3D geometrical primitives + + $Id: geom3d.h 432 2004-11-02 22:55:41Z garland $ + + ************************************************************************/ + +#include "vec3.h" + +namespace gfx +{ + +// +// Computing properties of triangles +// + +template<class Vec> +inline Vec triangle_raw_normal(const Vec& v1, const Vec& v2, const Vec& v3) +{ + return cross(v2-v1, v3-v1); +} + +template<class Vec> +inline typename Vec::value_type + triangle_area(const Vec& v1,const Vec& v2,const Vec& v3) +{ + return 0.5 * norm(triangle_raw_normal(v1, v2, v3)); +} + +template<class Vec> +inline Vec triangle_normal(const Vec& v1, const Vec& v2, const Vec& v3) +{ + Vec n = triangle_raw_normal(v1, v2, v3); + unitize(n); + return n; +} + +template<class Vec, class Plane> +inline Plane triangle_plane(const Vec& v1, const Vec& v2, const Vec& v3) +{ + Vec n = triangle_normal(v1, v2, v3); + return Plane(n, -(n*v1)); +} + +template<class Vec, class Plane> +inline Plane triangle_raw_plane(const Vec& v1, const Vec& v2, const Vec& v3) +{ + Vec n = triangle_raw_normal(v1, v2, v3); + return Plane(n, -(n*v1)); +} + +template< class Vec> +inline typename Vec::value_type + triangle_compactness(const Vec& v1, const Vec& v2, const Vec& v3) +{ + const double FOUR_ROOT3 = 6.928203230275509; + + return FOUR_ROOT3 * triangle_area(v1, v2, v3) / + ( norm2(v2 - v1) + norm2(v3 - v2) + norm2(v1 - v3) ); +} + +// +// Operations with axis-aligned bounding boxes +// + +template<class Vec, class List> +void update_bbox(Vec& min, Vec& max, const List& items) +{ + typedef typename List::const_iterator iterator; + + for(iterator i=items.begin(); i!=items.end(); i++) + { + const Vec& v = *i; + for(int j=0; j<Vec::dim(); j++) + { + if( v[j] < min[j] ) min[j] = v[j]; + if( v[j] > max[j] ) max[j] = v[j]; + } + } +} + +template<class Vec, class List> +void compute_bbox(Vec& min, Vec& max, const List& items) +{ + if( items.size()==0 ) min = max = 0; + else min = max = items[0]; + + update_bbox(min, max, items); +} + +template<class Vec> +bool is_inside_bbox(const Vec& p, const Vec& min, Vec& max) +{ + for(int i=0; i<Vec::dim(); i++) + if( p[i]<min[i] || p[i]>max[i] ) + return false; + + return true; +} + +template<class Vec> +Vec clamp_to_bbox(Vec p, const Vec& min, const Vec& max) +{ + for(int i=0; i<Vec::dim(); i++) + { + if (p[i]<min[i]) p[i]=min[i]; + else if (p[i]>max[i]) p[i]=max[i]; + } + + return p; +} + +// +// Computing properties of tetrahedra +// + +extern double tetrahedron_determinant(const Vec3& v0, const Vec3& v1, + const Vec3& v2, const Vec3& v3); + +extern double tetrahedron_volume(const Vec3& v0, const Vec3& v1, + const Vec3& v2, const Vec3& v3); + +} // namespace gfx + +// GFXGEOM3D_INCLUDED +#endif |