1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-09 20:46:07 +01:00
LibrePilot/ground/openpilotgcs/src/libs/glc_lib/glc_boundingbox.cpp
chebuzz c00090391b OP-342 GCS/ModelView - Update glc_lib to newest 2.1 release (fixes known issues) and update modelview to use this new lib.
git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@3063 ebee16cc-31ac-478f-84a7-5cbb03baadba
2011-03-22 21:15:46 +00:00

235 lines
6.3 KiB
C++

/****************************************************************************
This file is part of the GLC-lib library.
Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net)
http://glc-lib.sourceforge.net
GLC-lib is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
GLC-lib 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with GLC-lib; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
//! \file glc_boundingbox.cpp implementation of the GLC_BoundingBox class.
#include "glc_boundingbox.h"
#include "maths/glc_matrix4x4.h"
quint32 GLC_BoundingBox::m_ChunkId= 0xA707;
//////////////////////////////////////////////////////////////////////
// Constructor Destructor
//////////////////////////////////////////////////////////////////////
GLC_BoundingBox::GLC_BoundingBox()
: m_Lower(0, 0, 0)
, m_Upper(0, 0, 0)
, m_IsEmpty(true)
{
}
GLC_BoundingBox::GLC_BoundingBox(const GLC_BoundingBox& boundingBox)
: m_Lower(boundingBox.m_Lower)
, m_Upper(boundingBox.m_Upper)
, m_IsEmpty(boundingBox.m_IsEmpty)
{
}
GLC_BoundingBox::GLC_BoundingBox(const GLC_Point3d& lower, const GLC_Point3d& upper)
: m_Lower(lower)
, m_Upper(upper)
, m_IsEmpty(false)
{
}
//////////////////////////////////////////////////////////////////////
// Get Functions
//////////////////////////////////////////////////////////////////////
quint32 GLC_BoundingBox::chunckID()
{
return m_ChunkId;
}
bool GLC_BoundingBox::intersect(const GLC_Point3d& point) const
{
if (!m_IsEmpty)
{
bool result= (point.x() < m_Upper.x()) && (point.y() < m_Upper.y())
&& (point.z() < m_Upper.z()) && (point.x() > m_Lower.x())
&& (point.y() > m_Lower.y()) && (point.z() > m_Lower.z());
return result;
}
else
{
return false;
}
}
bool GLC_BoundingBox::intersectBoundingSphere(const GLC_Point3d& point) const
{
const double distance= (center() - point).length();
return distance < boundingSphereRadius();
}
bool GLC_BoundingBox::intersectBoundingSphere(const GLC_BoundingBox& boundingSphere) const
{
const double distance= (center() - boundingSphere.center()).length();
return distance < (boundingSphereRadius() + boundingSphere.boundingSphereRadius());
}
//////////////////////////////////////////////////////////////////////
// Set Functions
//////////////////////////////////////////////////////////////////////
GLC_BoundingBox& GLC_BoundingBox::combine(const GLC_Point3d& point)
{
if (m_IsEmpty)
{
m_Lower= point;
m_Upper= point;
m_IsEmpty= false;
}
else
{
double lowerX= qMin(point.x(), m_Lower.x());
double lowerY= qMin(point.y(), m_Lower.y());
double lowerZ= qMin(point.z(), m_Lower.z());
m_Lower.setVect(lowerX, lowerY, lowerZ);
double upperX= qMax(point.x(), m_Upper.x());
double upperY= qMax(point.y(), m_Upper.y());
double upperZ= qMax(point.z(), m_Upper.z());
m_Upper.setVect(upperX, upperY, upperZ);
}
return *this;
}
GLC_BoundingBox& GLC_BoundingBox::combine(const GLC_Point3df& pointf)
{
GLC_Point3d point(pointf);
if (m_IsEmpty)
{
m_Lower= point;
m_Upper= point;
m_IsEmpty= false;
}
else
{
double lowerX= qMin(point.x(), m_Lower.x());
double lowerY= qMin(point.y(), m_Lower.y());
double lowerZ= qMin(point.z(), m_Lower.z());
m_Lower.setVect(lowerX, lowerY, lowerZ);
double upperX= qMax(point.x(), m_Upper.x());
double upperY= qMax(point.y(), m_Upper.y());
double upperZ= qMax(point.z(), m_Upper.z());
m_Upper.setVect(upperX, upperY, upperZ);
}
return *this;
}
GLC_BoundingBox& GLC_BoundingBox::combine(const GLC_BoundingBox& box)
{
if (m_IsEmpty && !box.m_IsEmpty)
{
m_Lower= box.m_Lower;
m_Upper= box.m_Upper;
m_IsEmpty= box.m_IsEmpty;
}
else if (! box.m_IsEmpty)
{
double lowerX= qMin(box.m_Lower.x(), m_Lower.x());
double lowerY= qMin(box.m_Lower.y(), m_Lower.y());
double lowerZ= qMin(box.m_Lower.z(), m_Lower.z());
m_Lower.setVect(lowerX, lowerY, lowerZ);
double upperX= qMax(box.m_Upper.x(), m_Upper.x());
double upperY= qMax(box.m_Upper.y(), m_Upper.y());
double upperZ= qMax(box.m_Upper.z(), m_Upper.z());
m_Upper.setVect(upperX, upperY, upperZ);
}
return *this;
}
GLC_BoundingBox& GLC_BoundingBox::transform(const GLC_Matrix4x4& matrix)
{
if (!m_IsEmpty)
{
// Compute Transformed BoundingBox Corner
GLC_Point3d corner1(m_Lower);
GLC_Point3d corner7(m_Upper);
GLC_Point3d corner2(corner7.x(), corner1.y(), corner1.z());
GLC_Point3d corner3(corner7.x(), corner7.y(), corner1.z());
GLC_Point3d corner4(corner1.x(), corner7.y(), corner1.z());
GLC_Point3d corner5(corner1.x(), corner1.y(), corner7.z());
GLC_Point3d corner6(corner7.x(), corner1.y(), corner7.z());
GLC_Point3d corner8(corner1.x(), corner7.y(), corner7.z());
corner1 = (matrix * corner1);
corner2 = (matrix * corner2);
corner3 = (matrix * corner3);
corner4 = (matrix * corner4);
corner5 = (matrix * corner5);
corner6 = (matrix * corner6);
corner7 = (matrix * corner7);
corner8 = (matrix * corner8);
// Compute the new BoundingBox
GLC_BoundingBox boundingBox;
boundingBox.combine(corner1);
boundingBox.combine(corner2);
boundingBox.combine(corner3);
boundingBox.combine(corner4);
boundingBox.combine(corner5);
boundingBox.combine(corner6);
boundingBox.combine(corner7);
boundingBox.combine(corner8);
m_Lower= boundingBox.m_Lower;
m_Upper= boundingBox.m_Upper;
}
return *this;
}
QDataStream &operator<<(QDataStream &stream, const GLC_BoundingBox &bBox)
{
quint32 chunckId= GLC_BoundingBox::m_ChunkId;
stream << chunckId;
stream << bBox.m_IsEmpty;
stream << bBox.m_Lower;
stream << bBox.m_Upper;
return stream;
}
QDataStream &operator>>(QDataStream &stream, GLC_BoundingBox &bBox)
{
quint32 chunckId;
stream >> chunckId;
Q_ASSERT(chunckId == GLC_BoundingBox::m_ChunkId);
stream >> bBox.m_IsEmpty;
stream >> bBox.m_Lower;
stream >> bBox.m_Upper;
return stream;
}