/* $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 ADAPTIVEWATERLINE_HPP
#define ADAPTIVEWATERLINE_HPP
#include
#include
#include
#include
#include "waterline.hpp"
#include "fiber.hpp"
namespace ocl
{
class Span;
/// \brief a Waterline toolpath follows the shape of the model at a constant z-height in the xy-plane
class AdaptiveWaterline : public Waterline {
public:
/// create an empty Waterline object
AdaptiveWaterline();
virtual ~AdaptiveWaterline();
/// set the minimum sampling interval
void setMinSampling(double s) {min_sampling=s;}
/// set the cosine limit for the flat() predicate
void setCosLimit(double lim) {cosLimit=lim;}
/// run the Waterline algorithm. setSTL, setCutter, setSampling, and setZ must
/// be called before a call to run()
void run();
void run2();
virtual void setSampling(double s) {
sampling=s;
min_sampling = sampling/10.0; // default to this when setMinSampling is not called
}
protected:
/// adaptive waterline algorithm
void adaptive_sampling_run();
/// x-direction adaptive sampling
void xfiber_adaptive_sample(const Span* span, double start_t, double stop_t, Fiber start_f, Fiber stop_f);
/// y-direction adaptive sampling
void yfiber_adaptive_sample(const Span* span, double start_t, double stop_t, Fiber start_f, Fiber stop_f);
/// flatness predicate for fibers. Checks Fiber.size() and then calls flat() on cl-points
bool flat( Fiber& start, Fiber& mid, Fiber& stop ) const;
/// flatness predicate for cl-points. checks for angle metween start-mid-stop
bool flat(Point start_cl, Point mid_cl, Point stop_cl) const;
// DATA
/// minimum x-coordinate
double minx;
/// maximum x-coordinate
double maxx;
/// minimum y-coordinate
double miny;
/// maximum y-coordinate
double maxy;
/// the minimum sampling interval when subdividing
double min_sampling;
/// the cosine limit value for cl-point flat(). In the constructor, cosLimit = 0.999 by default.
double cosLimit;
};
} // end namespace
#endif