00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _BBOXTREE_H_
00028 #define _BBOXTREE_H_
00029
00030 #include "BBox.h"
00031 #include "Polytope.h"
00032
00033 class Convex;
00034 class Transform;
00035 class Matrix;
00036
00037 class BBoxNode {
00038 public:
00039 enum TagType { LEAF, INTERNAL };
00040
00041 BBox bbox;
00042
00043 TagType tag;
00044 };
00045
00046 class BBoxLeaf : public BBoxNode {
00047 public:
00048 const Polytope *poly;
00049
00050 BBoxLeaf() {}
00051 BBoxLeaf(const Polytope *p) : poly(p) {
00052 tag = LEAF;
00053 fitBBox();
00054 }
00055
00056 void fitBBox();
00057 };
00058
00059 class BBoxInternal : public BBoxNode {
00060 public:
00061 BBoxNode *lson;
00062 BBoxNode *rson;
00063
00064 BBoxInternal() {}
00065 BBoxInternal(int n, BBoxLeaf *l);
00066
00067 void refitBBox() { bbox.enclose(lson->bbox, rson->bbox); }
00068 };
00069
00070
00071
00072 bool intersect(const BBoxNode *tree, const Convex& c, const BBox& bb,
00073 const Transform& b2a, Vector& v);
00074
00075 bool intersect(const BBoxNode *a, const BBoxNode *b,
00076 const Transform& b2a, const Matrix& abs_b2a,
00077 const Transform& a2b, const Matrix& abs_a2b, Vector& v);
00078
00079 bool find_prim(const BBoxNode *tree, const Convex& c, const BBox& bb,
00080 const Transform& b2a, Vector& v, ShapePtr& p);
00081
00082 bool find_prim(const BBoxNode *a, const BBoxNode *b,
00083 const Transform& b2a, const Matrix& abs_b2a,
00084 const Transform& a2b, const Matrix& abs_a2b,
00085 Vector& v, ShapePtr& pa, ShapePtr& pb);
00086
00087 bool common_point(const BBoxNode *tree, const Convex& c, const BBox& bb,
00088 const Transform& b2a, Vector& v, Point& pa, Point& pb);
00089
00090 bool common_point(const BBoxNode *a, const BBoxNode *b,
00091 const Transform& b2a, const Matrix& abs_b2a,
00092 const Transform& a2b, const Matrix& abs_a2b,
00093 Vector& v, Point& pa, Point& pb);
00094
00095 #endif
00096
00097
00098
00099
00100
00101