segment_voronoi_diagram_predicates_rth2.h
来自「CGAL is a collaborative effort of severa」· C头文件 代码 · 共 680 行 · 第 1/2 页
H
680 行
// Copyright (c) 2003,2004 INRIA Sophia-Antipolis (France) and// Notre Dame University (U.S.A.). All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $Source: /CVSROOT/CGAL/Packages/Segment_Voronoi_diagram_2/include/CGAL/predicates/Segment_Voronoi_diagram_predicates_rtH2.h,v $// $Revision: 1.2 $ $Date: 2004/01/09 18:48:14 $// $Name: $//// Author(s) : Menelaos Karavelas <mkaravel@cse.nd.edu>#ifndef CGAL_SEGMENT_VORONOI_DIAGRAM_PREDICATES_RTH2_H#define CGAL_SEGMENT_VORONOI_DIAGRAM_PREDICATES_RTH2_H#include <CGAL/predicates/Segment_Voronoi_diagram_predicates_H2.h>#include <CGAL/predicates/check_filter.h>#include <CGAL/Segment_Voronoi_diagram_kernel_wrapper_2.h>CGAL_BEGIN_NAMESPACEtemplate<class RT, class Method_tag>Comparison_resultsvd_compare_distanceH2(const RT& qhx, const RT& qhy, const RT& qhw, const RT& shx, const RT& shy, const RT& shw, const RT& thx, const RT& thy, const RT& thw, const RT& phx, const RT& phy, const RT& phw, Method_tag){ // first check if (qx,qy) is inside, the boundary or at the exterior // of the band of the segment s //******************************************************************** //******************************************************************** must_be_filtered(qhx); FT dx = sx - tx; FT dy = sy - ty; FT d1x = qx - sx; FT d1y = qy - sy; FT d2x = qx - tx; FT d2y = qy - ty; if ( px == sx && py == sy ) { FT o = dx * d1x + dy * d1y; if ( o >= FT(0) ) { return LARGER; } } if ( px == tx && py == ty ) { FT o = dx * d2x + dy * d2y; if ( o <= FT(0) ) { return LARGER; } } FT d2_from_p = CGAL::square (qx-px) + CGAL::square(qy-py); FT dot1 = dx * d1x + dy * d1y; if ( dot1 >= FT(0) ) { // q is outside (or the boundary of) the band on the side of s. FT d2_from_s = CGAL::square(d1x) + CGAL::square(d1y); return CGAL::compare(d2_from_s, d2_from_p); } FT dot2 = dx * d2x + dy * d2y; if ( dot2 <= FT(0) ) { // q is outside (or the boundary of) the band on the side of t. FT d2_from_t = CGAL::square(d2x) + CGAL::square(d2y); return CGAL::compare(d2_from_t, d2_from_p); } // q is strictly in the interior of the band, so I have to compare // its distance from the supporting line. FT c = sx * ty - sy * tx; FT n = CGAL::square(dx) + CGAL::square(dy); FT d2_from_l = CGAL::square(qx * dy - qy * dx + c); return CGAL::compare(d2_from_l, d2_from_p * n);}template<class FT, class Method_tag>Comparison_resultsvd_compare_distanceC2(const FT& qx, const FT& qy, const FT& s1x, const FT& s1y, const FT& t1x, const FT& t1y, const FT& s2x, const FT& s2y, const FT& t2x, const FT& t2y, Method_tag){ // first check if (qx,qy) is inside, the boundary or at the exterior // of the band of the segments s1, s2 must_be_filtered(qx); FT d1x = s1x - t1x; FT d1y = s1y - t1y; FT d2x = s2x - t2x; FT d2y = s2y - t2y; FT dqs1x = qx - s1x; FT dqs1y = qy - s1y; FT dqt1x = qx - t1x; FT dqt1y = qy - t1y; FT dqs2x = qx - s2x; FT dqs2y = qy - s2y; FT dqt2x = qx - t2x; FT dqt2y = qy - t2y; FT dot_s1 = d1x * dqs1x + d1y * dqs1y; int idx1; // 0 for s1, 1 for interior of 1, 2 for t1; if ( qx == s1x && qy == s1y ) { idx1 = 0; } else if ( qx == t1x && qy == t1y ) { idx1 = 2; } else if ( dot_s1 >= FT(0) ) { // q is outside (or the boundary of) the band of 1 on the side of s1. idx1 = 0; } else { FT dot_t1 = d1x * dqt1x + d1y * dqt1y; if ( dot_t1 <= FT(0) ) { // q is outside (or the boundary of) the band of 1 on the side of t1. idx1 = 2; } else { idx1 = 1; } } FT dot_s2 = d2x * dqs2x + d2y * dqs2y; int idx2; // 0 for s2, 1 for interior of 2, 2 for t2; if ( qx == s2x && qy == s2y ) { idx2 = 0; } else if ( qx == t2x && qy == t2y ) { idx2 = 2; } else if ( dot_s2 >= FT(0) ) { // q is outside (or the boundary of) the band of 2 on the side of s2. idx2 = 0; } else { FT dot_t2 = d2x * dqt2x + d2y * dqt2y; if ( dot_t2 <= FT(0) ) { // q is outside (or the boundary of) the band of 2 on the side of t2. idx2 = 2; } else { idx2 = 1; } } if ( idx1 == 0 ) { FT d2_from_s1 = CGAL::square(dqs1x) + CGAL::square(dqs1y); // if ( qx == s1x && qy == s1y ) { d2_from_s1 = FT(0); } if ( idx2 == 0 ) { FT d2_from_s2 = CGAL::square(dqs2x) + CGAL::square(dqs2y); // if ( qx == s2x && qy == s2y ) { d2_from_s2 = FT(0); } if ( s1x == s2x && s1y == s2y ) { return EQUAL; } return CGAL::compare(d2_from_s1, d2_from_s2); } else if ( idx2 == 2 ) { FT d2_from_t2 = CGAL::square(dqt2x) + CGAL::square(dqt2y); // if ( qx == t2x && qy == t2y ) { d2_from_t2 = FT(0); } if ( s1x == t2x && s1y == t2y ) { return EQUAL; } return CGAL::compare(d2_from_s1, d2_from_t2); } else { // idx2 == 1 FT c2 = s2x * t2y - s2y * t2x; FT n2 = CGAL::square(d2x) + CGAL::square(d2y); FT d2_from_l2 = CGAL::square(qx * d2y - qy * d2x + c2); return CGAL::compare(d2_from_s1 * n2, d2_from_l2); } } else if ( idx1 == 2 ) { FT d2_from_t1 = CGAL::square(dqt1x) + CGAL::square(dqt1y); // if ( qx == t1x && qy == t1y ) { d2_from_t1 = FT(0); } if ( idx2 == 0 ) { FT d2_from_s2 = CGAL::square(dqs2x) + CGAL::square(dqs2y); // if ( qx == s2x && qy == s2y ) { d2_from_s2 = FT(0); } if ( t1x == s2x && t1y == s2y ) { return EQUAL; } return CGAL::compare(d2_from_t1, d2_from_s2); } else if ( idx2 == 2 ) { FT d2_from_t2 = CGAL::square(dqt2x) + CGAL::square(dqt2y); // if ( qx == t2x && qy == t2y ) { d2_from_t2 = FT(0); } if ( t1x == t2x && t1y == t2y ) { return EQUAL; } return CGAL::compare(d2_from_t1, d2_from_t2); } else { // idx2 == 1 FT c2 = s2x * t2y - s2y * t2x; FT n2 = CGAL::square(d2x) + CGAL::square(d2y); FT d2_from_l2 = CGAL::square(qx * d2y - qy * d2x + c2); return CGAL::compare(d2_from_t1 * n2, d2_from_l2); } } else { // idx1 == 1 FT c1 = s1x * t1y - s1y * t1x; FT n1 = CGAL::square(d1x) + CGAL::square(d1y); FT d2_from_l1 = CGAL::square(qx * d1y - qy * d1x + c1); if ( idx2 == 0 ) { FT d2_from_s2 = CGAL::square(dqs2x) + CGAL::square(dqs2y); // if ( qx == s2x && qy == s2y ) { d2_from_s2 = FT(0); } return CGAL::compare(d2_from_l1, d2_from_s2 * n1); } else if ( idx2 == 2 ) { FT d2_from_t2 = CGAL::square(dqt2x) + CGAL::square(dqt2y); // if ( qx == t2x && qy == t2y ) { d2_from_t2 = FT(0); } return CGAL::compare(d2_from_l1, d2_from_t2 * n1); } else { // idx2 == 1 FT c2 = s2x * t2y - s2y * t2x; FT n2 = CGAL::square(d2x) + CGAL::square(d2y); FT d2_from_l2 = CGAL::square(qx * d2y - qy * d2x + c2); return CGAL::compare(d2_from_l1 * n2, d2_from_l2 * n1); } }}//--------------------------------------------------------------------------template<class K, class Method_tag>inlineSignsvd_vertex_conflict_ftC2(const typename K::Site_2 t[], unsigned int num_sites, Method_tag mtag){ typedef typename K::FT FT; char site_types[4]; std::vector<FT> v; for (unsigned int i = 0; i < num_sites; i++) { if ( t[i].is_point() ) { v.push_back( t[i].point().x() ); v.push_back( t[i].point().y() ); site_types[i] = 'p'; } else { v.push_back( t[i].source().x() ); v.push_back( t[i].source().y() ); v.push_back( t[i].target().x() ); v.push_back( t[i].target().y() ); site_types[i] = 's'; } } return svd_vertex_conflict_ftC2(v, site_types, num_sites, mtag);} template<class K, class Method_tag>inlineSignsvd_vertex_conflict_ftC2(const typename K::Site_2& p, const typename K::Site_2& q, const typename K::Site_2& t, Method_tag mtag){ typename K::Site_2 site_vec[] = {p, q, t}; return svd_vertex_conflict_ftC2<K,Method_tag>(site_vec, 3, mtag);}template<class K, class Method_tag>inlineSignsvd_vertex_conflict_ftC2(const typename K::Site_2& p, const typename K::Site_2& q, const typename K::Site_2& r, const typename K::Site_2& t, Method_tag mtag){ typename K::Site_2 site_vec[] = {p, q, r, t}; return svd_vertex_conflict_ftC2<K,Method_tag>(site_vec, 4, mtag);}template<class FT, class Method_tag>inlineSignsvd_vertex_conflict_ftC2(const std::vector<FT>& v, char site_types[], unsigned int num_sites, Method_tag){ CGAL_precondition( num_sites == 3 || num_sites == 4 ); must_be_filtered(FT()); typedef Simple_cartesian<FT> Rep; typedef CGAL::Segment_Voronoi_diagram_kernel_wrapper_2<Rep> Kernel; typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Segment_2 Segment_2; typedef typename Kernel::Site_2 Site_2; typedef Svd_incircle_2<Kernel,Method_tag> Incircle; Site_2* t = new Site_2[4]; for (unsigned int i = 0, k = 0; i < num_sites; i++) { if ( site_types[i] == 'p' ) { Point_2 p(v[k], v[k+1]); t[i].set_point( p ); } else if ( site_types[i] == 's' ) { Point_2 p1(v[k], v[k+1]), p2(v[k+2], v[k+3]); Segment_2 s(p1, p2); t[i].set_segment( s ); } else { CGAL_assertion( site_types[i] == 'p' || site_types[i] == 's' ); } k += ( (site_types[i] == 'p') ? 2 : 4 ); } Sign res(ZERO);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?