77namespace Geom
88{
99
10- Circle::Circle (const Rect &rect, FromRect fromRect)
11- {
12- radius = fromRect == FromRect::inscribed
13- ? rect.size .minSize () / 2.0
14- : fromRect == FromRect::sameWidth ? rect.size .x / 2.0
15- : fromRect == FromRect::sameHeight ? rect.size .y / 2.0
16- : fromRect == FromRect::outscribed
17- ? rect.size .diagonal () / 2.0
18- : throw std::logic_error (" invalid circle parameter" );
19- center = rect.pos + rect.size / 2.0 ;
20- }
21-
2210Circle::Circle (const Circle &c0,
2311 const Circle &c1,
2412 double radius,
@@ -40,29 +28,16 @@ bool Circle::concentric(const Circle &c) const
4028 return center == c.center ;
4129}
4230
43- bool Circle::colateral (const Circle &c, double tolerance) const
44- {
45- return Math::AddTolerance (centerDistance (c), tolerance)
46- == (radius + c.radius );
47- }
48-
4931double Circle::area () const { return M_PI * radius * radius; }
5032
51- bool Circle::overlaps (const Circle &c, double tolerance ) const
33+ bool Circle::overlaps (const Circle &c) const
5234{
5335 auto d = c.center - center;
5436 auto sumRadius = radius + c.radius ;
55- return Math::AddTolerance (d.sqrAbs (), tolerance )
37+ return Math::AddTolerance (d.sqrAbs ())
5638 < sumRadius * sumRadius;
5739}
5840
59- double Circle::overlapFactor (const Circle &c) const
60- {
61- auto d = centerDistance (c);
62- auto r = radius + c.radius ;
63- return d == 0 ? 0 : r / d;
64- }
65-
6641Rect Circle::boundary () const
6742{
6843 return {center - Point{1 , 1 } * radius,
@@ -74,6 +49,13 @@ bool Circle::contains(const Point &point) const
7449 return (point - center).sqrAbs () <= radius * radius;
7550}
7651
52+ double Circle::distance (const Point &point) const
53+ {
54+ return std::max (0.0 ,
55+ (point - center).abs () - radius,
56+ Math::Floating::less);
57+ }
58+
7759double Circle::centerDistance (const Circle &c) const
7860{
7961 return (center - c.center ).abs ();
0 commit comments