/* $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 ZIGZAG_H
#define ZIGZAG_H
#include
#include
#include
#include
#include "point.hpp"
namespace ocl
{
/// zgizag 2D operation
class ZigZag {
public:
ZigZag() { }
virtual ~ZigZag() {}
/// step over distance
void setStepOver(double d) {
stepOver = d;
}
/// set dir
void setDirection(Point d) {
dir = d;
}
void setOrigin(Point d) {
origin = d;
}
/// run the algorithm
void run() {
// calculate a reasonable maximum/minimum step-over dist
Point perp = dir.xyPerp();
perp.xyNormalize();
// std::cout << " minpt = " << bb.minpt << std::endl;
// std::cout << " maxpt = " << bb.maxpt << std::endl;
// std::cout << " perp = " << perp << std::endl;
double max_d = (bb.maxpt - origin).dot( perp );
double min_d = (bb.minpt - origin).dot( perp );
if ( max_d < min_d ) {
double tmp = max_d;
max_d = min_d;
min_d = tmp;
}
//int n = min_d / stepOver; // some safety margin here... (required?)
// std::cout << " max_d= " << max_d << " min_d= "<< min_d << std::endl;
std::vector distances;
for (double d = min_d ; d <= max_d ; d += stepOver ) {
distances.push_back(d);
out.push_back( origin + d*perp );
assert( out.size() < 500 );
}
}
/// add an input CLPoint to this Operation
void addPoint(Point& p) {
pocket.push_back(p);
bb.addPoint(p);
}
std::string str() const {
std::ostringstream o;
o << "ZigZag: pocket.size()=" << pocket.size() << std::endl;
return o.str();
}
protected:
/// the step over
double stepOver;
/// direction
Point dir;
/// origin
Point origin;
/// pocket
std::vector pocket;
std::vector out;
Bbox bb;
};
} // end namespace
#endif // end zigzag.h