/* $Id$
*
* Copyright (c) 2010 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 ADAPTIVEPATHDROPCUTTER_H
#define ADAPTIVEPATHDROPCUTTER_H
#include
#include
#include
#include
#include "pathdropcutter.hpp"
#include "pointdropcutter.hpp"
#include "path.hpp"
#include "clpoint.hpp"
namespace ocl
{
class MillingCutter;
class STLSurf;
class Triangle;
///
/// \brief path drop cutter finish Path generation
class AdaptivePathDropCutter : public Operation {
public:
/// construct an empty PathDropCutter object
AdaptivePathDropCutter();
virtual ~AdaptivePathDropCutter();
/// run drop-cutter on the whole Path
virtual void run();
/// set the minimum sapling interval
void setMinSampling(double s) {
assert( s > 0.0 );
//std::cout << " apdc::setMinSampling = " << s << "\n";
min_sampling=s;
}
/// set the cosine limit for the flat() predicate
void setCosLimit(double lim) {cosLimit=lim;}
void setZ(const double z) {
minimumZ = z;
}
double getZ() const {
return minimumZ;
}
void setPath(const Path* p) {
path = p;
subOp[0]->clearCLPoints();
}
std::vector getPoints() const
{
return clpoints;
}
protected:
/// run adaptive sample on the given Span between t-values of start_t and stop_t
void adaptive_sample(const Span* span, double start_t, double stop_t, CLPoint start_cl, CLPoint stop_cl);
/// flatness predicate for adaptive sampling
bool flat(CLPoint& start_cl, CLPoint& mid_cl, CLPoint& stop_cl);
/// run adaptive sampling
void adaptive_sampling_run();
// DATA
/// the smallest sampling interval used when adaptively subdividing
double min_sampling;
/// the limit for dot-product used in flat()
double cosLimit;
const Path* path;
double minimumZ;
std::vector clpoints;
};
} // end namespace
#endif
// end file pathdropcutter.h