/* $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 ELLIPSE_H
#define ELLIPSE_H
#include
#include "point.hpp"
#include "ellipseposition.hpp"
namespace ocl
{
class Fiber;
/// An Ellipse.
class Ellipse {
public:
/// dummy constructor
Ellipse(){}
/// create an Ellipse with centerpoint center, X-axis a, Y-axis b, and offset distance offset.
Ellipse(Point& centerin, double a, double b, double offset);
/// return a point on the ellipse at given EllipsePosition
virtual Point ePoint(const EllipsePosition& position) const;
/// return a point on the offset-ellipse at given EllipsePosition
virtual Point oePoint(const EllipsePosition& position) const;
/// return a normalized normal vector of the ellipse at the given EllipsePosition
virtual Point normal(const EllipsePosition& position) const;
/// offset-ellipse Brent solver
int solver_brent();
/// print out the found solutions
void print_solutions();
/// given one EllipsePosition solution, find the other.
bool find_EllipsePosition2();
/// error function for the solver
double error(EllipsePosition& position) const;
/// error function for solver
virtual double error(double dia) const;
/// calculate ellipse center
Point calcEcenter(const Point& up1, const Point& up2, int sln);
/// set EllipsePosition_hi to either EllipsePosition1 or EllipsePosition2, depending on which
/// has the center (given by calcEcenter() ) with higher z-coordinate
void setEllipsePositionHi(const Point& u1, const Point& u2);
/// once EllipsePosition_hi is set, return an ellipse-point at this position
Point ePointHi() const;
/// ellipse-point at EllipsePosition1
Point ePoint1() const;
/// ellipse-point at EllipsePosition2
Point ePoint2() const;
/// offset-ellipse-point at EllipsePosition1
Point oePoint1() const;
/// offset-ellipse-point at EllipsePosition2
Point oePoint2() const;
/// string repr
friend std::ostream &operator<<(std::ostream &stream, const Ellipse& e);
/// set length of ellipse major axis
void setA(double ain) {a=ain;}
/// set length of ellipse minor axis
void setB(double bin) {b=bin;}
/// set the ellipse center
void setCenter(Point& pin) {center=pin;}
/// set offset-ellipse offset distance
void setOffset(double ofs) {offset=ofs;}
/// set/calculate the eccentricity
void setEccen() {eccen=a/b;}
/// returns the z-coordinate of this->center
inline double getCenterZ() {return center.z;}
/// eccentricity = a/b
double eccen;
protected:
/// first EllipsePosition solution found by solver()
EllipsePosition EllipsePosition1;
/// second EllipsePosition solution found by solver()
EllipsePosition EllipsePosition2;
/// the higher EllipsePosition solution
EllipsePosition EllipsePosition_hi;
/// the center point of the ellipse
Point center;
/// a-axis, in the X-direction
double a;
/// b-axis, in the Y-direction
double b;
/// offset
double offset;
/// the target Point for the error-function
Point target;
};
/// an aligned ellipse, used by the edgePush function of BullCutter
class AlignedEllipse : public Ellipse {
public:
AlignedEllipse(){}
/// create an aligned ellipse
AlignedEllipse(Point& centerin, double major_length, double minor_length,
double offset, Point& majorDir, Point& minorDir);
/// normal vector at given EllipsePosition
Point normal(const EllipsePosition& position) const;
/// ellipse-point at given EllipsePosition
Point ePoint(const EllipsePosition& position) const;
/// offset-ellipse point at given EllipsePosition
Point oePoint(const EllipsePosition& pos) const;
/// error-function for the solver
double error(double dia) const;
/// aligned offset-ellipse solver. callsn Numeric::brent_solver()
bool aligned_solver( const Fiber& f );
private:
/// direction of the major axis
Point major_dir;
/// direction of the minor axis
Point minor_dir;
/// the error-direction for error()
Point error_dir;
};
} // end namespace
#endif
// end file ellipse.h