1 -- Created on: 1991-09-09
2 -- Created by: Michel Chauvat
3 -- Copyright (c) 1991-1999 Matra Datavision
4 -- Copyright (c) 1999-2014 OPEN CASCADE SAS
6 -- This file is part of Open CASCADE Technology software library.
8 -- This library is free software; you can redistribute it and/or modify it under
9 -- the terms of the GNU Lesser General Public License version 2.1 as published
10 -- by the Free Software Foundation, with special exception defined in the file
11 -- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 -- distribution for complete text of the license and disclaimer of any warranty.
14 -- Alternatively, this file may be used under the terms of Open CASCADE
15 -- commercial license or contractual agreement.
24 ---Purpose: This package implements functions for basis geometric
25 -- computation on curves and surfaces.
26 -- The tolerance criterions used in this package are
27 -- Resolution from package gp and RealEpsilon from class
28 -- Real of package Standard.
38 enumeration DerivativeStatus is
39 Done, D1uIsNull, D1vIsNull, D1IsNull, D1uD1vRatioIsNull,
40 D1vD1uRatioIsNull, D1uIsParallelD1v;
44 -- D1uIsNull : ||D1U|| <= Resolution
46 -- D1vIsNull : ||D1V|| <= Resolution
48 -- D1IsNull : the first derivatives in the U and V parametric
49 -- directions have null length :
50 -- ||D1U|| <= Resolution and ||D1V|| <= Resolution
52 -- D1uD1vRatioIsNull : the first derivative in the U direction has
53 -- null length by comparison with the derivative
55 -- ||D1U|| / ||D1V|| <= RealEpsilon
57 -- D1vD1uRatioIsNull : the first derivative in the V direction has
58 -- null length by comparison with the derivative
60 -- ||D1V|| / ||D1U|| <= RealEpsilon
62 -- D1uIsParallelD1v : the angle between the derivatives in the U and
63 -- V direction is null (tolerance criterion given
67 enumeration NormalStatus is
68 Singular,Defined,InfinityOfSolutions, D1NuIsNull, D1NvIsNull, D1NIsNull,
69 D1NuNvRatioIsNull, D1NvNuRatioIsNull, D1NuIsParallelD1Nv;
75 -- InfinityOfSolutions : ||DN/du||>Resolution, ||DN/dv||>Resolution
77 -- D1NuIsNull : ||DN/du|| <= Resolution
79 -- D1NvIsNull : ||DN/dv|| <= Resolution
81 -- D1NIsNull : ||DN/du||<=Resolution, ||DN/dv||<=Resolution
83 -- D1NuNvRatioIsNull : ||D1Nu|| / ||D1Nv|| <= RealEpsilon
85 -- D1NvNuRatioIsNull : ||D1Nu|| / ||D1Nv|| <= RealEpsilon
87 -- D1NuIsParallelD1Nv : The angle between D1Nu and D1Nv is Null.
92 -- *** Class2d : Low level algorithm for 2d classification
93 -- this class was moved from package BRepTopAdaptor
100 -- The following functions computes the normal to a surface
102 private class NormalPolyDef;
104 -- The following functions computes the normal to a surface
105 -- inherits FunctionWithDerivative from math
107 Normal (D1U, D1V: Vec from gp; SinTol: Real;
108 Status: out DerivativeStatus;
109 Normal: out Dir from gp);
112 -- Computes the normal direction of a surface as the cross product
113 -- between D1U and D1V.
114 -- If D1U has null length or D1V has null length or D1U and D1V are
115 -- parallel the normal is undefined.
116 -- To check that D1U and D1V are colinear the sinus of the angle
117 -- between D1U and D1V is computed and compared with SinTol.
118 -- The normal is computed if Status == Done else the Status gives the
119 -- reason why the computation has failed.
123 Normal (D1U, D1V, D2U, D2V, D2UV: Vec from gp; SinTol: Real;
124 Done : out Boolean; Status : out NormalStatus;
125 Normal: out Dir from gp);
127 -- If there is a singularity on the surface the previous method
128 -- cannot compute the local normal.
129 -- This method computes an approched normal direction of a surface.
130 -- It does a limited development and needs the second derivatives
131 -- on the surface as input data.
132 -- It computes the normal as follow :
133 -- N(u, v) = D1U ^ D1V
134 -- N(u0+du,v0+dv) = N0 + DN/du(u0,v0) * du + DN/dv(u0,v0) * dv + Eps
135 -- with Eps->0 so we can have the equivalence N ~ dN/du + dN/dv.
136 -- DNu = ||DN/du|| and DNv = ||DN/dv||
138 -- . if DNu IsNull (DNu <= Resolution from gp) the answer Done = True
139 -- the normal direction is given by DN/dv
140 -- . if DNv IsNull (DNv <= Resolution from gp) the answer Done = True
141 -- the normal direction is given by DN/du
142 -- . if the two directions DN/du and DN/dv are parallel Done = True
143 -- the normal direction is given either by DN/du or DN/dv.
144 -- To check that the two directions are colinear the sinus of the
145 -- angle between these directions is computed and compared with
147 -- . if DNu/DNv or DNv/DNu is lower or equal than Real Epsilon
148 -- Done = False, the normal is undefined
149 -- . if DNu IsNull and DNv is Null Done = False, there is an
150 -- indetermination and we should do a limited developpement at
151 -- order 2 (it means that we cannot omit Eps).
152 -- . if DNu Is not Null and DNv Is not Null Done = False, there are
153 -- an infinity of normals at the considered point on the surface.
155 Normal (D1U, D1V: Vec from gp; MagTol: Real;
156 Status: out NormalStatus;
157 Normal: out Dir from gp);
160 -- Computes the normal direction of a surface as the cross product
161 -- between D1U and D1V.
163 Normal (MaxOrder : Integer ; DerNUV : Array2OfVec from TColgp; MagTol: Real;
164 U , V , Umin , Umax , Vmin , Vmax : Real; Status: out NormalStatus;
165 Normal : out Dir from gp; OrderU , OrderV : out Integer);
166 --- Purpose : find the first order k0 of deriviative of NUV
167 -- where: foreach order < k0 all the derivatives of NUV are
168 -- null all the derivatives of NUV corresponding to the order
169 -- k0 are collinear and have the same sens.
170 -- In this case, normal at U,V is unique.
172 DNNUV ( Nu , Nv : Integer; DerSurf : Array2OfVec from TColgp )
174 ---Purpose : -- Computes the derivative of order Nu in the --
175 -- direction U and Nv in the direction V of the not --
176 -- normalized normal vector at the point P(U,V) The
177 -- array DerSurf contain the derivative (i,j) of the surface
178 -- for i=0,Nu+1 ; j=0,Nv+1
181 DNNUV (Nu,Nv : Integer ; DerSurf1 : Array2OfVec from TColgp;
182 DerSurf2 : Array2OfVec from TColgp )
184 ---Purpose : Computes the derivatives of order Nu in the direction Nu
185 -- and Nv in the direction Nv of the not normalized vector
186 -- N(u,v) = dS1/du * dS2/dv (cases where we use an osculating surface)
187 -- DerSurf1 are the derivatives of S1
189 DNNormal( Nu , Nv : Integer; DerNUV : Array2OfVec from TColgp ;
190 Iduref : Integer = 0; Idvref : Integer = 0 )
192 ---Purpose : -- Computes the derivative of order Nu in the --
193 -- direction U and Nv in the direction V of the
194 -- normalized normal vector at the point P(U,V) array
195 -- DerNUV contain the derivative (i+Iduref,j+Idvref)
196 -- of D1U ^ D1V for i=0,Nu ; j=0,Nv Iduref and Idvref
197 -- correspond to a derivative of D1U ^ D1V which can
198 -- be used to compute the normalized normal vector.
199 -- In the regular cases , Iduref=Idvref=0.