⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imathboxalgo.h

📁 image converter source code
💻 H
📖 第 1 页 / 共 2 页
字号:
    min2new = max2new = M[3][2];    a = M[0][2] * min0;    b = M[0][2] * max0;    if (a < b) {        min2new += a;        max2new += b;    } else {        min2new += b;        max2new += a;    }    a = M[1][2] * min1;    b = M[1][2] * max1;    if (a < b) {        min2new += a;        max2new += b;    } else {        min2new += b;        max2new += a;    }    a = M[2][2] * min2;    b = M[2][2] * max2;    if (a < b) {        min2new += a;        max2new += b;    } else {        min2new += b;        max2new += a;    }    Box< Vec3<T> > xbbox;    xbbox.min[0] = min0new;    xbbox.max[0] = max0new;    xbbox.min[1] = min1new;    xbbox.max[1] = max1new;    xbbox.min[2] = min2new;    xbbox.max[2] = max2new;    return xbbox;}template <class T>bool findEntryAndExitPoints(const Line3<T>& line,			    const Box<Vec3<T> >& box,			    Vec3<T> &enterPoint,			    Vec3<T> &exitPoint){    if ( box.isEmpty() ) return false;    if ( line.distanceTo(box.center()) > box.size().length()/2. ) return false;    Vec3<T>	points[8], inter, bary;    Plane3<T>	plane;    int		i, v0, v1, v2;    bool	front = false, valid, validIntersection = false;    // set up the eight coords of the corners of the box    for(i = 0; i < 8; i++)     {	points[i].setValue( i & 01 ? box.min[0] : box.max[0],			    i & 02 ? box.min[1] : box.max[1],			    i & 04 ? box.min[2] : box.max[2]);    }    // intersect the 12 triangles.    for(i = 0; i < 12; i++)     {	switch(i)         {	case  0: v0 = 2; v1 = 1; v2 = 0; break;		// +z	case  1: v0 = 2; v1 = 3; v2 = 1; break;	case  2: v0 = 4; v1 = 5; v2 = 6; break;		// -z	case  3: v0 = 6; v1 = 5; v2 = 7; break;	case  4: v0 = 0; v1 = 6; v2 = 2; break;		// -x	case  5: v0 = 0; v1 = 4; v2 = 6; break;	case  6: v0 = 1; v1 = 3; v2 = 7; break;		// +x	case  7: v0 = 1; v1 = 7; v2 = 5; break;	case  8: v0 = 1; v1 = 4; v2 = 0; break;		// -y	case  9: v0 = 1; v1 = 5; v2 = 4; break;	case 10: v0 = 2; v1 = 7; v2 = 3; break;		// +y	case 11: v0 = 2; v1 = 6; v2 = 7; break;	}	if((valid=intersect (line, points[v0], points[v1], points[v2],                             inter, bary, front)) == true)         {	    if(front == true)             {		enterPoint = inter;		validIntersection = valid;	    }	    else             {		exitPoint = inter;		validIntersection = valid;	    }	}    }    return validIntersection;}template<class T>boolintersects (const Box< Vec3<T> > &b, const Line3<T> &r, Vec3<T> &ip){    //    // Intersect a ray, r, with a box, b, and compute the intersection    // point, ip:    //    // intersect() returns    //    //     - true if the ray starts inside the box or if the    //       ray starts outside and intersects the box    //    //     - false if the ray starts outside the box and intersects it,    //       but the intersection is behind the ray's origin.    //    //     - false if the ray starts outside and does not intersect it    //    // The intersection point is    //    //     - the ray's origin if the ray starts inside the box    //    //     - a point on one of the faces of the box if the ray    //       starts outside the box    //    //     - undefined when intersect() returns false    //    if (b.isEmpty())    {	//	// No ray intersects an empty box	//	return false;    }    if (b.intersects (r.pos))    {	//	// The ray starts inside the box	//	ip = r.pos;	return true;    }    //    // The ray starts outside the box.  Between one and three "frontfacing"    // sides of the box are oriented towards the ray, and between one and    // three "backfacing" sides are oriented away from the ray.    // We intersect the ray with the planes that contain the sides of the    // box, and compare the distances between the ray-plane intersections.    // The ray intersects the box if the most distant frontfacing intersection    // is nearer than the nearest backfacing intersection.  If the ray does    // intersect the box, then the most distant frontfacing ray-plane    // intersection is the ray-box intersection.    //    const T TMAX = limits<T>::max();    T tFrontMax = -1;    T tBackMin = TMAX;    //    // Minimum and maximum X sides.    //    if (r.dir.x > 0)    {	if (r.pos.x > b.max.x)	    return false;	T d = b.max.x - r.pos.x;	if (r.dir.x > 1 || d < TMAX * r.dir.x)	{	    T t = d / r.dir.x;	    if (tBackMin > t)		tBackMin = t;	}	if (r.pos.x <= b.min.x)	{	    T d = b.min.x - r.pos.x;	    T t = (r.dir.x > 1 || d < TMAX * r.dir.x)? d / r.dir.x: TMAX;	    if (tFrontMax < t)	    {		tFrontMax = t;		ip.x = b.min.x; 		ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);		ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);	    }	}    }    else if (r.dir.x < 0)    {	if (r.pos.x < b.min.x)	    return false;	T d = b.min.x - r.pos.x;	if (r.dir.x < -1 || d > TMAX * r.dir.x)	{	    T t = d / r.dir.x;	    if (tBackMin > t)		tBackMin = t;	}	if (r.pos.x >= b.max.x)	{	    T d = b.max.x - r.pos.x;	    T t = (r.dir.x < -1 || d > TMAX * r.dir.x)? d / r.dir.x: TMAX;	    if (tFrontMax < t)	    {		tFrontMax = t;		ip.x = b.max.x; 		ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);		ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);	    }	}    }    else // r.dir.x == 0    {	if (r.pos.x < b.min.x || r.pos.x > b.max.x)	    return false;    }    //    // Minimum and maximum Y sides.    //    if (r.dir.y > 0)    {	if (r.pos.y > b.max.y)	    return false;	T d = b.max.y - r.pos.y;	if (r.dir.y > 1 || d < TMAX * r.dir.y)	{	    T t = d / r.dir.y;	    if (tBackMin > t)		tBackMin = t;	}	if (r.pos.y <= b.min.y)	{	    T d = b.min.y - r.pos.y;	    T t = (r.dir.y > 1 || d < TMAX * r.dir.y)? d / r.dir.y: TMAX;	    if (tFrontMax < t)	    {		tFrontMax = t;		ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);		ip.y = b.min.y; 		ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);	    }	}    }    else if (r.dir.y < 0)    {	if (r.pos.y < b.min.y)	    return false;	T d = b.min.y - r.pos.y;	if (r.dir.y < -1 || d > TMAX * r.dir.y)	{	    T t = d / r.dir.y;	    if (tBackMin > t)		tBackMin = t;	}	if (r.pos.y >= b.max.y)	{	    T d = b.max.y - r.pos.y;	    T t = (r.dir.y < -1 || d > TMAX * r.dir.y)? d / r.dir.y: TMAX;	    	    if (tFrontMax < t)	    {		tFrontMax = t;		ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);		ip.y = b.max.y; 		ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z);	    }	}    }    else // r.dir.y == 0    {	if (r.pos.y < b.min.y || r.pos.y > b.max.y)	    return false;    }    //    // Minimum and maximum Z sides.    //    if (r.dir.z > 0)    {	if (r.pos.z > b.max.z)	    return false;	T d = b.max.z - r.pos.z;	if (r.dir.z > 1 || d < TMAX * r.dir.z)	{	    T t = d / r.dir.z;	    if (tBackMin > t)		tBackMin = t;	}	if (r.pos.z <= b.min.z)	{	    T d = b.min.z - r.pos.z;	    T t = (r.dir.z > 1 || d < TMAX * r.dir.z)? d / r.dir.z: TMAX;	    	    if (tFrontMax < t)	    {		tFrontMax = t;		ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);		ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);		ip.z = b.min.z; 	    }	}    }    else if (r.dir.z < 0)    {	if (r.pos.z < b.min.z)	    return false;	T d = b.min.z - r.pos.z;	if (r.dir.z < -1 || d > TMAX * r.dir.z)	{	    T t = d / r.dir.z;	    if (tBackMin > t)		tBackMin = t;	}	if (r.pos.z >= b.max.z)	{	    T d = b.max.z - r.pos.z;	    T t = (r.dir.z < -1 || d > TMAX * r.dir.z)? d / r.dir.z: TMAX;	    	    if (tFrontMax < t)	    {		tFrontMax = t;		ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x);		ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y);		ip.z = b.max.z; 	    }	}    }    else // r.dir.z == 0    {	if (r.pos.z < b.min.z || r.pos.z > b.max.z)	    return false;    }    return tFrontMax <= tBackMin;}template<class T>boolintersects (const Box< Vec3<T> > &box, const Line3<T> &ray){    Vec3<T> ignored;    return intersects (box, ray, ignored);}} // namespace Imath#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -