/// <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); }
/// <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())); }