LibreCAD
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
geoellipse.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "cad/const.h"
4 #include "geocoordinate.h"
5 #include "cad/math/lcmath.h"
6 #include <memory>
7 #include "geobase.h"
8 #include <vector>
9 #include "cad/math/equation.h"
10 
11 namespace lc {
12 
13  namespace geo {
14  class Ellipse : public Base, virtual public Visitable {
15  public:
25  Ellipse(const Coordinate& center, const Coordinate& majorP, double minorRadius, double startAngle, double endAngle, bool reversed = false);
30  const Coordinate center() const;
31 
36  const Coordinate majorP() const;
37 
42  double minorRadius() const;
43 
48  double startAngle() const;
49 
54  double endAngle() const;
55 
61  Coordinate getPoint(const double& angle) const;
66  Coordinate startPoint() const;
71  Coordinate endPoint() const;
77  std::vector<Coordinate> findPotentialNearestPoints(const Coordinate& coord) const;
83  Coordinate nearestPointOnPath(const Coordinate& coord) const;
89  Coordinate nearestPointOnEntity(const Coordinate& coord) const;
94  bool isArc() const;
95 
100  bool isReversed() const;
101 
106  double ratio() const;
107 
112  double majorRadius() const;
113 
118  double getAngle() const;
119 
125  double getEllipseAngle(const Coordinate& coord) const;
126 
127  bool isAngleBetween(double angle) const {
128  if (!isArc())
129  return true;
131  }
132 
139  Ellipse georotate(const Coordinate& center, const double rotation_angle) const;
140 
147  Ellipse geoscale(const Coordinate& center, const Coordinate &factor) const;
148 
153  const maths::Equation equation() const {
154  auto ce0 = _majorP.squared();
155  auto ce2 = this->ratio() * this->ratio() * ce0;
156 
157  if (ce0 < LCTOLERANCE * LCTOLERANCE || ce2 < LCTOLERANCE * LCTOLERANCE) {
158  return maths::Equation();
159  }
160 
161  return maths::Equation(1. / ce0, 0., 1. / ce2, 0., 0., -1.).rotate(getAngle()).move(_center);
162  }
163 
164  virtual void accept(GeoEntityVisitor &v) const override { v.visit(*this); }
165 
166  private:
167  friend std::ostream& operator<<(std::ostream& os, const Ellipse& e) {
168  os << "Ellipse(center=" << e._center << " majorP=" << e._majorP << " minorRadius=" << e._minorRadius << " startAngle=" << e._startAngle << " endAngle=" << e._endAngle << " isReversed=" << e._isReversed << ")";
169  return os;
170  }
171  private:
174  const double _minorRadius;
175  const double _startAngle;
176  const double _endAngle;
177  const bool _isReversed;
178  };
179  }
180 }
181 
182 // GEOELLIPSE_H
double squared() const
bool isReversed() const
Definition: geoellipse.cpp:206
double startAngle() const
startAngle, Returns Start elliptic!! angle of ellipse
Definition: geoellipse.cpp:32
Coordinate startPoint() const
startPoint, start point of ellipse
Definition: geoellipse.cpp:199
double getEllipseAngle(const Coordinate &coord) const
getEllipseAngle
Definition: geoellipse.cpp:218
const double _startAngle
Definition: geoellipse.h:175
Ellipse geoscale(const Coordinate &center, const Coordinate &factor) const
scale an ellipse at some center by some factor
Definition: geoellipse.cpp:44
const double _minorRadius
Definition: geoellipse.h:174
bool isArc() const
isArc
Definition: geoellipse.cpp:214
Ellipse(const Coordinate &center, const Coordinate &majorP, double minorRadius, double startAngle, double endAngle, bool reversed=false)
Definition: geoellipse.cpp:10
const Coordinate _majorP
Definition: geoellipse.h:173
double ratio() const
ratio of major radius to minor radius
Definition: geoellipse.cpp:210
virtual void accept(GeoEntityVisitor &v) const override
Definition: geoellipse.h:164
const double _endAngle
Definition: geoellipse.h:176
Definition: cadentity.h:12
Coordinate nearestPointOnPath(const Coordinate &coord) const
nearestPointOnPath, (ignore if it arc)
Definition: geoellipse.cpp:149
const Coordinate _center
Definition: geoellipse.h:172
friend std::ostream & operator<<(std::ostream &os, const Ellipse &e)
Definition: geoellipse.h:167
Ellipse georotate(const Coordinate &center, const double rotation_angle) const
rotate an ellipse at a center by an angle
Definition: geoellipse.cpp:82
const bool _isReversed
Definition: geoellipse.h:177
#define LCTOLERANCE
Definition: const.h:6
Coordinate getPoint(const double &angle) const
getPoint, return a point on ellipse with given elliptic angle
Definition: geoellipse.cpp:193
double majorRadius() const
Major Radius.
Definition: geoellipse.cpp:36
double getAngle() const
getAngle of MajorP
Definition: geoellipse.cpp:40
static bool isAngleBetween(double a, double start, double end, bool CCW)
isAngleBetween, checks if angle is between
Definition: lcmath.cpp:21
double endAngle() const
endAngle, Return the end elliptic!! angle of ellipse
Definition: geoellipse.cpp:189
Coordinate endPoint() const
endPoint, end point of ellipse
Definition: geoellipse.cpp:202
const maths::Equation equation() const
Returns the quadratic equation.
Definition: geoellipse.h:153
std::vector< Coordinate > findPotentialNearestPoints(const Coordinate &coord) const
findPotentialNearestPoints
Definition: geoellipse.cpp:88
const Equation move(const geo::Coordinate &v) const
move the quadratic equation by value V
Definition: equation.cpp:48
const Coordinate center() const
center, Returns Center point of Ellipse
Definition: geoellipse.cpp:20
const Equation rotate(double angle) const
rotate the quadratic equation by value V
Definition: equation.cpp:54
double minorRadius() const
minorRadius, Returns the minor radius of ellipse
Definition: geoellipse.cpp:28
Coordinate nearestPointOnEntity(const Coordinate &coord) const
nearestPointOnEntity, ( not ignore arc)
Definition: geoellipse.cpp:167
const Coordinate majorP() const
majorP, Returns major point of the ellipse, relative to center
Definition: geoellipse.cpp:24
bool isAngleBetween(double angle) const
Definition: geoellipse.h:127