/* $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 . */ #ifndef INTERVAL_HPP #define INTERVAL_HPP #include //#include #include "ccpoint.hpp" //#include "weave_typedef.hpp" #include "halfedgediagram.hpp" namespace ocl { class Fiber; /// interval for use by fiber and weave /// a parameter interval [upper, lower] class Interval { public: Interval(); /// create and interval [l,u] (is this ever called??) Interval(const double l, const double u); virtual ~Interval() {}; /// update upper with t, and corresponding cc-point p void updateUpper(const double t, CCPoint& p); /// update lower with t, and corresponding cc-point p void updateLower(const double t, CCPoint& p); /// call both updateUpper() and updateLower() with the given (t,p) pair void update(const double t, CCPoint& p); /// update interval with t_cl and cc_tmp if cc_tmp is in the p1-p2 edge and condition==true bool update_ifCCinEdgeAndTrue( double t_cl, CCPoint& cc_tmp, const Point& p1, const Point& p2, bool condition); /// return true if Interval i is outside *this bool outside(const Interval& i) const; /// return true if Interval i is inside *this bool inside(const Interval& i) const; /// return true if the interval is empty bool empty() const; /// string repr std::string str() const; CCPoint upper_cc; ///< cutter contact points at upper and lower are stored in upper_cc and lower_cc CCPoint lower_cc; ///< cutter contact point corresponding to lower double upper; ///< the upper t-value double lower; ///< the lower t-value bool in_weave; ///< flag for use by Weave::build() std::set::iterator> intersections_fibers; ///< fibers /// intersections with other intervals are stored in this set of /// VertexPairs of type std::pair typedef boost::adjacency_list_traits::vertex_descriptor WeaveVertex; typedef std::pair< WeaveVertex, double > VertexPair; /// compare based on pair.second, the coordinate of the intersection struct VertexPairCompare { /// comparison operator bool operator() (const VertexPair& lhs, const VertexPair& rhs) const { return lhs.second < rhs.second ;} }; /// intersections stored in this set (for rapid finding of neighbors etc) typedef std::set< VertexPair, VertexPairCompare > VertexIntersectionSet; // this is the same type as ocl::weave::VertexPairIterator, but redefined here anywhere typedef VertexIntersectionSet::iterator VertexPairIterator; VertexIntersectionSet intersections2; }; } // end namespace #endif // end file interval.hpp