/** * Finds the intersection point of a ray with the panel. * The ray is defined by a point and a direction vector. *@param A the ray's origin *@param U the ray's direction *@param I the intersection point *@param dist the distance of A to the panel in the direction of the panel's normal */ bool Panel::Intersect(CVector const &A, CVector const &U, CVector &I, double &dist) { static CVector ILA, ILB, ITA, ITB; static CVector T, V, W, P; static bool b1, b2, b3, b4; static double r,s; ILA.Copy(s_pNode[m_iLA]); ITA.Copy(s_pNode[m_iTA]); ILB.Copy(s_pNode[m_iLB]); ITB.Copy(s_pNode[m_iTB]); r = (CollPt.x-A.x)*Normal.x + (CollPt.y-A.y)*Normal.y + (CollPt.z-A.z)*Normal.z ; s = U.x*Normal.x + U.y*Normal.y + U.z*Normal.z; dist = 10000.0; if(qAbs(s)>0.0) { dist = r/s; //inline operations to save time P.x = A.x + U.x * dist; P.y = A.y + U.y * dist; P.z = A.z + U.z * dist; // P is inside the panel if on left side of each panel side W.x = P.x - ITA.x; W.y = P.y - ITA.y; W.z = P.z - ITA.z; V.x = ITB.x - ITA.x; V.y = ITB.y - ITA.y; V.z = ITB.z - ITA.z; T.x = V.y * W.z - V.z * W.y; T.y = -V.x * W.z + V.z * W.x; T.z = V.x * W.y - V.y * W.x; if(T.x*T.x+T.y*T.y+T.z*T.z <1.0e-10 || T.x*Normal.x+T.y*Normal.y+T.z*Normal.z>=0.0) b1 = true; else b1 = false; W.x = P.x - ITB.x; W.y = P.y - ITB.y; W.z = P.z - ITB.z; V.x = ILB.x - ITB.x; V.y = ILB.y - ITB.y; V.z = ILB.z - ITB.z; T.x = V.y * W.z - V.z * W.y; T.y = -V.x * W.z + V.z * W.x; T.z = V.x * W.y - V.y * W.x; if(T.x*T.x+T.y*T.y+T.z*T.z <1.0e-10 || T.x*Normal.x+T.y*Normal.y+T.z*Normal.z>=0.0) b2 = true; else b2 = false; W.x = P.x - ILB.x; W.y = P.y - ILB.y; W.z = P.z - ILB.z; V.x = ILA.x - ILB.x; V.y = ILA.y - ILB.y; V.z = ILA.z - ILB.z; T.x = V.y * W.z - V.z * W.y; T.y = -V.x * W.z + V.z * W.x; T.z = V.x * W.y - V.y * W.x; if(T.x*T.x+T.y*T.y+T.z*T.z <1.0e-10 || T.x*Normal.x+T.y*Normal.y+T.z*Normal.z>=0.0) b3 = true; else b3 = false; W.x = P.x - ILA.x; W.y = P.y - ILA.y; W.z = P.z - ILA.z; V.x = ITA.x - ILA.x; V.y = ITA.y - ILA.y; V.z = ITA.z - ILA.z; T.x = V.y * W.z - V.z * W.y; T.y = -V.x * W.z + V.z * W.x; T.z = V.x * W.y - V.y * W.x; if(T.x*T.x+T.y*T.y+T.z*T.z <1.0e-10 || T.x*Normal.x+T.y*Normal.y+T.z*Normal.z>=0.0) b4 = true; else b4 = false; if(b1 && b2 && b3 && b4) { I.Set(P.x, P.y, P.z); return true; } } return false; }