2#ifndef GYM_PCB_ASHAPE_H
3#define GYM_PCB_ASHAPE_H
7#include "Math/Misc.hpp"
25 template<
typename T> T *as() {
return dynamic_cast< T *
>(
this); }
26 template<
typename T>
const T *as()
const {
return dynamic_cast<const T *
>(
this); }
28 virtual AShape *clone()
const = 0;
34 virtual uint indexCountWithRestart()
const {
return vertexCount() + 1; }
35 virtual bool canDrawAsTriFan()
const {
return true; }
37 virtual bool isRound()
const {
return false; }
39 virtual Real unsignedArea()
const = 0;
41 virtual Bbox_2 bbox()
const = 0;
43 Real boundingRadius()
const;
55 virtual void transform(
const CGAL::Aff_transformation_2<Kernel>&) = 0;
56 virtual void translate(
const Vector_2&) = 0;
64 virtual bool contains(
const Point_2&)
const = 0;
66 virtual Real squared_distance(
const AShape&)
const = 0;
68 virtual Real squared_distance(const ::Point_2&)
const = 0;
69 virtual Real squared_distance(
const Segment_2&)
const = 0;
70 virtual Real squared_distance(
const Circle_2&)
const = 0;
71 virtual Real squared_distance(
const Iso_rectangle_2&)
const = 0;
72 Real squared_distance(
const Bbox_2&)
const;
73 virtual Real squared_distance(
const Triangle_2&)
const = 0;
74 virtual Real squared_distance(
const Polygon_2&)
const = 0;
77 virtual bool intersects(
const AShape&)
const = 0;
79 virtual bool intersects(
const Circle_2&)
const = 0;
80 virtual bool intersects(
const Iso_rectangle_2&)
const = 0;
81 bool intersects(
const Bbox_2&)
const;
82 virtual bool intersects(
const Triangle_2&)
const = 0;
83 virtual bool intersects(
const Polygon_2&)
const = 0;
86 virtual ::Point_2 centroid()
const = 0;
88 virtual std::string str()
const = 0;
99 virtual PyObject *
getPy()
const = 0;
102inline Real AShape::boundingRadius()
const
104 const auto B = bbox();
105 return std::max(B.xmax() - B.xmin(), B.ymax() - B.ymin());
108inline bool AShape::intersects(
const Bbox_2 &bbox)
const
110 return intersects(Iso_rectangle_2(bbox));
112inline Real AShape::squared_distance(
const Bbox_2 &bbox)
const
114 return squared_distance(Iso_rectangle_2(bbox));
117class CircleEx :
public AShape,
public Circle_2
120 CircleEx(
const Circle_2 &base) : Circle_2(base) { }
122 AShape *clone()
const override {
return new CircleEx(*
this); }
124 CircleEx grown(Real)
const;
127 bool canDrawAsTriFan()
const override {
return true; }
129 bool isRound()
const override {
return true; }
131 Real unsignedArea()
const override {
return squared_radius() * M_PI; }
133 Bbox_2 bbox()
const override {
return Circle_2::bbox(); }
137 void transform(
const CGAL::Aff_transformation_2<Kernel>&)
override;
138 void translate(const ::Vector_2&)
override;
140 bool contains(const ::Point_2&)
const override;
142 Real squared_distance(
const AShape &S)
const override {
return S.squared_distance(*
static_cast<const Circle_2 *
>(
this)); }
144 Real squared_distance(const ::Point_2&)
const override;
145 Real squared_distance(
const Segment_2&)
const override;
146 Real squared_distance(
const Circle_2&)
const override;
147 Real squared_distance(
const Iso_rectangle_2&)
const override;
148 Real squared_distance(
const Triangle_2&)
const override;
149 Real squared_distance(
const Polygon_2&)
const override;
152 bool intersects(
const AShape &S)
const override {
return S.intersects(*
static_cast<const Circle_2 *
>(
this)); }
154 bool intersects(
const Circle_2&)
const override;
155 bool intersects(
const Iso_rectangle_2&)
const override;
156 bool intersects(
const Triangle_2&)
const override;
157 bool intersects(
const Polygon_2&)
const override;
158 bool intersects(
const WideSegment_25&)
const override;
160 ::Point_2 centroid()
const override {
return center(); }
162 std::string str()
const override;
165inline CircleEx CircleEx::grown(Real dr)
const
167 return CircleEx(Circle_2(center(), math::squared(std::sqrt(squared_radius()) + dr)));
170class TriangleEx :
public AShape,
public Triangle_2
173 TriangleEx(
const Triangle_2 &base) : Triangle_2(base) { }
174 TriangleEx(Triangle_2 &&base) : Triangle_2(base) { }
176 AShape *clone()
const override {
return new TriangleEx(*
this); }
180 Real unsignedArea()
const override {
return std::abs(area()); }
182 Bbox_2 bbox()
const override {
return Triangle_2::bbox(); }
184 void transform(
const CGAL::Aff_transformation_2<Kernel>&)
override;
185 void translate(const ::Vector_2&)
override;
187 bool contains(const ::Point_2&)
const override;
189 Real squared_distance(
const AShape &S)
const override {
return S.squared_distance(*
static_cast<const Triangle_2 *
>(
this)); }
191 Real squared_distance(const ::Point_2&)
const override;
192 Real squared_distance(
const Segment_2&)
const override;
193 Real squared_distance(
const Circle_2 &C)
const override;
194 Real squared_distance(
const Iso_rectangle_2&)
const override;
195 Real squared_distance(
const Triangle_2&)
const override;
196 Real squared_distance(
const Polygon_2&)
const override;
199 bool intersects(
const AShape &S)
const override {
return S.intersects(*
static_cast<const Triangle_2 *
>(
this)); }
201 bool intersects(
const Circle_2&)
const override;
202 bool intersects(
const Iso_rectangle_2&)
const override;
203 bool intersects(
const Triangle_2&)
const override;
204 bool intersects(
const Polygon_2&)
const override;
205 bool intersects(
const WideSegment_25&)
const override;
207 ::Point_2 centroid()
const override;
209 std::string str()
const override;
213class IsoRectEx :
public AShape,
public Iso_rectangle_2
216 IsoRectEx(
const Iso_rectangle_2 &base) : Iso_rectangle_2(base) { }
217 IsoRectEx(Iso_rectangle_2 &&base) : Iso_rectangle_2(base) { }
219 IsoRectEx(
const Bbox_2 &bbox) : Iso_rectangle_2(bbox) { }
221 AShape *clone()
const override {
return new IsoRectEx(*
this); }
225 Real unsignedArea()
const override {
return std::abs(area()); }
227 Bbox_2 bbox()
const override {
return Iso_rectangle_2::bbox(); }
231 void transform(
const CGAL::Aff_transformation_2<Kernel>&)
override;
232 void translate(const ::Vector_2&)
override;
236 bool contains(const ::Point_2&)
const override;
238 Real squared_distance(
const AShape &S)
const override {
return S.squared_distance(*
static_cast<const Iso_rectangle_2 *
>(
this)); }
240 Real squared_distance(const ::Point_2&)
const override;
241 Real squared_distance(
const Segment_2&)
const override;
242 Real squared_distance(
const Circle_2 &C)
const override;
243 Real squared_distance(
const Triangle_2 &T)
const override;
244 Real squared_distance(
const Iso_rectangle_2&)
const override;
245 Real squared_distance(
const Polygon_2&)
const override;
248 bool intersects(
const AShape &S)
const override {
return S.intersects(*
static_cast<const Iso_rectangle_2 *
>(
this)); }
250 bool intersects(
const Circle_2 &C)
const override;
251 bool intersects(
const Triangle_2 &T)
const override;
252 bool intersects(
const Iso_rectangle_2&)
const override;
253 bool intersects(
const Polygon_2&)
const override;
254 bool intersects(
const WideSegment_25&)
const override;
261 ::Point_2 centroid()
const override;
263 std::string str()
const override;
267class PolygonEx :
public AShape,
public Polygon_2
270 PolygonEx(
const Polygon_2 &base) : Polygon_2(base) { }
271 PolygonEx(Polygon_2 &&base) : Polygon_2(base) { }
273 AShape *clone()
const override {
return new PolygonEx(*
this); }
275 PolygonEx grown(Real size, Real epsilon = 0.125)
const;
283 static Polygon_2
grow(
const Polygon_2&, Real size, Real epsilon = 0.125);
286 uint indexCountWithRestart()
const override {
return is_convex() ? (
vertexCount() + 1) : 0; }
287 bool canDrawAsTriFan()
const override {
return is_convex(); }
289 Real unsignedArea()
const override {
return std::abs(area()); }
291 Bbox_2 bbox()
const override {
return Polygon_2::bbox(); }
293 void transform(
const CGAL::Aff_transformation_2<Kernel>&)
override;
294 void translate(const ::Vector_2&)
override;
296 bool contains(const ::Point_2&)
const override;
298 Real squared_distance(
const AShape &S)
const override {
return S.squared_distance(*
static_cast<const Polygon_2 *
>(
this)); }
300 Real squared_distance(const ::Point_2&)
const override;
301 Real squared_distance(
const Segment_2&)
const override;
302 Real squared_distance(
const Circle_2 &C)
const override;
303 Real squared_distance(
const Iso_rectangle_2 &R)
const override;
304 Real squared_distance(
const Triangle_2 &T)
const override;
305 Real squared_distance(
const Polygon_2&)
const override;
308 bool intersects(
const AShape &S)
const override {
return S.intersects(*
static_cast<const Polygon_2 *
>(
this)); }
310 bool intersects(
const Circle_2 &C)
const override;
311 bool intersects(
const Iso_rectangle_2 &R)
const override;
312 bool intersects(
const Triangle_2 &T)
const override;
313 bool intersects(
const Polygon_2&)
const override;
314 bool intersects(
const WideSegment_25&)
const override;
316 ::Point_2 centroid()
const override;
318 std::string str()
const override;
322 static Polygon_2 _grow_offset(
const Polygon_2&, Real size, Real epsilon = 0.125);
323 static Polygon_2 _grow_stupid(
const Polygon_2&, Real size);
334 WideSegment_25(
const Segment_25 &s, Real halfWidth) :
mBase(s), mHW(halfWidth) { }
335 WideSegment_25(
const Segment_2 &s,
int z, Real halfWidth) :
mBase(s, z), mHW(halfWidth) { }
336 WideSegment_25(
const Point_2 &v0,
const Point_2 &v1,
int z, Real halfWidth) :
mBase(v0, v1, z), mHW(halfWidth) { }
349 Real halfWidth()
const {
return mHW; }
350 Real width()
const {
return mHW + mHW; }
351 Real squared_width()
const {
return width() * width(); }
353 int z()
const {
return mBase.z(); }
354 Point_25 source()
const {
return mBase.source(); }
355 Point_25 target()
const {
return mBase.target(); }
356 const Point_2& source_2()
const {
return mBase.source_2(); }
357 const Point_2& target_2()
const {
return mBase.target_2(); }
359 Circle_2 sourceCap()
const {
return Circle_2(source_2(), mHW * mHW); }
360 Circle_2 targetCap()
const {
return Circle_2(target_2(), mHW * mHW); }
367 int joins2D(
const Point_2&, Real leewaySquared = -1.0)
const;
369 bool widerThanBaseLen()
const {
return squared_width() >
mBase.squared_length(); }
383 WideSegment_25
opposite()
const {
return WideSegment_25(
mBase.opposite(), halfWidth()); }
385 WideSegment_25 orderedY()
const {
return mBase.isYOrdered() ? *this :
opposite(); }
387 AShape *clone()
const override {
return new WideSegment_25(*
this); }
390 bool canDrawAsTriFan()
const override {
return true; }
392 bool isRound()
const override {
return true; }
394 Real unsignedArea()
const override {
return width() *
mBase.length() + mHW * mHW * M_PI; }
396 Bbox_2 bbox()
const override;
398 void transform(
const CGAL::Aff_transformation_2<Kernel>&)
override;
399 void translate(const ::Vector_2&)
override;
409 WideSegment_25&
rectify(Real angleTolerance) {
mBase.rectify(angleTolerance);
return *
this; }
416 bool contains(const ::Point_2&)
const override;
418 Real squared_distance(
const AShape &S)
const override {
return S.squared_distance(*
static_cast<const WideSegment_25 *
>(
this)); }
420 Real squared_distance(const ::Point_2&)
const override;
421 Real squared_distance(
const Segment_2&)
const override;
422 Real squared_distance(
const Circle_2 &C)
const override;
423 Real squared_distance(
const Iso_rectangle_2 &R)
const override;
424 Real squared_distance(
const Triangle_2 &T)
const override;
425 Real squared_distance(
const Polygon_2 &P)
const override;
428 bool intersects(
const AShape &S)
const override {
return S.intersects(*
static_cast<const WideSegment_25 *
>(
this)); }
430 bool intersects(
const Circle_2 &C)
const override;
431 bool intersects(
const Iso_rectangle_2 &R)
const override;
432 bool intersects(
const Triangle_2 &T)
const override;
433 bool intersects(
const Polygon_2 &P)
const override;
434 bool intersects(
const WideSegment_25&)
const override;
441 bool violatesClearance2D(
const WideSegment_25&, Real clearance,
Point_25 * = 0)
const;
443 ::Point_2 centroid()
const override {
return source_2() +
mBase.s2().to_vector() * 0.5; }
445 static WideSegment_25
fromPy(PyObject *);
447 std::string str()
const override;
450 PyObject *getShortPy()
const;
457 const auto M =
mBase.source_2() +
mBase.s2().to_vector() * 0.5;
459 return WideSegment_25(M + v, M - v, z(),
mBase.length() * 0.5 + deltaHW);
462inline std::ostream& operator<<(std::ostream &os,
const WideSegment_25 &s)
464 return os << s.str();
virtual bool transformPreservesType(const CGAL::Aff_transformation_2< Kernel > &) const
Definition AShape.hpp:50
virtual void transform(const CGAL::Aff_transformation_2< Kernel > &)=0
virtual uint vertexCount() const =0
virtual AShape * transformType(const CGAL::Aff_transformation_2< Kernel > &)
virtual PyObject * getPy() const =0
Definition AShape.hpp:118
PyObject * getPy() const override
void transform(const CGAL::Aff_transformation_2< Kernel > &) override
uint vertexCount() const override
Definition AShape.hpp:126
bool transformPreservesType(const CGAL::Aff_transformation_2< Kernel > &) const override
Definition AShape.hpp:214
void transform(const CGAL::Aff_transformation_2< Kernel > &) override
Real lengthOutside(const Segment_2 &) const
AShape * transformType(const CGAL::Aff_transformation_2< Kernel > &) override
bool transformPreservesType(const CGAL::Aff_transformation_2< Kernel > &) const override
uint vertexCount() const override
Definition AShape.hpp:223
PyObject * getPy() const override
Definition Geometry.hpp:131
Definition AShape.hpp:268
PyObject * getPy() const override
uint vertexCount() const override
Definition AShape.hpp:285
void transform(const CGAL::Aff_transformation_2< Kernel > &) override
static Polygon_2 grow(const Polygon_2 &, Real size, Real epsilon=0.125)
Definition Geometry.hpp:155
Definition AShape.hpp:171
uint vertexCount() const override
Definition AShape.hpp:178
void transform(const CGAL::Aff_transformation_2< Kernel > &) override
PyObject * getPy() const override
Definition AShape.hpp:332
PyObject * getPy() const override
WideSegment_25 & rectify(Real angleTolerance)
Definition AShape.hpp:409
WideSegment_25 opposite() const
Definition AShape.hpp:383
void transform(const CGAL::Aff_transformation_2< Kernel > &) override
bool violatesClearance(const WideSegment_25 &, Real clearance, Point_25 *=0) const
Segment_2 s2_extended(uint mask=0x3) const
int joins2D(const Point_2 &, Real leewaySquared=-1.0) const
uint vertexCount() const override
Definition AShape.hpp:389
::Vector_2 getHalfWidthSpan(Real delta=0.0) const
Definition AShape.hpp:374
static WideSegment_25 fromPy(PyObject *)
Segment_25 mBase
Definition AShape.hpp:452
WideSegment_25 swapWL(Real deltaHW=0.0, Real deltaL=0.0) const
Definition AShape.hpp:455
WideSegment_25 grown(Real) const