You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					108 lines
				
				3.0 KiB
			
		
		
			
		
	
	
					108 lines
				
				3.0 KiB
			| 
								 
											10 months ago
										 
									 | 
							
								// David Eberly, Geometric Tools, Redmond WA 98052
							 | 
						||
| 
								 | 
							
								// Copyright (c) 1998-2021
							 | 
						||
| 
								 | 
							
								// Distributed under the Boost Software License, Version 1.0.
							 | 
						||
| 
								 | 
							
								// https://www.boost.org/LICENSE_1_0.txt
							 | 
						||
| 
								 | 
							
								// https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
							 | 
						||
| 
								 | 
							
								// Version: 4.0.2019.08.13
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <Mathematics/Vector.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// The box is aligned with the standard coordinate axes, which allows us to
							 | 
						||
| 
								 | 
							
								// represent it using minimum and maximum values along each axis.  Some
							 | 
						||
| 
								 | 
							
								// algorithms prefer the centered representation that is used for oriented
							 | 
						||
| 
								 | 
							
								// boxes.  The center is C and the extents are the half-lengths in each
							 | 
						||
| 
								 | 
							
								// coordinate-axis direction.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace gte
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    template <int N, typename Real>
							 | 
						||
| 
								 | 
							
								    class AlignedBox
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								    public:
							 | 
						||
| 
								 | 
							
								        // Construction and destruction.  The default constructor sets the
							 | 
						||
| 
								 | 
							
								        // minimum values to -1 and the maximum values to +1.
							 | 
						||
| 
								 | 
							
								        AlignedBox()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            for (int i = 0; i < N; ++i)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                min[i] = (Real)-1;
							 | 
						||
| 
								 | 
							
								                max[i] = (Real)+1;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Please ensure that inMin[i] <= inMax[i] for all i.
							 | 
						||
| 
								 | 
							
								        AlignedBox(Vector<N, Real> const& inMin, Vector<N, Real> const& inMax)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            for (int i = 0; i < N; ++i)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                min[i] = inMin[i];
							 | 
						||
| 
								 | 
							
								                max[i] = inMax[i];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Compute the centered representation.  NOTE:  If you set the minimum
							 | 
						||
| 
								 | 
							
								        // and maximum values, compute C and extents, and then recompute the
							 | 
						||
| 
								 | 
							
								        // minimum and maximum values, the numerical round-off errors can lead
							 | 
						||
| 
								 | 
							
								        // to results different from what you started with.
							 | 
						||
| 
								 | 
							
								        void GetCenteredForm(Vector<N, Real>& center, Vector<N, Real>& extent) const
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            center = (max + min) * (Real)0.5;
							 | 
						||
| 
								 | 
							
								            extent = (max - min) * (Real)0.5;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Public member access.  It is required that min[i] <= max[i].
							 | 
						||
| 
								 | 
							
								        Vector<N, Real> min, max;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public:
							 | 
						||
| 
								 | 
							
								        // Comparisons to support sorted containers.
							 | 
						||
| 
								 | 
							
								        bool operator==(AlignedBox const& box) const
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return min == box.min && max == box.max;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool operator!=(AlignedBox const& box) const
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return !operator==(box);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool operator< (AlignedBox const& box) const
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (min < box.min)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (min > box.min)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return max < box.max;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool operator<=(AlignedBox const& box) const
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return !box.operator<(*this);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool operator> (AlignedBox const& box) const
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return box.operator<(*this);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        bool operator>=(AlignedBox const& box) const
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return !operator<(box);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Template aliases for convenience.
							 | 
						||
| 
								 | 
							
								    template <typename Real>
							 | 
						||
| 
								 | 
							
								    using AlignedBox2 = AlignedBox<2, Real>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template <typename Real>
							 | 
						||
| 
								 | 
							
								    using AlignedBox3 = AlignedBox<3, Real>;
							 | 
						||
| 
								 | 
							
								}
							 |