kernel_ftc2.h

来自「CGAL is a collaborative effort of severa」· C头文件 代码 · 共 614 行 · 第 1/2 页

H
614
字号
// Copyright (c) 2000  Utrecht University (The Netherlands),// ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany),// INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg// (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria),// and Tel-Aviv University (Israel).  All rights reserved.//// This file is part of CGAL (www.cgal.org); you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License as// published by the Free Software Foundation; version 2.1 of the License.// See the file LICENSE.LGPL 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/Cartesian_kernel/include/CGAL/predicates/kernel_ftC2.h,v $// $Revision: 1.13 $ $Date: 2003/12/03 16:34:08 $// $Name:  $//// Author(s)     : Herve Bronnimann (Herve.Bronnimann@sophia.inria.fr)#ifndef CGAL_PREDICATES_KERNEL_FTC2_H#define CGAL_PREDICATES_KERNEL_FTC2_H#include <CGAL/number_utils.h>#include <CGAL/predicates/sign_of_determinant.h>#include <CGAL/constructions/kernel_ftC2.h>CGAL_BEGIN_NAMESPACEtemplate < class FT >inlineboolparallelC2(const FT &l1a, const FT &l1b,           const FT &l2a, const FT &l2b){    return sign_of_determinant2x2(l1a, l1b, l2a, l2b) == ZERO;}template < class FT >boolparallelC2(const FT &s1sx, const FT &s1sy,           const FT &s1tx, const FT &s1ty,           const FT &s2sx, const FT &s2sy,           const FT &s2tx, const FT &s2ty){    return sign_of_determinant2x2(s1tx - s1sx, s1ty - s1sy,                                  s2tx - s2sx, s2ty - s2sy) == ZERO;}template < class FT >CGAL_KERNEL_MEDIUM_INLINEboolequal_lineC2(const FT &l1a, const FT &l1b, const FT &l1c,             const FT &l2a, const FT &l2b, const FT &l2c){    if (sign_of_determinant2x2(l1a, l1b, l2a, l2b) != ZERO)        return false; // Not parallel.    CGAL::Sign s1a = CGAL_NTS sign(l1a);    if (s1a != ZERO)        return s1a == CGAL_NTS sign(l2a)	    && sign_of_determinant2x2(l1a, l1c, l2a, l2c) == ZERO;    return CGAL_NTS sign(l1b) == CGAL_NTS sign(l2b)	&& sign_of_determinant2x2(l1b, l1c, l2b, l2c) == ZERO;}template < class FT >CGAL_KERNEL_MEDIUM_INLINEComparison_resultcompare_xC2(const FT &px,            const FT &la, const FT &lb, const FT &lc,            const FT &ha, const FT &hb, const FT &hc){  // The abscissa of the intersection point is num/den.  FT num = det2x2_by_formula( lb, lc, hb, hc);  FT den = det2x2_by_formula( la, lb, ha, hb);  Sign s = CGAL_NTS sign(den);  CGAL_kernel_assertion( s != ZERO );  return Comparison_result( s * CGAL_NTS compare<FT>( px * den, num) );}template < class FT >CGAL_KERNEL_MEDIUM_INLINEComparison_resultcompare_xC2(const FT &la, const FT &lb, const FT &lc,            const FT &h1a, const FT &h1b, const FT &h1c,            const FT &h2a, const FT &h2b, const FT &h2c){  /*  FT num1 = det2x2_by_formula( lb, lc, h1b, h1c);  FT den1 = det2x2_by_formula( la, lb, h1a, h1b);  FT num2 = det2x2_by_formula( lb, lc, h2b, h2c);  FT den2 = det2x2_by_formula( la, lb, h2a, h2b);  Sign s = Sign (CGAL_NTS sign(den1) * CGAL_NTS sign(den2));  CGAL_kernel_assertion( s != ZERO );  return Comparison_result( s * sign_of_determinant2x2(num1,                                                        num2, den1, den2));  */  FT num1 = det2x2_by_formula( la, lc, h1a, h1c);  FT num2 = det2x2_by_formula( la, lc, h2a, h2c);  FT num  = det2x2_by_formula(h1a,h1c,h2a,h2c)*lb            + det2x2_by_formula(num1,num2,h1b,h2b);  FT den1 = det2x2_by_formula( la, lb, h1a, h1b);  FT den2 = det2x2_by_formula( la, lb, h2a, h2b);  return Comparison_result( CGAL_NTS sign(lb) * CGAL_NTS sign(num) *                            CGAL_NTS sign(den1) * CGAL_NTS sign(den2));}template < class FT >CGAL_KERNEL_MEDIUM_INLINEComparison_resultcompare_xC2(const FT &l1a, const FT &l1b, const FT &l1c,            const FT &h1a, const FT &h1b, const FT &h1c,            const FT &l2a, const FT &l2b, const FT &l2c,            const FT &h2a, const FT &h2b, const FT &h2c){  FT num1 = det2x2_by_formula( l1b, l1c, h1b, h1c);  FT den1 = det2x2_by_formula( l1a, l1b, h1a, h1b);  FT num2 = det2x2_by_formula( l2b, l2c, h2b, h2c);  FT den2 = det2x2_by_formula( l2a, l2b, h2a, h2b);  Sign s = Sign (CGAL_NTS sign(den1) * CGAL_NTS sign(den2));  CGAL_kernel_assertion( s != ZERO );  return Comparison_result( s * sign_of_determinant2x2(num1, num2,			                               den1, den2));}template < class FT >CGAL_KERNEL_MEDIUM_INLINEComparison_resultcompare_y_at_xC2(const FT &px, const FT &py,                 const FT &la, const FT &lb, const FT &lc){  Sign s = CGAL_NTS sign(lb);  CGAL_kernel_assertion( s != ZERO );  return Comparison_result (s * CGAL_NTS sign<FT>(la*px + lb*py + lc));}template < class FT >CGAL_KERNEL_MEDIUM_INLINEComparison_resultcompare_y_at_xC2(const FT &px,                 const FT &l1a, const FT &l1b, const FT &l1c,                 const FT &l2a, const FT &l2b, const FT &l2c){  Sign s = Sign (CGAL_NTS sign(l1b) * CGAL_NTS sign(l2b));  CGAL_kernel_assertion( s != ZERO );  return Comparison_result ( s * sign_of_determinant2x2<FT>(l2a*px+l2c, l2b,                                                            l1a*px+l1c, l1b));}template < class FT >CGAL_KERNEL_LARGE_INLINEComparison_resultcompare_y_at_xC2(const FT &l1a, const FT &l1b, const FT &l1c,                 const FT &l2a, const FT &l2b, const FT &l2c,                 const FT &ha,  const FT &hb,  const FT &hc){  Sign s = Sign (sign_of_determinant2x2(l1a, l1b, l2a, l2b) *		 CGAL_NTS sign(hb));  CGAL_kernel_assertion( s != ZERO );  return Comparison_result( s * sign_of_determinant3x3(l1a, l1b, l1c,                                                       l2a, l2b, l2c,                                                       ha,  hb,  hc));}template < class FT >CGAL_KERNEL_LARGE_INLINEComparison_resultcompare_y_at_xC2(const FT &l1a, const FT &l1b, const FT &l1c,                 const FT &l2a, const FT &l2b, const FT &l2c,                 const FT &h1a, const FT &h1b, const FT &h1c,                 const FT &h2a, const FT &h2b, const FT &h2c){  // The abscissa of the intersection point is num/den.  FT num = det2x2_by_formula( l1b, l1c, l2b, l2c);  FT den = det2x2_by_formula( l1a, l1b, l2a, l2b);  Sign s = Sign (CGAL_NTS sign(h1b) * CGAL_NTS sign(h2b) * CGAL_NTS sign(den));  CGAL_kernel_assertion( s != ZERO );  return Comparison_result ( s *	                     sign_of_determinant2x2<FT>(h2a*num+h2c*den, h2b,                                                        h1a*num+h1c*den, h1b));}template < class FT >/*CGAL_NO_FILTER*/CGAL_KERNEL_LARGE_INLINEComparison_resultcompare_y_at_xC2(const FT &px, const FT &py,                 const FT &ssx, const FT &ssy,                 const FT &stx, const FT &sty){    // compares the y-coordinates of p and the vertical projection of p on s.    // Precondition : p is in the x-range of s.    CGAL_kernel_precondition(px >= min(ssx, stx) && px <= max(ssx, stx));    if (ssx < stx)	return (Comparison_result) orientationC2(px, py, ssx, ssy, stx, sty);    else if (ssx > stx)	return (Comparison_result) orientationC2(px, py, stx, sty, ssx, ssy);    else {	if (py < min(sty, ssy))	    return SMALLER;	if (py > max(sty, ssy))	    return LARGER;	return EQUAL;    }}template < class FT >CGAL_KERNEL_LARGE_INLINEComparison_resultcompare_y_at_x_segment_C2(const FT &px,                          const FT &s1sx, const FT &s1sy,                          const FT &s1tx, const FT &s1ty,                          const FT &s2sx, const FT &s2sy,                          const FT &s2tx, const FT &s2ty){    // compares the y-coordinates of the vertical projections of p on s1 and s2    // Precondition : p is in the x-range of s1 and s2.    // - if one or two segments are vertical :    //   - if the segments intersect, return EQUAL    //   - if not, return the obvious SMALLER/LARGER.    CGAL_kernel_precondition(px >= min(s1sx, s1tx) && px <= max(s1sx, s1tx));    CGAL_kernel_precondition(px >= min(s2sx, s2tx) && px <= max(s2sx, s2tx));    if (s1sx != s1tx && s2sx != s2tx) {	FT s1stx = s1sx-s1tx;	FT s2stx = s2sx-s2tx;	return Comparison_result(	    CGAL_NTS compare(s1sx, s1tx) *	    CGAL_NTS compare(s2sx, s2tx) *	    CGAL_NTS compare<FT>(-(s1sx-px)*(s1sy-s1ty)*s2stx,		                 (s2sy-s1sy)*s2stx*s1stx		                 -(s2sx-px)*(s2sy-s2ty)*s1stx ));    }    else {	if (s1sx == s1tx) { // s1 is vertical	    Comparison_result c1, c2;	    c1 = compare_y_at_xC2(px, s1sy, s2sx, s2sy, s2tx, s2ty);	    c2 = compare_y_at_xC2(px, s1ty, s2sx, s2sy, s2tx, s2ty);	    if (c1 == c2)		return c1;	    return EQUAL;	}	// s2 is vertical	Comparison_result c3, c4;	c3 = compare_y_at_xC2(px, s2sy, s1sx, s1sy, s1tx, s1ty);	c4 = compare_y_at_xC2(px, s2ty, s1sx, s1sy, s1tx, s1ty);	if (c3 == c4)	    return opposite(c3);	return EQUAL;    }}template < class FT >CGAL_KERNEL_MEDIUM_INLINEboolequal_directionC2(const FT &dx1, const FT &dy1,                  const FT &dx2, const FT &dy2) {  return CGAL_NTS sign(dx1) == CGAL_NTS sign(dx2)      && CGAL_NTS sign(dy1) == CGAL_NTS sign(dy2)      && sign_of_determinant2x2(dx1, dy1, dx2, dy2) == ZERO;}template < class FT >/*CGAL_NO_FILTER*/CGAL_KERNEL_MEDIUM_INLINEComparison_resultcompare_angle_with_x_axisC2(const FT &dx1, const FT &dy1,                            const FT &dx2, const FT &dy2) {  // angles are in [-pi,pi], and the angle between Ox and d1 is compared  // with the angle between Ox and d2  int quadrant_1 = (dx1 >= FT(0)) ? ((dy1 >= FT(0))?1:4)                                  : ((dy1 >= FT(0))?2:3);  int quadrant_2 = (dx2 >= FT(0)) ? ((dy2 >= FT(0))?1:4)                                  : ((dy2 >= FT(0))?2:3);  // We can't use CGAL_NTS compare(quadrant_1,quadrant_2) because in case  // of tie, we need additional computation  if (quadrant_1 > quadrant_2)    return LARGER;  else if (quadrant_1 < quadrant_2)    return SMALLER;  return Comparison_result(-sign_of_determinant2x2(dx1,dy1,dx2,dy2));}template < class FT >CGAL_KERNEL_MEDIUM_INLINEComparison_resultcompare_slopesC2(const FT &l1a, const FT &l1b, const FT &l2a, const FT &l2b) {   if (l1a == FT(0))  // l1 is horizontal    return l2b == FT(0) ? SMALLER	                : Comparison_result(CGAL_NTS sign<FT>(l2a*l2b));   if (l2a == FT(0)) // l2 is horizontal    return l1b == FT(0) ? LARGER	                : Comparison_result(-CGAL_NTS sign<FT>(l1a*l1b));   if (l1b == FT(0)) return l2b == FT(0) ? EQUAL : LARGER;   if (l2b == FT(0)) return SMALLER;   int l1_sign = CGAL_NTS sign<FT>(-l1a * l1b);   int l2_sign = CGAL_NTS sign<FT>(-l2a * l2b);

⌨️ 快捷键说明

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