inline calls to circumcenterC3() in the functors to avoid
dummy default ctors.
This commit is contained in:
@@ -1775,14 +1775,51 @@ namespace CartesianKernelFunctors {
|
||||
}
|
||||
|
||||
Point_3
|
||||
operator()(const Point_3& p, const Point_3& q, const Point_3& r) const
|
||||
operator()(const Point_3& p, const Point_3& q, const Point_3& s) const
|
||||
{
|
||||
typename K::Construct_point_3 construct_point_3;
|
||||
FT x, y, z;
|
||||
circumcenterC3(p.x(), p.y(), p.z(),
|
||||
q.x(), q.y(), q.z(),
|
||||
r.x(), r.y(), r.z(),
|
||||
x, y, z);
|
||||
// Translate s to origin to simplify the expression.
|
||||
FT psx = p.x()-s.x();
|
||||
FT psy = p.y()-s.y();
|
||||
FT psz = p.z()-s.z();
|
||||
FT ps2 = CGAL_NTS square(psx) + CGAL_NTS square(psy) + CGAL_NTS square(psz);
|
||||
FT qsx = q.x()-s.x();
|
||||
FT qsy = q.y()-s.y();
|
||||
FT qsz = q.z()-s.z();
|
||||
FT qs2 = CGAL_NTS square(qsx) + CGAL_NTS square(qsy) + CGAL_NTS square(qsz);
|
||||
FT rsx = psy*qsz-psz*qsy;
|
||||
FT rsy = psz*qsx-psx*qsz;
|
||||
FT rsz = psx*qsy-psy*qsx;
|
||||
|
||||
// The following determinants can be developped and simplified.
|
||||
//
|
||||
// FT num_x = det3x3_by_formula(psy,psz,ps2,
|
||||
// qsy,qsz,qs2,
|
||||
// rsy,rsz,0);
|
||||
// FT num_y = det3x3_by_formula(psx,psz,ps2,
|
||||
// qsx,qsz,qs2,
|
||||
// rsx,rsz,0);
|
||||
// FT num_z = det3x3_by_formula(psx,psy,ps2,
|
||||
// qsx,qsy,qs2,
|
||||
// rsx,rsy,0);
|
||||
|
||||
FT num_x = ps2 * det2x2_by_formula(qsy,qsz,rsy,rsz)
|
||||
- qs2 * det2x2_by_formula(psy,psz,rsy,rsz);
|
||||
FT num_y = ps2 * det2x2_by_formula(qsx,qsz,rsx,rsz)
|
||||
- qs2 * det2x2_by_formula(psx,psz,rsx,rsz);
|
||||
FT num_z = ps2 * det2x2_by_formula(qsx,qsy,rsx,rsy)
|
||||
- qs2 * det2x2_by_formula(psx,psy,rsx,rsy);
|
||||
|
||||
FT den = det3x3_by_formula(psx,psy,psz,
|
||||
qsx,qsy,qsz,
|
||||
rsx,rsy,rsz);
|
||||
|
||||
CGAL_kernel_assertion( den != 0 );
|
||||
FT inv = 1 / (2 * den);
|
||||
|
||||
FT x = s.x() + num_x*inv;
|
||||
FT y = s.y() - num_y*inv;
|
||||
FT z = s.z() + num_z*inv;
|
||||
return construct_point_3(x, y, z);
|
||||
}
|
||||
|
||||
@@ -1797,12 +1834,38 @@ namespace CartesianKernelFunctors {
|
||||
const Point_3& r, const Point_3& s) const
|
||||
{
|
||||
typename K::Construct_point_3 construct_point_3;
|
||||
FT x, y, z;
|
||||
circumcenterC3(p.x(), p.y(), p.z(),
|
||||
q.x(), q.y(), q.z(),
|
||||
r.x(), r.y(), r.z(),
|
||||
s.x(), s.y(), s.z(),
|
||||
x, y, z);
|
||||
// Translate p to origin to simplify the expression.
|
||||
FT qpx = q.x()-p.x();
|
||||
FT qpy = q.y()-p.y();
|
||||
FT qpz = q.z()-p.z();
|
||||
FT qp2 = CGAL_NTS square(qpx) + CGAL_NTS square(qpy) + CGAL_NTS square(qpz);
|
||||
FT rpx = r.x()-p.x();
|
||||
FT rpy = r.y()-p.y();
|
||||
FT rpz = r.z()-p.z();
|
||||
FT rp2 = CGAL_NTS square(rpx) + CGAL_NTS square(rpy) + CGAL_NTS square(rpz);
|
||||
FT spx = s.x()-p.x();
|
||||
FT spy = s.y()-p.y();
|
||||
FT spz = s.z()-p.z();
|
||||
FT sp2 = CGAL_NTS square(spx) + CGAL_NTS square(spy) + CGAL_NTS square(spz);
|
||||
|
||||
FT num_x = det3x3_by_formula(qpy,qpz,qp2,
|
||||
rpy,rpz,rp2,
|
||||
spy,spz,sp2);
|
||||
FT num_y = det3x3_by_formula(qpx,qpz,qp2,
|
||||
rpx,rpz,rp2,
|
||||
spx,spz,sp2);
|
||||
FT num_z = det3x3_by_formula(qpx,qpy,qp2,
|
||||
rpx,rpy,rp2,
|
||||
spx,spy,sp2);
|
||||
FT den = det3x3_by_formula(qpx,qpy,qpz,
|
||||
rpx,rpy,rpz,
|
||||
spx,spy,spz);
|
||||
CGAL_kernel_assertion( ! CGAL_NTS is_zero(den) );
|
||||
FT inv = 1 / (2 * den);
|
||||
|
||||
FT x = p.x() + num_x*inv;
|
||||
FT y = p.y() - num_y*inv;
|
||||
FT z = p.z() + num_z*inv;
|
||||
return construct_point_3(x, y, z);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user