/* $Id$
*
* Copyright (c) 2010-2011 Anders Wallin (anders.e.e.wallin "at" gmail.com).
*
* This file is part of OpenCAMlib
* (see https://github.com/aewallin/opencamlib).
*
* This program 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 2.1 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "interval.hpp"
namespace ocl
{
Interval::Interval() {
lower = 0.0;
upper = 0.0;
lower_cc = CCPoint();
upper_cc = CCPoint();
in_weave=false;
}
Interval::Interval(const double l, const double u) {
assert( l <= u );
lower = l;
upper = u;
in_weave=false;
}
void Interval::update(const double t, CCPoint& p) {
this->updateUpper(t,p);
this->updateLower(t,p);
}
bool Interval::update_ifCCinEdgeAndTrue( double t_cl, CCPoint& cc_tmp, const Point& p1, const Point& p2, bool condition) {
//if ( cc_tmp.isInsidePoints(p1,p2) && condition ) {
if ( cc_tmp.isInside(p1,p2) && condition ) {
update( t_cl , cc_tmp ); // both updateUpper(t,p) and updateLower(t,p)
return true;
} else {
return false;
}
}
void Interval::updateUpper(const double t, CCPoint& p) {
if (upper_cc.type == NONE) {
upper = t;
lower = t;
CCPoint* tmp = new CCPoint(p);
upper_cc = *tmp;
lower_cc = *tmp;
delete tmp;
}
if ( t > upper ) {
upper = t;
CCPoint* tmp = new CCPoint(p);
upper_cc = *tmp;
delete tmp;
}
}
void Interval::updateLower(const double t, CCPoint& p) {
if (lower_cc.type == NONE) {
lower = t;
upper = t;
CCPoint* tmp = new CCPoint(p);
lower_cc = *tmp;
upper_cc = *tmp;
delete tmp;
}
if ( t < lower ) {
lower = t;
CCPoint* tmp = new CCPoint(p);
lower_cc = *tmp;
delete tmp;
}
}
// return true if *this is completely non-overlapping, or outside of i.
bool Interval::outside(const Interval& i) const {
if ( this->lower > i.upper )
return true;
else if ( this->upper < i.lower )
return true;
else
return false;
}
// return true if *this is contained within i
bool Interval::inside(const Interval& i) const {
if ( (this->lower > i.lower) && (this->upper < i.upper) )
return true;
else
return false;
}
bool Interval::empty() const {
if ( lower==0.0 && upper==0.0 )
return true;
else
return false;
}
std::string Interval::str() const {
std::ostringstream o;
o << "I ["<< lower <<" , " << upper << " ]";
return o.str();
}
} // end namespace
// end file interval.cpp