LibreCAD
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
circle.cpp
Go to the documentation of this file.
1 #include "cad/primitive/circle.h"
2 #include <cmath>
3 #include <algorithm>
5 
6 using namespace lc;
7 using namespace entity;
8 
9 Circle::Circle(const geo::Coordinate &center, double radius, const Layer_CSPtr layer,
10  const MetaInfo_CSPtr metaInfo, const Block_CSPtr block)
11  : CADEntity(layer, metaInfo, block), geo::Circle(center, radius) {
12 }
13 
14 
15 Circle::Circle(const Circle_CSPtr other, bool sameID) : CADEntity(other, sameID),
16  geo::Circle(other->center(), other->radius()) {
17 }
18 
20  CADEntity(builder),
21  geo::Circle(builder.center(), builder.radius()) {
22 }
23 
24 std::vector<EntityCoordinate> Circle::snapPoints(const geo::Coordinate &coord, const SimpleSnapConstrain &constrain,
25  double minDistanceToSnap, int maxNumberOfSnapPoints) const {
26 
27  std::vector<EntityCoordinate> points;
28  if (constrain.constrain() & SimpleSnapConstrain::LOGICAL) {
29  // Add center
30  lc::geo::Coordinate coord = center();
31  points.emplace_back(coord, 0);
32  // Add 4 coordinates
33  // Top Point
34  coord = center() + lc::geo::Coordinate(0., radius());
35  points.emplace_back(coord, 1);
36  // Right Point
37  coord = center() + lc::geo::Coordinate(radius(), 0.);
38  points.emplace_back(coord, 2);
39  // Left Point
40  coord = center() + lc::geo::Coordinate(-radius(), 0.);
41  points.emplace_back(coord, 3);
42  // Bottom Point
43  coord = center() + lc::geo::Coordinate(0., -radius());
44  points.emplace_back(coord, 4);
45  }
46 
47  if (constrain.constrain() & SimpleSnapConstrain::ON_ENTITY ||
49  geo::Coordinate npoe = nearestPointOnPath(coord);
50  points.emplace_back(npoe, -1);
51  }
52 
53  // Cleanup array of snappoints
54  Snapable::snapPointsCleanup(points, coord, maxNumberOfSnapPoints, minDistanceToSnap);
55  return points;
56 }
57 
59  return geo::Circle::nearestPointOnPath(coord);
60 }
61 
62 CADEntity_CSPtr Circle::move(const geo::Coordinate &offset) const {
63  auto newCircle = std::make_shared<Circle>(this->center() + offset, this->radius(), layer(), metaInfo());
64  newCircle->setID(this->id());
65  return newCircle;
66 }
67 
68 CADEntity_CSPtr Circle::copy(const geo::Coordinate &offset) const {
69  auto newCircle = std::make_shared<Circle>(this->center() + offset, this->radius(), layer(), metaInfo());
70  return newCircle;
71 }
72 
73 CADEntity_CSPtr Circle::rotate(const geo::Coordinate &rotation_center, const double rotation_angle) const {
74  auto newCircle = std::make_shared<Circle>(this->center().rotate(rotation_center, rotation_angle), this->radius(),
75  layer(), metaInfo());
76  newCircle->setID(this->id());
77  return newCircle;
78 }
79 
80 CADEntity_CSPtr Circle::scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const {
81  // TODO return ellipse if scalefactor.x != scalefactor.y
82 
83  auto newCircle = std::make_shared<Circle>(this->center().scale(scale_center, scale_factor),
84  this->radius() * fabs(scale_factor.x()), layer(), metaInfo());
85  newCircle->setID(this->id());
86  return newCircle;
87 }
88 
89 CADEntity_CSPtr Circle::mirror(const geo::Coordinate &axis1, const geo::Coordinate &axis2) const {
90  auto newCircle = std::make_shared<Circle>(this->center().mirror(axis1, axis2),
91  this->radius(), layer(), metaInfo());
92  newCircle->setID(this->id());
93  return newCircle;
94 }
95 
97  return geo::Area(geo::Coordinate(center().x() - radius(), center().y() - radius()),
98  geo::Coordinate(center().x() + radius(), center().y() + radius()));
99 }
100 
101 CADEntity_CSPtr Circle::modify(Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo, Block_CSPtr block) const {
102  auto newEntity = std::make_shared<Circle>(this->center(), this->radius(), layer, metaInfo, block);
103  newEntity->setID(this->id());
104  return newEntity;
105 }
106 
107 
Coordinate mirror(const Coordinate &axis1, const Coordinate &axis2) const
mirror a coordinate
virtual const geo::Area boundingBox() const override
boundingBox of the entity
Definition: circle.cpp:96
Circle(const geo::Coordinate &center, double radius, const Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo=nullptr, const Block_CSPtr block=nullptr)
Circle, Circle Constructor.
Definition: circle.cpp:9
virtual std::vector< EntityCoordinate > snapPoints(const geo::Coordinate &coord, const SimpleSnapConstrain &constrain, double minDistanceToSnap, int maxNumberOfSnapPoints) const override
Find a number of snap points the line has available This function returns a ordered list...
Definition: circle.cpp:24
static const uint16_t LOGICAL
Definition: snapconstrain.h:22
virtual CADEntity_CSPtr move(const geo::Coordinate &offset) const override
move, moves by an offset
Definition: circle.cpp:62
double x() const
Returns x of Coordinate.
Definition: geocoordinate.h:26
static const uint16_t ON_ENTITYPATH
Definition: snapconstrain.h:19
Layer_CSPtr layer() const
layer return the layer this entity is placed on
Definition: cadentity.cpp:29
Coordinate scale(const double &scale_factor) const
MetaInfo_CSPtr metaInfo() const
Definition: cadentity.h:123
double radius() const
returns the radius of the circle.
Definition: geocircle.cpp:17
static const uint16_t ON_ENTITY
Definition: snapconstrain.h:18
Definition: cadentity.h:12
Coordinate nearestPointOnPath(const Coordinate &coord) const
returns the nearest Point On Path
Definition: geocircle.cpp:22
Coordinate rotate(const Coordinate &angleVector) const
rotate around (0.,0.) with a given angle vector
static void snapPointsCleanup(std::vector< EntityCoordinate > &points, const geo::Coordinate &reference, const unsigned int maxNumberOfSnapPoints, const double minDistanceToSnap)
Definition: snapable.h:53
virtual CADEntity_CSPtr rotate(const geo::Coordinate &rotation_center, const double rotation_angle) const override
rotate, rotate operation
Definition: circle.cpp:73
Block_CSPtr block() const
Return the current entity block.
Definition: cadentity.cpp:33
virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override
scale, scales the entity
Definition: circle.cpp:80
virtual CADEntity_CSPtr modify(Layer_CSPtr layer, const MetaInfo_CSPtr metaInfo, Block_CSPtr block) const override
modify Return a new entity with the same ID bit with possible modified metainfo and/pr layer informat...
Definition: circle.cpp:101
virtual CADEntity_CSPtr copy(const geo::Coordinate &offset) const override
copy, copies by an offset
Definition: circle.cpp:68
const uint16_t constrain() const
Definition: snapconstrain.h:47
const Coordinate center() const
Returns the Center of circle.
Definition: geocircle.cpp:14
virtual geo::Coordinate nearestPointOnPath(const geo::Coordinate &coord) const override
Find the nearest point on the path for this entity for the coordinate coord The path of a entity that...
Definition: circle.cpp:58
virtual CADEntity_CSPtr mirror(const geo::Coordinate &axis1, const geo::Coordinate &axis2) const override
Definition: circle.cpp:89