1
// Copyright (c) 2013 INRIA Sophia-Antipolis (France).
2
// All rights reserved.
4
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
5
// modify it under the terms of the GNU Lesser General Public License as
6
// published by the Free Software Foundation; either version 3 of the License,
7
// or (at your option) any later version.
9
// Licensees holding a valid commercial license may use this file in
10
// accordance with the commercial license agreement provided with the software.
12
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19
// Author(s) : Olivier Devillers
22
template<class Kernel>
23
typename Kernel::Circle_2
24
compute_circle_in_pencil(typename Kernel::Circle_2 c,typename Kernel::Circle_2 c1,typename Kernel::Circle_2 c2)
26
typename Kernel::Point_2 origin=CGAL::ORIGIN;
27
typename Kernel::FT lambda = CGAL::squared_distance(c.center(),origin) ;
28
lambda -= c.squared_radius() ;
29
typename Kernel::FT l1 = CGAL::squared_distance(c1.center(),origin) - c1.squared_radius() ;
30
typename Kernel::FT l2 = CGAL::squared_distance(c2.center(),origin) - c2.squared_radius() ;
31
l1 += -2*((c1.center()-origin)*(c.center()-origin));
32
l2 += -2*((c2.center()-origin)*(c.center()-origin));
33
lambda= - (lambda+l2)/(l1-l2);
34
typename Kernel::Point_2 center=origin+lambda*(c1.center()-origin)+(1-lambda)*(c2.center()-origin);
35
typename Kernel::FT sqradius=- lambda*(CGAL::squared_distance(c1.center(),origin)-c1.squared_radius())
36
-(1-lambda)*(CGAL::squared_distance(c2.center(),origin)-c2.squared_radius())
37
+CGAL::squared_distance(center,origin);
38
typename Kernel::Circle_2 circ(center,sqradius);
43
template<class Kernel>
44
typename Kernel::Circle_2
45
compute_circle_orthogonal(typename Kernel::Circle_2 c,typename Kernel::Circle_2 c1,typename Kernel::Circle_2 c2)
47
typename Kernel::Point_2 origin=CGAL::ORIGIN;
48
typename Kernel::FT z= CGAL::squared_distance(c.center(),origin)-c.squared_radius();
49
typename Kernel::FT z1= CGAL::squared_distance(c1.center(),origin)-c1.squared_radius();
50
typename Kernel::FT z2= CGAL::squared_distance(c2.center(),origin)-c2.squared_radius();
51
typename Kernel::FT det=-(c1.center().x() * c2.center().y() - c1.center().y() * c2.center().x())
52
+(c.center().x() * c2.center().y() - c.center().y() * c2.center().x())
53
-(c.center().x() * c1.center().y() - c.center().y() * c1.center().x());
54
typename Kernel::FT x=( -(z1 * c2.center().y() - c1.center().y() * z2)
55
+(z * c2.center().y() - c.center().y() * z2)
56
-(z * c1.center().y() - c.center().y() * z1))/2/det;
57
typename Kernel::FT y=( -(c1.center().x() * z2 - z1 * c2.center().x())
58
+(c.center().x() * z2 - z * c2.center().x())
59
-(c.center().x() * z1 - z * c1.center().x()))/2/det;
60
typename Kernel::FT rr=-( (c1.center().x() * c2.center().y() - c1.center().y() * c2.center().x())*z
61
-(c.center().x() * c2.center().y() - c.center().y() * c2.center().x())*z1
62
+(c.center().x() * c1.center().y() - c.center().y() * c1.center().x())*z2)/det+x*x+y*y;
63
typename Kernel::Point_2 center(x,y);
64
typename Kernel::Circle_2 circ(center,rr);