From 53e0a5001a0389c0062b1c09e380bdc6b536c47e Mon Sep 17 00:00:00 2001 From: gaganjyot Date: Mon, 6 Jun 2016 01:55:12 +0530 Subject: [PATCH] Line, Circle Mirror --- lckernel/cad/base/cadentity.h | 3 +++ lckernel/cad/geometry/geocoordinate.h | 11 +++++++++++ lckernel/cad/primitive/arc.h | 3 +++ lckernel/cad/primitive/circle.cpp | 7 +++++++ lckernel/cad/primitive/circle.h | 3 +++ lckernel/cad/primitive/dimaligned.h | 3 +++ lckernel/cad/primitive/dimangular.h | 3 +++ lckernel/cad/primitive/dimdiametric.h | 3 +++ lckernel/cad/primitive/dimlinear.h | 2 ++ lckernel/cad/primitive/dimradial.h | 3 +++ lckernel/cad/primitive/ellipse.h | 3 +++ lckernel/cad/primitive/image.h | 3 +++ lckernel/cad/primitive/line.cpp | 13 ++++++++++++- lckernel/cad/primitive/line.h | 3 +++ lckernel/cad/primitive/lwpolyline.h | 3 +++ lckernel/cad/primitive/point.cpp | 7 +++++++ lckernel/cad/primitive/point.h | 3 +++ lckernel/cad/primitive/spline.h | 3 +++ lckernel/cad/primitive/text.h | 3 +++ lcviewernoqt/drawitems/lcvline.cpp | 10 +++++++++- 20 files changed, 90 insertions(+), 2 deletions(-) diff --git a/lckernel/cad/base/cadentity.h b/lckernel/cad/base/cadentity.h index 5bc63df5e..4a4a39374 100644 --- a/lckernel/cad/base/cadentity.h +++ b/lckernel/cad/base/cadentity.h @@ -78,6 +78,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const = 0; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const = 0; + /** * @brief boundingBox * Return the bounding box of this entity. diff --git a/lckernel/cad/geometry/geocoordinate.h b/lckernel/cad/geometry/geocoordinate.h index ccf3458b3..f5927c155 100644 --- a/lckernel/cad/geometry/geocoordinate.h +++ b/lckernel/cad/geometry/geocoordinate.h @@ -204,6 +204,10 @@ namespace lc { return _x * coord._x + _y * coord._y + _z * coord._z; } + inline double dot(const Coordinate& v1, const Coordinate& v2) const { + return v1.x() * v2.x() + v1.y() * v2.y() + v1.z() * v2.z(); + } + /** * @brief rotate * around (0.,0.) with a given angle vector @@ -329,6 +333,13 @@ namespace lc { return Coordinate(xx * _x + xy * _y + x0, yx * _x + yy * _y + y0, _z); } + inline Coordinate mirror(const Coordinate& axis1, const Coordinate& axis2) const { + Coordinate dir(axis2 - axis1); + auto a= dir.squared(); + auto ret= axis1 + dir* dot(*this- axis1, dir)/a; //projection point + return ret + ret - *this; + } + private: friend std::ostream& operator<<(std::ostream& os, const Coordinate& coordinate) { os << "Coordinate(x=" << coordinate._x << " y=" << coordinate._y << " z=" << coordinate._z << ")"; diff --git a/lckernel/cad/primitive/arc.h b/lckernel/cad/primitive/arc.h index 21cb67a23..1d47f0420 100644 --- a/lckernel/cad/primitive/arc.h +++ b/lckernel/cad/primitive/arc.h @@ -78,6 +78,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/circle.cpp b/lckernel/cad/primitive/circle.cpp index 8fc9b4638..3a103cb4a 100644 --- a/lckernel/cad/primitive/circle.cpp +++ b/lckernel/cad/primitive/circle.cpp @@ -86,6 +86,13 @@ CADEntity_CSPtr Circle::scale(const geo::Coordinate &scale_center, const geo::Co return newCircle; } +CADEntity_CSPtr Circle::mirror(const geo::Coordinate &axis1, const geo::Coordinate &axis2) const { + auto newCircle = std::make_shared(this->center().mirror(axis1, axis2), + this->radius(), layer(), metaInfo()); + newCircle->setID(this->id()); + return newCircle; +} + const geo::Area Circle::boundingBox() const { return geo::Area(geo::Coordinate(center().x() - radius(), center().y() - radius()), geo::Coordinate(center().x() + radius(), center().y() + radius())); diff --git a/lckernel/cad/primitive/circle.h b/lckernel/cad/primitive/circle.h index d7c22cacc..655cada97 100644 --- a/lckernel/cad/primitive/circle.h +++ b/lckernel/cad/primitive/circle.h @@ -75,6 +75,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override; + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/dimaligned.h b/lckernel/cad/primitive/dimaligned.h index 315ec6924..932a1d49e 100644 --- a/lckernel/cad/primitive/dimaligned.h +++ b/lckernel/cad/primitive/dimaligned.h @@ -71,6 +71,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/dimangular.h b/lckernel/cad/primitive/dimangular.h index c77662ccd..7b245e19f 100644 --- a/lckernel/cad/primitive/dimangular.h +++ b/lckernel/cad/primitive/dimangular.h @@ -71,6 +71,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/dimdiametric.h b/lckernel/cad/primitive/dimdiametric.h index 6cc964259..857f53352 100644 --- a/lckernel/cad/primitive/dimdiametric.h +++ b/lckernel/cad/primitive/dimdiametric.h @@ -85,6 +85,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/dimlinear.h b/lckernel/cad/primitive/dimlinear.h index 4f5f08efa..5c9debb9f 100644 --- a/lckernel/cad/primitive/dimlinear.h +++ b/lckernel/cad/primitive/dimlinear.h @@ -73,6 +73,8 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/dimradial.h b/lckernel/cad/primitive/dimradial.h index fee90cac4..86f4f70ca 100644 --- a/lckernel/cad/primitive/dimradial.h +++ b/lckernel/cad/primitive/dimradial.h @@ -89,6 +89,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/ellipse.h b/lckernel/cad/primitive/ellipse.h index 04bfac046..d6aa35e9b 100644 --- a/lckernel/cad/primitive/ellipse.h +++ b/lckernel/cad/primitive/ellipse.h @@ -65,6 +65,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/image.h b/lckernel/cad/primitive/image.h index 8b04a1df1..cafa77f37 100644 --- a/lckernel/cad/primitive/image.h +++ b/lckernel/cad/primitive/image.h @@ -84,6 +84,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/line.cpp b/lckernel/cad/primitive/line.cpp index bde15b5be..2304e6f97 100644 --- a/lckernel/cad/primitive/line.cpp +++ b/lckernel/cad/primitive/line.cpp @@ -79,6 +79,17 @@ CADEntity_CSPtr Line::scale(const geo::Coordinate& scale_center, const geo::Coor return newLine; } +CADEntity_CSPtr Line::mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const { + auto newLine = std::make_shared(this->start().mirror(axis1, + axis2), + this->end().mirror(axis1, + axis2), + layer()); + newLine->setID(this->id()); + return newLine; +} + const geo::Area Line::boundingBox() const { return geo::Area(start(), end()); } @@ -108,4 +119,4 @@ CADEntity_CSPtr Line::setDragPoints(std::map //A point was not in the map, don't change the entity return shared_from_this(); } -} \ No newline at end of file +} diff --git a/lckernel/cad/primitive/line.h b/lckernel/cad/primitive/line.h index 3150ccd0e..bf428e287 100644 --- a/lckernel/cad/primitive/line.h +++ b/lckernel/cad/primitive/line.h @@ -101,6 +101,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override; + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/lwpolyline.h b/lckernel/cad/primitive/lwpolyline.h index b3bac2b05..a9c94538b 100644 --- a/lckernel/cad/primitive/lwpolyline.h +++ b/lckernel/cad/primitive/lwpolyline.h @@ -222,6 +222,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/point.cpp b/lckernel/cad/primitive/point.cpp index b4ded3f67..8e3952aef 100644 --- a/lckernel/cad/primitive/point.cpp +++ b/lckernel/cad/primitive/point.cpp @@ -49,6 +49,13 @@ CADEntity_CSPtr Point::scale(const geo::Coordinate& scale_center, const geo::Coo return newCoordinate; } +CADEntity_CSPtr Point::mirror(const geo::Coordinate& axis1, const geo::Coordinate& axis2) const { + auto rotcord = geo::Coordinate(this->x(), this->y()).rotate(axis1, axis2); + auto newCoordinate = std::make_shared(rotcord.x(), rotcord.y(), layer()); + newCoordinate->setID(this->id()); + return newCoordinate; +} + const geo::Area Point::boundingBox() const { return geo::Area(geo::Coordinate(this->x(), this->y()), 0., 0.); } diff --git a/lckernel/cad/primitive/point.h b/lckernel/cad/primitive/point.h index cf395dbb3..73c14ba1b 100644 --- a/lckernel/cad/primitive/point.h +++ b/lckernel/cad/primitive/point.h @@ -74,6 +74,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override; + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/spline.h b/lckernel/cad/primitive/spline.h index fc1510de2..4c3aae691 100644 --- a/lckernel/cad/primitive/spline.h +++ b/lckernel/cad/primitive/spline.h @@ -86,6 +86,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lckernel/cad/primitive/text.h b/lckernel/cad/primitive/text.h index 8ca1dd552..86bbff351 100644 --- a/lckernel/cad/primitive/text.h +++ b/lckernel/cad/primitive/text.h @@ -139,6 +139,9 @@ namespace lc { virtual CADEntity_CSPtr scale(const geo::Coordinate &scale_center, const geo::Coordinate &scale_factor) const override; + virtual CADEntity_CSPtr mirror(const geo::Coordinate& axis1, + const geo::Coordinate& axis2) const override {} + /** * @brief boundingBox of the entity * @return geo::Area area diff --git a/lcviewernoqt/drawitems/lcvline.cpp b/lcviewernoqt/drawitems/lcvline.cpp index 9160f5dfe..119d609a0 100644 --- a/lcviewernoqt/drawitems/lcvline.cpp +++ b/lcviewernoqt/drawitems/lcvline.cpp @@ -18,7 +18,15 @@ void LCVLine::draw(LcPainter& painter, const LcDrawOptions &options, const lc::g painter.line_to(end().x(), end().y()); painter.stroke(); -// auto c1 = lc::geo::Coordinate(0, 0); +// auto r = lc::geo::Coordinate(100, 100); +// painter.point(r.x(), r.y(), 5, 1); + +// auto z = r.mirror(start(), end()); + +// painter.point(z.x(), z.y(), 5, 1); +// painter.stroke(); + + // auto c1 = lc::geo::Coordinate(0, 0); // auto mp = lc::geo::Coordinate(1000, 0); // auto rad = 100; // auto sa = 0;