src/types/boundingbox.cpp

Thu, 29 Mar 2018 10:42:45 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Thu, 29 Mar 2018 10:42:45 +0300
changeset 1353
48374309f3d1
parent 1326
69a90bd2dba2
child 1370
c6d5ba08c62c
permissions
-rw-r--r--

refactor

/*
 *  LDForge: LDraw parts authoring CAD
 *  Copyright (C) 2013 - 2018 Teemu Piippo
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "boundingbox.h"

// =============================================================================
//
BoundingBox::BoundingBox()
{
	reset();
}

// =============================================================================
//
BoundingBox& BoundingBox::operator<< (const Vertex& v)
{
	calcVertex (v);
	return *this;
}

// =============================================================================
//
void BoundingBox::calcVertex (const Vertex& vertex)
{
	m_vertex0.x = qMin(vertex.x, m_vertex0.x);
	m_vertex0.y = qMin(vertex.y, m_vertex0.y);
	m_vertex0.z = qMin(vertex.z, m_vertex0.z);
	m_vertex1.x = qMax(vertex.x, m_vertex1.x);
	m_vertex1.y = qMax(vertex.y, m_vertex1.y);
	m_vertex1.z = qMax(vertex.z, m_vertex1.z);
	m_isEmpty = false;
}

// =============================================================================
//
// Clears the bounding box
//
void BoundingBox::reset()
{
	m_vertex0 = {10000.0, 10000.0, 10000.0};
	m_vertex1 = {-10000.0, -10000.0, -10000.0};
	m_isEmpty = true;
}

// =============================================================================
//
// Returns the length of the bounding box on the longest measure.
//
double BoundingBox::longestMeasurement() const
{
	double xscale = m_vertex0.x - m_vertex1.x;
	double yscale = m_vertex0.y - m_vertex1.y;
	double zscale = m_vertex0.z - m_vertex1.z;
	double size = qMax(xscale, qMax(yscale, zscale));
	return qMax(qAbs(size / 2.0), 1.0);
}

// =============================================================================
//
// Yields the center of the bounding box.
//
Vertex BoundingBox::center() const
{
	return {
		(m_vertex0.x + m_vertex1.x) / 2,
		(m_vertex0.y + m_vertex1.y) / 2,
		(m_vertex0.z + m_vertex1.z) / 2
	};
}

bool BoundingBox::isEmpty() const
{
	return m_isEmpty;
}

const Vertex& BoundingBox::vertex0() const
{
	return m_vertex0;
}

const Vertex& BoundingBox::vertex1() const
{
	return m_vertex1;
}

mercurial