⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 segment_less_yx_2.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 2000  Max-Planck-Institute Saarbruecken (Germany).// 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.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Partition_2/include/CGAL/Partition_2/Segment_less_yx_2.h $// $Id: Segment_less_yx_2.h 31311 2006-05-29 08:30:22Z wein $// //// Author(s)     : Susan Hert <hert@mpi-sb.mpg.de>#ifndef CGAL_SEGMENT_LESS_YX_2_H#define CGAL_SEGMENT_LESS_YX_2_H#include <utility>#include <CGAL/Partition_2/Turn_reverser.h>namespace CGAL {//// Compares two pairs of points representing two segments. The first is // "less than" the second if the second can see some point of the first // by looking straight down (i.e., in direction -pi/2). If the first can see// the second in this way, it is greater than the second.  If neither sees// the other when looking in the direction -pi/2, the one that is farther// to the left is less than the one farther to the right.//template <class Traits>class Segment_less_yx_2{   typedef typename Traits::Point_2             Point_2;   typedef std::pair<Point_2, Point_2>          Point_pair;   typedef typename Traits::Less_xy_2           Less_xy_2;   typedef typename Traits::Compare_x_2         Compare_x_2;   typedef typename Traits::Compare_y_2         Compare_y_2;   typedef typename Traits::Left_turn_2          Left_turn_2;   typedef Turn_reverser<Point_2, Left_turn_2>   Right_turn_2;   public:     Segment_less_yx_2() :        _less_xy_2(Traits().less_xy_2_object()),       _compare_x_2(Traits().compare_x_2_object()),       _compare_y_2(Traits().compare_y_2_object()),       _left_turn_2(Traits().left_turn_2_object()),       _right_turn_2(Right_turn_2(_left_turn_2))     { }          bool      operator()(const Point_pair& p, const Point_pair& q) const     {         Point_2 p_smaller_xy, p_larger_xy;        Point_2 q_smaller_xy, q_larger_xy;        // order the point pairs by x value        if (_less_xy_2(p.first, p.second))        {           p_smaller_xy = p.first;           p_larger_xy = p.second;        }        else        {           p_smaller_xy = p.second;           p_larger_xy = p.first;        }        if (_less_xy_2(q.first, q.second))        {           q_smaller_xy = q.first;           q_larger_xy = q.second;        }        else        {           q_smaller_xy = q.second;           q_larger_xy = q.first;        }        // x range of p comes before x range of q        if (_compare_x_2(p_larger_xy, q_smaller_xy) == SMALLER)           return true;        else if (_compare_x_2(p_larger_xy, q_smaller_xy) == EQUAL)        {            // x range of p ends where x range of q starts           Comparison_result y_comp = _compare_y_2(p_larger_xy, q_smaller_xy);           if (y_comp == SMALLER)              return true;           else if (y_comp == LARGER)              return false;           else // y_comp == EQUAL, so p's x range comes before q's              return true;        }        // x range of q comes before x range of p        else if (_compare_x_2(q_larger_xy, p_smaller_xy) == SMALLER)           return false;        else if (_compare_x_2(q_larger_xy, p_smaller_xy) == EQUAL)        {            // x range of p starts where x range of q ends           Comparison_result y_comp = _compare_y_2(p_smaller_xy, q_larger_xy);           if (y_comp == SMALLER)              return true;           else if (y_comp == LARGER)              return false;           else // y_comp == EQUAL, so p's x range comes after q's              return false;        }        // see if one of q's endpoints is contained in p's x range        else if (_compare_x_2(p_smaller_xy,q_smaller_xy) == SMALLER &&                  _compare_x_2(q_smaller_xy,p_larger_xy) == SMALLER)           return _left_turn_2(p_smaller_xy,p_larger_xy,q_smaller_xy);        else if (_compare_x_2(p_smaller_xy,q_larger_xy) == SMALLER &&                 _compare_x_2(q_larger_xy,p_larger_xy) == SMALLER)           return _left_turn_2(p_smaller_xy,p_larger_xy,q_larger_xy);        //        // neither of q's endpoints is in p's x-range so see if one of        // p's endpoints is in q's x-range         //        else if (_compare_x_2(q_smaller_xy,p_smaller_xy) == SMALLER &&                  _compare_x_2(p_smaller_xy,q_larger_xy) == SMALLER)           return _right_turn_2(q_smaller_xy,q_larger_xy,p_smaller_xy);        else if (_compare_x_2(q_smaller_xy,p_larger_xy) == SMALLER &&                 _compare_x_2(p_larger_xy,q_larger_xy) == SMALLER )           return _right_turn_2(q_smaller_xy,q_larger_xy,p_larger_xy);        else // the x ranges are exactly the same        {           Comparison_result y_comp = _compare_y_2(p_smaller_xy, q_smaller_xy);           if (y_comp == SMALLER)               return true;           else if (y_comp == LARGER)              return false;           else // look at the other endpoint           {              y_comp = _compare_y_2(p_larger_xy, q_larger_xy);              if (y_comp == SMALLER)                  return true;              else if (y_comp == LARGER)                 return false;              else  // point pairs are identical                 return false;           }        }     }   private:      Less_xy_2 _less_xy_2;      Compare_x_2 _compare_x_2;      Compare_y_2 _compare_y_2;      Left_turn_2 _left_turn_2;      Right_turn_2 _right_turn_2;};}#endif // CGAL_SEGMENT_LESS_YX_2_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -