1 // rs_constructionline.cpp
3 // Part of the Architektonas Project
4 // Originally part of QCad Community Edition by Andrew Mustun
5 // Extensively rewritten and refactored by James L. Hammons
6 // (C) 2010 Underground Software
8 // JLH = James L. Hammons <jlhamm@acm.org>
11 // --- ---------- -----------------------------------------------------------
12 // JLH 05/28/2010 Added this text. :-)
13 // JLH 06/02/2010 Moved implementation from header to here WHERE IT BELONGS.
16 #include "rs_constructionline.h"
23 RS_ConstructionLine::RS_ConstructionLine(RS_EntityContainer * parent,
24 const RS_ConstructionLineData & d): RS_AtomicEntity(parent), data(d)
32 RS_ConstructionLine::~RS_ConstructionLine()
36 RS_Entity * RS_ConstructionLine::clone()
38 RS_ConstructionLine * c = new RS_ConstructionLine(*this);
43 /** @return RS2::EntityConstructionLine */
44 /*virtual*/ RS2::EntityType RS_ConstructionLine::rtti() const
46 return RS2::EntityConstructionLine;
51 * @return Start point of the entity.
53 /*virtual*/ Vector RS_ConstructionLine::getStartpoint() const
60 * @return End point of the entity.
62 /*virtual*/ Vector RS_ConstructionLine::getEndpoint() const
67 /** @return Copy of data that defines the line. */
68 RS_ConstructionLineData RS_ConstructionLine::getData() const
73 /** @return First definition point. */
74 Vector RS_ConstructionLine::getPoint1() const
78 /** @return Second definition point. */
79 Vector RS_ConstructionLine::getPoint2() const
84 void RS_ConstructionLine::calculateBorders()
86 minV = Vector::minimum(data.point1, data.point2);
87 maxV = Vector::maximum(data.point1, data.point2);
90 Vector RS_ConstructionLine::getNearestEndpoint(const Vector & coord, double * dist)
95 dist1 = data.point1.distanceTo(coord);
96 dist2 = data.point2.distanceTo(coord);
103 nearerPoint = &data.point2;
110 nearerPoint = &data.point1;
116 Vector RS_ConstructionLine::getNearestPointOnEntity(const Vector & coord,
117 bool /*onEntity*/, double * /*dist*/, RS_Entity ** entity)
122 Vector ae = data.point2-data.point1;
123 Vector ea = data.point1-data.point2;
124 Vector ap = coord-data.point1;
125 Vector ep = coord-data.point2;
127 if (ae.magnitude() < 1.0e-6 || ea.magnitude() < 1.0e-6)
128 return Vector(false);
130 // Orthogonal projection from both sides:
131 Vector ba = ae * Vector::dotP(ae, ap) / (ae.magnitude() * ae.magnitude());
132 Vector be = ea * Vector::dotP(ea, ep) / (ea.magnitude() * ea.magnitude());
134 return data.point1 + ba;
137 Vector RS_ConstructionLine::getNearestCenter(const Vector & /*coord*/, double * dist)
140 *dist = RS_MAXDOUBLE;
142 return Vector(false);
145 Vector RS_ConstructionLine::getNearestMiddle(const Vector & /*coord*/, double * dist)
148 *dist = RS_MAXDOUBLE;
150 return Vector(false);
153 Vector RS_ConstructionLine::getNearestDist(double /*distance*/, const Vector & /*coord*/,
157 *dist = RS_MAXDOUBLE;
159 return Vector(false);
162 double RS_ConstructionLine::getDistanceToPoint(const Vector& coord,
164 RS2::ResolveLevel /*level*/, double /*solidDist*/)
166 RS_DEBUG->print("RS_ConstructionLine::getDistanceToPoint");
171 double dist = RS_MAXDOUBLE;
172 Vector ae = data.point2-data.point1;
173 Vector ea = data.point1-data.point2;
174 Vector ap = coord-data.point1;
175 Vector ep = coord-data.point2;
177 if (ae.magnitude() < 1.0e-6 || ea.magnitude() < 1.0e-6)
180 // Orthogonal projection from both sides:
181 Vector ba = ae * Vector::dotP(ae, ap) / RS_Math::pow(ae.magnitude(), 2);
182 Vector be = ea * Vector::dotP(ea, ep) / RS_Math::pow(ea.magnitude(), 2);
184 RS_DEBUG->print("ba: %f", ba.magnitude());
185 RS_DEBUG->print("ae: %f", ae.magnitude());
187 Vector cp = Vector::crossP(ap, ae);
188 dist = cp.magnitude() / ae.magnitude();
193 void RS_ConstructionLine::move(Vector offset)
195 data.point1.move(offset);
196 data.point2.move(offset);
197 //calculateBorders();
200 void RS_ConstructionLine::rotate(Vector center, double angle)
202 data.point1.rotate(center, angle);
203 data.point2.rotate(center, angle);
204 //calculateBorders();
207 void RS_ConstructionLine::scale(Vector center, Vector factor)
209 data.point1.scale(center, factor);
210 data.point2.scale(center, factor);
211 //calculateBorders();
214 void RS_ConstructionLine::mirror(Vector axisPoint1, Vector axisPoint2)
216 data.point1.mirror(axisPoint1, axisPoint2);
217 data.point2.mirror(axisPoint1, axisPoint2);
220 /*virtual*/ void RS_ConstructionLine::draw(PaintInterface *, GraphicView *, double)
225 * Dumps the point's data to stdout.
227 std::ostream & operator<<(std::ostream & os, const RS_ConstructionLine & l)
229 os << " ConstructionLine: " << l.getData() << "\n";