Exemple #1
0
        /// <summary>
        /// Test if a frustum is fully inside, outside, or just intersecting the sphere.
        /// </summary>
        /// <param name="frustum">The frustum for testing.</param>
        /// <returns>The containment type.</returns>
        public ContainmentType Contains(BoundingFrustum frustum)
        {
            //check if all corner is in sphere
            bool inside = true;

            Vector3[] corners = frustum.GetCorners();
            foreach (Vector3 corner in corners)
            {
                if (this.Contains(corner) == ContainmentType.Disjoint)
                {
                    inside = false;
                    break;
                }
            }
            if (inside)
            {
                return(ContainmentType.Contains);
            }

            //check if the distance from sphere center to frustrum face < radius
            double dmin = 0;

            //TODO : calcul dmin

            if (dmin <= Radius * Radius)
            {
                return(ContainmentType.Intersects);
            }

            //else disjoint
            return(ContainmentType.Disjoint);
        }
        public ContainmentType Contains(BoundingFrustum frustum)
        {
            //TODO: bad done here need a fix.
            //Because question is not frustum contain box but reverse and this is not the same
            int             i;
            ContainmentType contained;

            Vector3[] corners = frustum.GetCorners();

            // First we check if frustum is in box
            for (i = 0; i < corners.Length; i++)
            {
                this.Contains(ref corners[i], out contained);
                if (contained == ContainmentType.Disjoint)
                {
                    break;
                }
            }

            if (i == corners.Length) // This means we checked all the corners and they were all contain or instersect
            {
                return(ContainmentType.Contains);
            }

            if (i != 0)             // if i is not equal to zero, we can fastpath and say that this box intersects
            {
                return(ContainmentType.Intersects);
            }


            // If we get here, it means the first (and only) point we checked was actually contained in the frustum.
            // So we assume that all other points will also be contained. If one of the points is disjoint, we can
            // exit immediately saying that the result is Intersects
            i++;
            for (; i < corners.Length; i++)
            {
                this.Contains(ref corners[i], out contained);
                if (contained != ContainmentType.Contains)
                {
                    return(ContainmentType.Intersects);
                }
            }

            // If we get here, then we know all the points were actually contained, therefore result is Contains
            return(ContainmentType.Contains);
        }
Exemple #3
0
 /// <summary>
 /// Creates the smallest <see cref="BoundingSphere"/> that can contain a specified <see cref="BoundingFrustum"/>.
 /// </summary>
 /// <param name="frustum">The frustum to create the sphere from.</param>
 /// <returns>The new <see cref="BoundingSphere"/>.</returns>
 public static BoundingSphere CreateFromFrustum(BoundingFrustum frustum)
 {
     return(CreateFromPoints(frustum.GetCorners()));
 }