6 changed files with 90 additions and 12 deletions
			
			
		@ -1,4 +0,0 @@ | 
				
			|||||
#ifndef MATHDEF_H_ | 
					 | 
				
			||||
#define MATHDEF_H_ | 
					 | 
				
			||||
 | 
					 | 
				
			||||
#endif | 
					 | 
				
			||||
@ -0,0 +1,68 @@ | 
				
			|||||
 | 
					#include "bvh.cpp" | 
				
			||||
 | 
					#include <iostream> | 
				
			||||
 | 
					#include <algorithm> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					bool CurveCurveBVHIntersect(BVH_AABB_NodePtr &BoxPtr1, BVH_AABB_NodePtr &BoxPtr2, std::vector<std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr>> &IstNodePtr) | 
				
			||||
 | 
					{ | 
				
			||||
 | 
					    AABB box1 = BoxPtr1->bound; | 
				
			||||
 | 
					    AABB box2 = BoxPtr2->bound; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    auto LineIntersect = [](double x1, double x2, double x1_, double x2_) | 
				
			||||
 | 
					    { | 
				
			||||
 | 
					        bool LIntersect = false; | 
				
			||||
 | 
					        if ((x2 <= x2_ && x2 >= x1_) || (x1_ <= x2 && x1_ >= x1)) | 
				
			||||
 | 
					            LIntersect = true; | 
				
			||||
 | 
					        return LIntersect; | 
				
			||||
 | 
					    }; | 
				
			||||
 | 
					    auto BoxIntersect = [&]() | 
				
			||||
 | 
					    { | 
				
			||||
 | 
					        double x1 = box1.Bmin.x, x1_ = box2.Bmin.x; | 
				
			||||
 | 
					        double x2 = box1.Bmax.x, x2_ = box2.Bmax.x; | 
				
			||||
 | 
					        double y1 = box1.Bmin.y, y1_ = box2.Bmin.y; | 
				
			||||
 | 
					        double y2 = box1.Bmax.y, y2_ = box2.Bmax.y; | 
				
			||||
 | 
					        double z1 = box1.Bmin.z, z1_ = box2.Bmin.z; | 
				
			||||
 | 
					        double z2 = box1.Bmax.z, z2_ = box2.Bmax.z; | 
				
			||||
 | 
					        if (LineIntersect(x1, x2, x1_, x2_) && LineIntersect(y1, y2, y1_, y2_) && LineIntersect(z1, z2, z1_, z2_)) | 
				
			||||
 | 
					            return true; | 
				
			||||
 | 
					        else | 
				
			||||
 | 
					            false; | 
				
			||||
 | 
					    }; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    int biggerbox = 1; | 
				
			||||
 | 
					    if (glm::distance(box1.Bmax, box1.Bmin) < glm::distance(box2.Bmax, box2.Bmin)) | 
				
			||||
 | 
					        biggerbox = 2; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    if (BoxIntersect()) | 
				
			||||
 | 
					    { | 
				
			||||
 | 
					        if (biggerbox == 1) | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (BoxPtr1->childPtr.size() == 0) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr> pi = std::make_pair(BoxPtr1, BoxPtr2); | 
				
			||||
 | 
					                IstNodePtr.push_back(pi); | 
				
			||||
 | 
					                return true; | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            for (auto it : BoxPtr1->childPtr) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                CurveCurveBVHIntersect(it, BoxPtr2, IstNodePtr) | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        else | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (BoxPtr2->childPtr.size() == 0) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr> pi = std::make_pair(BoxPtr2, BoxPtr1); | 
				
			||||
 | 
					                IstNodePtr.push_back(pi); | 
				
			||||
 | 
					                return true; | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            for (auto it : BoxPtr2->childPtr) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                CurveCurveBVHIntersect(BoxPtr1, it, IstNodePtr); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					    else | 
				
			||||
 | 
					    { | 
				
			||||
 | 
					        return false; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue