AngularRange.cpp 2.01 KB
Newer Older
Jonas Stienen's avatar
Jonas Stienen committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
// $Id: AngularRange.cpp,v 1.1 2008-09-10 22:38:11 fwefers Exp $

#include "AngularRange.h"

#include <cmath>
#include <ITAException.h>
#include <ITANumericUtils.h>
#include <ITAStringUtils.h>

AngularRange::AngularRange() : m_fLower(0), m_fUpper(0) { }

AngularRange::AngularRange(float fLower, float fUpper) {
	setRange(fLower, fUpper);
}

float AngularRange::getLowerAngle() const {
	return m_fLower;
}

float AngularRange::getUpperAngle() const {
	return m_fUpper;
}

void AngularRange::setLowerAngle(float fLower) {
	// Fr Sicherheitschecks usw. immer ber die Methode "setRange" realisieren
	setRange(fLower, m_fUpper);
}

void AngularRange::setUpperAngle(float fUpper) {
	// Fr Sicherheitschecks usw. immer ber die Methode "setRange" realisieren
	setRange(m_fLower, fUpper);
}

void AngularRange::setRange(float fLower, float fUpper) {
	/*
	 *  Falls die Winkeldifferenz grer gleich als 360 ist -> Vollstndiges Intervall
	 *
	 *  Hinweis: Dieser Schritt wird vor der Normierung durchgefhrt damit z.B. -90,530
	 *           zu einem vollstndigen Intervall fhrt
	 */

	if (fabs(fLower - fUpper) >= 360.0) {
		m_fLower = m_fUpper = 0;
		return;
	}

	// Nun die Winkel normieren, d.h. in das Interval [0, 360) abbilden
	m_fLower = anglef_proj_0_360_DEG(fLower);
	m_fUpper = anglef_proj_0_360_DEG(fUpper);
}

bool AngularRange::contains(float fAngle) const {
	float a = anglef_proj_0_360_DEG(fAngle);

	if (m_fLower <= m_fUpper)
		return (a >= m_fLower) && (a <= m_fUpper);
	else
		return ((a >= m_fLower) && (a <= 360)) || ((a <= m_fUpper) && (a >= 0));
}

bool AngularRange::intersects(const AngularRange& dest) const {
	// Zwei Winkelbereiche berlappen, falls ein Winkel des einen Intervalls im anderen Intervall enthalten ist
	return (dest.contains(m_fLower) || dest.contains(m_fUpper));
}

bool AngularRange::complete() const {
	return m_fLower == m_fUpper;
}

std::string AngularRange::toString() const {
	return std::string("[") +
		   FloatToString(m_fLower) + std::string(",") +
	       FloatToString(m_fUpper) + std::string("] deg");
}