Beispiel #1
0
        //public ContainmentType Contains(BoundingBox box)
        //{
        //    //test if all corner is in the same side of a face by just checking min and max
        //    if (box.Max.X < Min.X
        //        || box.Min.X > Max.X
        //        || box.Max.Y < Min.Y
        //        || box.Min.Y > Max.Y
        //        || box.Max.Z < Min.Z
        //        || box.Min.Z > Max.Z)
        //        return ContainmentType.Disjoint;


        //    if (box.Min.X >= Min.X
        //        && box.Max.X <= Max.X
        //        && box.Min.Y >= Min.Y
        //        && box.Max.Y <= Max.Y
        //        && box.Min.Z >= Min.Z
        //        && box.Max.Z <= Max.Z)
        //        return ContainmentType.Contains;

        //    return ContainmentType.Intersects;
        //}

        //public void Contains(ref BoundingBox box, out ContainmentType result)
        //{
        //    result = Contains(box);
        //}

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

        //public ContainmentType Contains(BoundingSphere sphere)
        //{
        //    if (sphere.Center.X - Min.X > sphere.Radius
        //        && sphere.Center.Y - Min.Y > sphere.Radius
        //        && sphere.Center.Z - Min.Z > sphere.Radius
        //        && Max.X - sphere.Center.X > sphere.Radius
        //        && Max.Y - sphere.Center.Y > sphere.Radius
        //        && Max.Z - sphere.Center.Z > sphere.Radius)
        //        return ContainmentType.Contains;

        //    double dmin = 0;

        //    if (sphere.Center.X - Min.X <= sphere.Radius)
        //        dmin += (sphere.Center.X - Min.X) * (sphere.Center.X - Min.X);
        //    else if (Max.X - sphere.Center.X <= sphere.Radius)
        //        dmin += (sphere.Center.X - Max.X) * (sphere.Center.X - Max.X);
        //    if (sphere.Center.Y - Min.Y <= sphere.Radius)
        //        dmin += (sphere.Center.Y - Min.Y) * (sphere.Center.Y - Min.Y);
        //    else if (Max.Y - sphere.Center.Y <= sphere.Radius)
        //        dmin += (sphere.Center.Y - Max.Y) * (sphere.Center.Y - Max.Y);
        //    if (sphere.Center.Z - Min.Z <= sphere.Radius)
        //        dmin += (sphere.Center.Z - Min.Z) * (sphere.Center.Z - Min.Z);
        //    else if (Max.Z - sphere.Center.Z <= sphere.Radius)
        //        dmin += (sphere.Center.Z - Max.Z) * (sphere.Center.Z - Max.Z);

        //    if (dmin <= sphere.Radius * sphere.Radius)
        //        return ContainmentType.Intersects;

        //    return ContainmentType.Disjoint;
        //}

        //public void Contains(ref BoundingSphere sphere, out ContainmentType result)
        //{
        //    result = this.Contains(sphere);
        //}

        //public ContainmentType Contains(Vector3 point)
        //{
        //    ContainmentType result;
        //    this.Contains(ref point, out result);
        //    return result;
        //}

        //public void Contains(ref Vector3 point, out ContainmentType result)
        //{
        //    //first we get if point is out of box
        //    if (point.X < this.Min.X
        //        || point.X > this.Max.X
        //        || point.Y < this.Min.Y
        //        || point.Y > this.Max.Y
        //        || point.Z < this.Min.Z
        //        || point.Z > this.Max.Z)
        //    {
        //        result = ContainmentType.Disjoint;
        //    }//or if point is on box because coordonate of point is lesser or equal
        //    else if (point.X == this.Min.X
        //        || point.X == this.Max.X
        //        || point.Y == this.Min.Y
        //        || point.Y == this.Max.Y
        //        || point.Z == this.Min.Z
        //        || point.Z == this.Max.Z)
        //        result = ContainmentType.Intersects;
        //    else
        //        result = ContainmentType.Contains;


        //}

        public static BoundingBox CreateFromPoints(IEnumerable <Vector3d> points)
        {
            if (points == null)
            {
                throw new ArgumentNullException();
            }

            // TODO: Just check that Count > 0
            var empty   = true;
            var vector2 = new Vector3d(double.MaxValue);
            var vector1 = new Vector3d(double.MinValue);

            foreach (var vector3 in points)
            {
                vector2 = Vector3d.ComponentMin(vector2, vector3);
                vector1 = Vector3d.ComponentMax(vector1, vector3);
                empty   = false;
            }

            if (empty)
            {
                throw new ArgumentException();
            }

            return(new BoundingBox(vector2, vector1));
        }