// Created on: 2003-03-18 // Created by: Oleg FEDYAEV // Copyright (c) 2003-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // The functions Parameter(s) are used to compute parameter(s) of point // on curves and surfaces. The main rule is that tested point must lied // on curves or surfaces otherwise the resulted parameter(s) may be wrong. // To make search process more common the MaxDist value is used to define // the proximity of point to curve or surface. It is clear that this MaxDist // value can't be too high to be not in conflict with previous rule. static const Standard_Real PARTOLERANCE = 1.e-9; //======================================================================= //function : Parameter //purpose : Get parameter on curve of given point // return FALSE if point is far from curve than MaxDist // or computation fails //======================================================================= Standard_Boolean GeomLib_Tool::Parameter(const Handle(Geom_Curve)& Curve, const gp_Pnt& Point, const Standard_Real MaxDist, Standard_Real& U) { if( Curve.IsNull() ) return Standard_False; // U = 0.; Standard_Real aTol = MaxDist * MaxDist; // GeomAdaptor_Curve aGAC(Curve); Extrema_ExtPC extrema(Point,aGAC); // if( !extrema.IsDone() ) return Standard_False; // Standard_Integer n = extrema.NbExt(); if( n <= 0 ) return Standard_False; // Standard_Integer i = 0, iMin = 0; Standard_Real Dist2Min = RealLast(); for( i = 1; i <= n; i++ ) { if (extrema.SquareDistance(i) < Dist2Min) { iMin = i; Dist2Min = extrema.SquareDistance(i); } } if( iMin != 0 && Dist2Min <= aTol ) { U = (extrema.Point(iMin)).Parameter(); } else { return Standard_False; } return Standard_True; } //======================================================================= //function : Parameters //purpose : Get parameters on surface of given point // return FALSE if point is far from surface than MaxDist // or computation fails //======================================================================= Standard_Boolean GeomLib_Tool::Parameters(const Handle(Geom_Surface)& Surface, const gp_Pnt& Point, const Standard_Real MaxDist, Standard_Real& U, Standard_Real& V) { if( Surface.IsNull() ) return Standard_False; // U = 0.; V = 0.; Standard_Real aTol = MaxDist * MaxDist; // GeomAdaptor_Surface aGAS(Surface); Standard_Real aTolU = PARTOLERANCE, aTolV = PARTOLERANCE; // Extrema_ExtPS extrema(Point,aGAS,aTolU,aTolV); // if( !extrema.IsDone() ) return Standard_False; // Standard_Integer n = extrema.NbExt(); if( n <= 0 ) return Standard_False; // Standard_Real Dist2Min = RealLast(); Standard_Integer i = 0, iMin = 0; for( i = 1; i <= n; i++ ) { if( extrema.SquareDistance(i) < Dist2Min ) { Dist2Min = extrema.SquareDistance(i); iMin = i; } } if( iMin != 0 && Dist2Min <= aTol) { extrema.Point(iMin).Parameter(U,V); } else { return Standard_False; } return Standard_True; } //======================================================================= //function : Parameter //purpose : Get parameter on curve of given point // return FALSE if point is far from curve than MaxDist // or computation fails //======================================================================= Standard_Boolean GeomLib_Tool::Parameter(const Handle(Geom2d_Curve)& Curve, const gp_Pnt2d& Point, const Standard_Real MaxDist, Standard_Real& U) { if( Curve.IsNull() ) return Standard_False; // U = 0.; Standard_Real aTol = MaxDist * MaxDist; // Geom2dAdaptor_Curve aGAC(Curve); Extrema_ExtPC2d extrema(Point,aGAC); if( !extrema.IsDone() ) return Standard_False; Standard_Integer n = extrema.NbExt(); if( n <= 0 ) return Standard_False; Standard_Integer i = 0, iMin = 0; Standard_Real Dist2Min = RealLast(); for ( i = 1; i <= n; i++ ) { if( extrema.SquareDistance(i) < Dist2Min ) { Dist2Min = extrema.SquareDistance(i); iMin = i; } } if( iMin != 0 && Dist2Min <= aTol ) { U = (extrema.Point(iMin)).Parameter(); } else { return Standard_False; } return Standard_True; }