Example #1
0
        public bool Intersect(NuGenRay3F ray, ref float t, ref float u, ref float v, ref NuGenVec3F normal)
        {
            NuGenVec3F e1 = p1 - p0;
            NuGenVec3F e2 = p2 - p0;
            NuGenVec3F p  = NuGenVec3F.Cross(ray.Direction, e2);

            float a = NuGenVec3F.Dot(e1, p);

            if (a > -NuGenVector.TINY_FLOAT && a < NuGenVector.TINY_FLOAT)
            {
                return(false);
            }
            float      f = 1.0f / a;
            NuGenVec3F s = ray.Point - p0;

            u = f * NuGenVec3F.Dot(s, p);

            if (u < 0.0f || u > 1.0f)
            {
                return(false);
            }
            NuGenVec3F q = NuGenVec3F.Cross(s, e1);

            v = f * NuGenVec3F.Dot(ray.Direction, q);

            if (v < 0.0f || (u + v) > 1.0f)
            {
                return(false);
            }
            t      = f * NuGenVec3F.Dot(e2, q);
            normal = NuGenVec3F.Cross(e1, e2); normal.Normalize();
            return(true);
        }
Example #2
0
        public bool Intersect(NuGenRay3F ray, ref float t, ref NuGenVec3F normal)
        {
            NuGenVec3F l  = center - ray.Point;
            float      s  = NuGenVec3F.Dot(l, ray.Direction);
            float      l2 = l.SquaredLength;
            float      rr = radius * radius;

            if (s < 0.0f && l2 > rr)
            {
                return(false);
            }
            float m2 = l2 - s * s;

            if (m2 > rr)
            {
                return(false);
            }
            float q = (float)Math.Sqrt(rr - m2);

            if (l2 > rr)
            {
                t = s - q;
            }

            else
            {
                t = s + q;
            }
            normal = (ray.Point + ray.Direction * t) - center;
            normal.Normalize();
            return(true);
        }
Example #3
0
        public bool Intersect(NuGenRay3F ray, ref float t, ref NuGenVec3F normal)
        {
            NuGenVec3F l = center - ray.Point;
            float s = NuGenVec3F.Dot(l, ray.Direction);
            float l2 = l.SquaredLength;
            float rr = radius * radius;

            if (s < 0.0f && l2 > rr) return false;
            float m2 = l2 - s * s;

            if (m2 > rr) return false;
            float q = (float)Math.Sqrt(rr - m2);

            if (l2 > rr) t = s - q;

            else t = s + q;
            normal = (ray.Point + ray.Direction * t) - center;
            normal.Normalize();
            return true;
        }
        public bool Intersect(NuGenRay3F ray, ref float t, ref float u, ref float v, ref NuGenVec3F normal)
        {
            NuGenVec3F e1 = p1 - p0;
            NuGenVec3F e2 = p2 - p0;
            NuGenVec3F p = NuGenVec3F.Cross(ray.Direction, e2);

            float a = NuGenVec3F.Dot(e1, p);

            if (a > -NuGenVector.TINY_FLOAT && a < NuGenVector.TINY_FLOAT) return false;
            float f = 1.0f / a;
            NuGenVec3F s = ray.Point - p0;
            u = f * NuGenVec3F.Dot(s, p);

            if (u < 0.0f || u > 1.0f) return false;
            NuGenVec3F q = NuGenVec3F.Cross(s, e1);
            v = f * NuGenVec3F.Dot(ray.Direction, q);

            if (v < 0.0f || (u + v) > 1.0f) return false;
            t = f * NuGenVec3F.Dot(e2, q);
            normal = NuGenVec3F.Cross(e1, e2); normal.Normalize();
            return true;
        }
Example #5
0
        public bool Intersect(NuGenRay3F r)
        {
            bool inside = true;

            int[] quadrant = new int[3];
            int   i;
            int   whichPlane;

            float[]    max            = new float[3];
            float[]    candidatePlane = new float[3];
            NuGenVec3D coord          = new NuGenVec3D(0, 0, 0);

            for (i = 0; i < 3; i++)
            {
                if (r.Point[i] < lower[i])
                {
                    quadrant[i]       = 1;
                    candidatePlane[i] = lower[i];
                    inside            = false;
                }

                else if (r.Point[i] > upper[i])
                {
                    quadrant[i]       = 0;
                    candidatePlane[i] = upper[i];
                    inside            = false;
                }

                else
                {
                    quadrant[i] = 2;
                }
            }

            if (inside)
            {
                return(true);
            }

            for (i = 0; i < 3; i++)
            {
                if (quadrant[i] != 2 && r.Direction[i] != 0.0)
                {
                    max[i] = (candidatePlane[i] - r.Point[i]) / r.Direction[i];
                }

                else
                {
                    max[i] = -1.0f;
                }
            }

            whichPlane = 0;

            for (i = 1; i < 3; i++)
            {
                if (max[whichPlane] < max[i])
                {
                    whichPlane = i;
                }
            }

            if (max[whichPlane] < 0.0)
            {
                return(false);
            }

            for (i = 0; i < 3; i++)
            {
                if (whichPlane != i)
                {
                    coord[i] = r.Point[i] + max[whichPlane] * r.Direction[i];

                    if (coord[i] < lower[i] || coord[i] > upper[i])
                    {
                        return(false);
                    }
                }

                else
                {
                    coord[i] = candidatePlane[i];
                }
            }

            return(true);
        }
Example #6
0
        public bool Intersect(NuGenRay3F r)
        {
            bool inside = true;
            int[] quadrant = new int[3];
            int i;
            int whichPlane;
            float[] max = new float[3];
            float[] candidatePlane = new float[3];
            NuGenVec3D coord = new NuGenVec3D(0, 0, 0);

            for (i = 0; i < 3; i++)
            {

                if (r.Point[i] < lower[i])
                {
                    quadrant[i] = 1;
                    candidatePlane[i] = lower[i];
                    inside = false;
                }

                else if (r.Point[i] > upper[i])
                {
                    quadrant[i] = 0;
                    candidatePlane[i] = upper[i];
                    inside = false;
                }

                else
                {
                    quadrant[i] = 2;
                }
            }

            if (inside) return true;

            for (i = 0; i < 3; i++)
            {

                if (quadrant[i] != 2 && r.Direction[i] != 0.0)
                {
                    max[i] = (candidatePlane[i] - r.Point[i]) / r.Direction[i];
                }

                else
                {
                    max[i] = -1.0f;
                }
            }

            whichPlane = 0;

            for (i = 1; i < 3; i++)
            {

                if (max[whichPlane] < max[i]) whichPlane = i;
            }

            if (max[whichPlane] < 0.0) return false;

            for (i = 0; i < 3; i++)
            {

                if (whichPlane != i)
                {
                    coord[i] = r.Point[i] + max[whichPlane] * r.Direction[i];

                    if (coord[i] < lower[i] || coord[i] > upper[i])
                    {
                        return false;
                    }
                }

                else
                {
                    coord[i] = candidatePlane[i];
                }
            }

            return true;
        }