mirror of https://github.com/CGAL/cgal
sqrt pps case does not use bisectors
Signed-off-by: Panagiotis Cheilaris <philaris@cs.ntua.gr>
This commit is contained in:
parent
61262decd2
commit
8286a8a46d
|
|
@ -689,6 +689,123 @@ private:
|
||||||
CGAL_SDG_DEBUG(std::cout << "debug: PPS returns with vv=" << vv << std::endl;);
|
CGAL_SDG_DEBUG(std::cout << "debug: PPS returns with vv=" << vv << std::endl;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* compute pps vertex when the points p, q are not endpoints of
|
||||||
|
* segment r, when segment r is not axis-parallel, and when the
|
||||||
|
* two points p and q do not share any coordinate
|
||||||
|
*/
|
||||||
|
inline void
|
||||||
|
compute_pps_nonendp_nonhv_nonsamec
|
||||||
|
(const Site_2& p, const Site_2& q, const Site_2& r)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
Line_2 l = compute_supporting_line(r);
|
||||||
|
if (oriented_side_of_line(l, p.point()) == NEGATIVE) {
|
||||||
|
l = opposite_line(l);
|
||||||
|
}
|
||||||
|
CGAL_assertion(oriented_side_of_line(l, p.point()) == POSITIVE);
|
||||||
|
CGAL_assertion(oriented_side_of_line(l, q.point()) == POSITIVE);
|
||||||
|
|
||||||
|
const bool pos_slope = has_positive_slope(r);
|
||||||
|
const Comparison_result first_comp =
|
||||||
|
(pos_slope) ? scmpy(p, q) : scmpx(p, q);
|
||||||
|
const Comparison_result second_comp =
|
||||||
|
(pos_slope) ? scmpx(p, q) : scmpy(p, q);
|
||||||
|
|
||||||
|
const Sign signla = CGAL::sign(l.a());
|
||||||
|
const Sign signlb = CGAL::sign(l.b());
|
||||||
|
const Comparison_result first_value =
|
||||||
|
(signlb == POSITIVE)? SMALLER : LARGER;
|
||||||
|
|
||||||
|
const Comparison_result second_value =
|
||||||
|
(signla == NEGATIVE)? SMALLER : LARGER;
|
||||||
|
|
||||||
|
if (first_comp == first_value) {
|
||||||
|
const FT pcoord = pos_slope ? p.point().x() : p.point().y();
|
||||||
|
const FT lineval = coord_at(l, pcoord, pos_slope);
|
||||||
|
const Point_2 corner = pos_slope?
|
||||||
|
Point_2(pcoord, lineval) : Point_2(lineval, pcoord);
|
||||||
|
const FT sidelen = CGAL::max(CGAL::abs(corner.x() - q.point().x()),
|
||||||
|
CGAL::abs(corner.y() - q.point().y()));
|
||||||
|
vv = Point_2(FT(2)*corner.x() + signla*sidelen,
|
||||||
|
FT(2)*corner.y() + signlb*sidelen,
|
||||||
|
FT(2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (second_comp == second_value) {
|
||||||
|
const FT qcoord = pos_slope ? q.point().y() : q.point().x();
|
||||||
|
const FT lineval = coord_at(l, qcoord, not pos_slope);
|
||||||
|
const Point_2 corner = pos_slope?
|
||||||
|
Point_2(lineval, qcoord) : Point_2(qcoord, lineval);
|
||||||
|
const FT sidelen = CGAL::max(CGAL::abs(corner.x() - p.point().x()),
|
||||||
|
CGAL::abs(corner.y() - p.point().y()));
|
||||||
|
vv = Point_2(FT(2)*corner.x() + signla*sidelen,
|
||||||
|
FT(2)*corner.y() + signlb*sidelen,
|
||||||
|
FT(2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGAL_assertion((first_comp == -first_value ) and
|
||||||
|
(second_comp == -second_value) );
|
||||||
|
|
||||||
|
const FT px = p.point().x();
|
||||||
|
const FT py = p.point().y();
|
||||||
|
const FT qx = q.point().x();
|
||||||
|
const FT qy = q.point().y();
|
||||||
|
const FT pqdist = CGAL::max(CGAL::abs(px - qx), CGAL::abs(py - qy));
|
||||||
|
|
||||||
|
CGAL_SDG_DEBUG(std::cout
|
||||||
|
<< "debug: vsqrt pqdist=" << pqdist << std::endl;);
|
||||||
|
|
||||||
|
const FT & pcoord = pos_slope ? px : py;
|
||||||
|
const FT plineval = coord_at(l, pcoord, pos_slope);
|
||||||
|
const FT & pothercoord = pos_slope ? py : px;
|
||||||
|
const FT plen = CGAL::abs(plineval - pothercoord);
|
||||||
|
CGAL_SDG_DEBUG(std::cout
|
||||||
|
<< "debug: vsqrt plen=" << plen << std::endl;);
|
||||||
|
if (CGAL::compare(pqdist, plen) != SMALLER) {
|
||||||
|
// here, appropriate projection of p on supporting line of segment r
|
||||||
|
// is shorter than Linf p, q distance
|
||||||
|
const Point_2 corner = pos_slope?
|
||||||
|
Point_2(pcoord, plineval) : Point_2(plineval, pcoord);
|
||||||
|
vv = Point_2(FT(2)*corner.x() + signla*pqdist,
|
||||||
|
FT(2)*corner.y() + signlb*pqdist,
|
||||||
|
FT(2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FT & qcoord = pos_slope ? qy : qx;
|
||||||
|
const FT qlineval = coord_at(l, qcoord, not pos_slope);
|
||||||
|
const FT & qothercoord = pos_slope ? qx : qy;
|
||||||
|
const FT qlen = CGAL::abs(qlineval - qothercoord);
|
||||||
|
CGAL_SDG_DEBUG(std::cout
|
||||||
|
<< "debug: vsqrt qlen=" << qlen << std::endl;);
|
||||||
|
if (CGAL::compare(pqdist, qlen) != SMALLER) {
|
||||||
|
// here, appropriate projection of q on supporting line of segment r
|
||||||
|
// is shorter than Linf p, q distance
|
||||||
|
const Point_2 corner = pos_slope?
|
||||||
|
Point_2(qlineval, qcoord) : Point_2(qcoord, qlineval);
|
||||||
|
vv = Point_2(FT(2)*corner.x() + signla*pqdist,
|
||||||
|
FT(2)*corner.y() + signlb*pqdist,
|
||||||
|
FT(2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGAL_assertion((pqdist < plen) and (pqdist < qlen));
|
||||||
|
|
||||||
|
// here, compute corner opposite of corner on line of segment r
|
||||||
|
const Point_2 opposite_corner = pos_slope ?
|
||||||
|
Point_2(qx, py) : Point_2(px, qy);
|
||||||
|
CGAL_SDG_DEBUG(std::cout << "debug: vsqrt opposite_corner="
|
||||||
|
<< opposite_corner << std::endl;);
|
||||||
|
|
||||||
|
const Point_2 corner =
|
||||||
|
compute_linf_projection_nonhom(l, opposite_corner);
|
||||||
|
|
||||||
|
vv = Point_2(corner.x() + opposite_corner.x(),
|
||||||
|
corner.y() + opposite_corner.y(),
|
||||||
|
FT(2));
|
||||||
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
compute_pps_nonendp_nonhv(const Site_2& p, const Site_2& q, const Site_2& r)
|
compute_pps_nonendp_nonhv(const Site_2& p, const Site_2& q, const Site_2& r)
|
||||||
const
|
const
|
||||||
|
|
@ -696,7 +813,7 @@ private:
|
||||||
const bool samexpq = scmpx(p, q) == EQUAL;
|
const bool samexpq = scmpx(p, q) == EQUAL;
|
||||||
const bool sameypq = (samexpq)? false : make_certain(scmpy(p, q) == EQUAL);
|
const bool sameypq = (samexpq)? false : make_certain(scmpy(p, q) == EQUAL);
|
||||||
if (not (samexpq or sameypq)) {
|
if (not (samexpq or sameypq)) {
|
||||||
return compute_vv_bisectors(p, q, r, PPS_Type());
|
return compute_pps_nonendp_nonhv_nonsamec(p, q, r);
|
||||||
} else {
|
} else {
|
||||||
// samexpq or sameypq
|
// samexpq or sameypq
|
||||||
CGAL_assertion(samexpq != sameypq);
|
CGAL_assertion(samexpq != sameypq);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue