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 5 // 6 // This file is part of Open CASCADE Technology software library. 7 // 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. 13 // 14 // Alternatively, this file may be used under the terms of Open CASCADE 15 // commercial license or contractual agreement. 16 17 #ifndef _ElSLib_HeaderFile 18 #define _ElSLib_HeaderFile 19 20 #include <Standard.hxx> 21 #include <Standard_DefineAlloc.hxx> 22 #include <Standard_Handle.hxx> 23 24 #include <Standard_Real.hxx> 25 #include <gp_Pnt.hxx> 26 #include <Standard_Integer.hxx> 27 #include <gp_Vec.hxx> 28 class gp_Pnt; 29 class gp_Pln; 30 class gp_Cone; 31 class gp_Cylinder; 32 class gp_Sphere; 33 class gp_Torus; 34 class gp_Vec; 35 class gp_Ax3; 36 class gp_Lin; 37 class gp_Circ; 38 39 40 //! Provides functions for basic geometric computation on 41 //! elementary surfaces. 42 //! This includes: 43 //! - calculation of a point or derived vector on a surface 44 //! where the surface is provided by the gp package, or 45 //! defined in canonical form (as in the gp package), and 46 //! the point is defined with a parameter, 47 //! - evaluation of the parameters corresponding to a 48 //! point on an elementary surface from gp, 49 //! - calculation of isoparametric curves on an elementary 50 //! surface defined in canonical form (as in the gp package). 51 //! Notes: 52 //! - ElSLib stands for Elementary Surfaces Library. 53 //! - If the surfaces provided by the gp package are not 54 //! explicitly parameterized, they still have an implicit 55 //! parameterization, similar to that which they infer on 56 //! the equivalent Geom surfaces. 57 //! Note: ElSLib stands for Elementary Surfaces Library. 58 class ElSLib 59 { 60 public: 61 62 DEFINE_STANDARD_ALLOC 63 64 65 //! For elementary surfaces from the gp package (planes, 66 //! cones, cylinders, spheres and tori), computes the point 67 //! of parameters (U, V). 68 static gp_Pnt Value (const Standard_Real U, const Standard_Real V, const gp_Pln& Pl); 69 70 static gp_Pnt Value (const Standard_Real U, const Standard_Real V, const gp_Cone& C); 71 72 static gp_Pnt Value (const Standard_Real U, const Standard_Real V, const gp_Cylinder& C); 73 74 static gp_Pnt Value (const Standard_Real U, const Standard_Real V, const gp_Sphere& S); 75 76 static gp_Pnt Value (const Standard_Real U, const Standard_Real V, const gp_Torus& T); 77 78 //! For elementary surfaces from the gp package (planes, 79 //! cones, cylinders, spheres and tori), computes the 80 //! derivative vector of order Nu and Nv in the u and v 81 //! parametric directions respectively, at the point of 82 //! parameters (U, V). 83 static gp_Vec DN (const Standard_Real U, const Standard_Real V, const gp_Pln& Pl, const Standard_Integer Nu, const Standard_Integer Nv); 84 85 static gp_Vec DN (const Standard_Real U, const Standard_Real V, const gp_Cone& C, const Standard_Integer Nu, const Standard_Integer Nv); 86 87 static gp_Vec DN (const Standard_Real U, const Standard_Real V, const gp_Cylinder& C, const Standard_Integer Nu, const Standard_Integer Nv); 88 89 static gp_Vec DN (const Standard_Real U, const Standard_Real V, const gp_Sphere& S, const Standard_Integer Nu, const Standard_Integer Nv); 90 91 static gp_Vec DN (const Standard_Real U, const Standard_Real V, const gp_Torus& T, const Standard_Integer Nu, const Standard_Integer Nv); 92 93 //! For elementary surfaces from the gp package (planes, 94 //! cones, cylinders, spheres and tori), computes the point P 95 //! of parameters (U, V).inline 96 static void D0 (const Standard_Real U, const Standard_Real V, const gp_Pln& Pl, gp_Pnt& P); 97 98 static void D0 (const Standard_Real U, const Standard_Real V, const gp_Cone& C, gp_Pnt& P); 99 100 static void D0 (const Standard_Real U, const Standard_Real V, const gp_Cylinder& C, gp_Pnt& P); 101 102 static void D0 (const Standard_Real U, const Standard_Real V, const gp_Sphere& S, gp_Pnt& P); 103 104 static void D0 (const Standard_Real U, const Standard_Real V, const gp_Torus& T, gp_Pnt& P); 105 106 107 //! For elementary surfaces from the gp package (planes, 108 //! cones, cylinders, spheres and tori), computes: 109 //! - the point P of parameters (U, V), and 110 //! - the first derivative vectors Vu and Vv at this point in 111 //! the u and v parametric directions respectively. 112 static void D1 (const Standard_Real U, const Standard_Real V, const gp_Pln& Pl, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 113 114 static void D1 (const Standard_Real U, const Standard_Real V, const gp_Cone& C, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 115 116 static void D1 (const Standard_Real U, const Standard_Real V, const gp_Cylinder& C, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 117 118 static void D1 (const Standard_Real U, const Standard_Real V, const gp_Sphere& S, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 119 120 static void D1 (const Standard_Real U, const Standard_Real V, const gp_Torus& T, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 121 122 123 //! For elementary surfaces from the gp package (cones, 124 //! cylinders, spheres and tori), computes: 125 //! - the point P of parameters (U, V), and 126 //! - the first derivative vectors Vu and Vv at this point in 127 //! the u and v parametric directions respectively, and 128 //! - the second derivative vectors Vuu, Vvv and Vuv at this point. 129 static void D2 (const Standard_Real U, const Standard_Real V, const gp_Cone& C, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 130 131 static void D2 (const Standard_Real U, const Standard_Real V, const gp_Cylinder& C, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 132 133 static void D2 (const Standard_Real U, const Standard_Real V, const gp_Sphere& S, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 134 135 static void D2 (const Standard_Real U, const Standard_Real V, const gp_Torus& T, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 136 137 138 //! For elementary surfaces from the gp package (cones, 139 //! cylinders, spheres and tori), computes: 140 //! - the point P of parameters (U,V), and 141 //! - the first derivative vectors Vu and Vv at this point in 142 //! the u and v parametric directions respectively, and 143 //! - the second derivative vectors Vuu, Vvv and Vuv at 144 //! this point, and 145 //! - the third derivative vectors Vuuu, Vvvv, Vuuv and 146 //! Vuvv at this point. 147 static void D3 (const Standard_Real U, const Standard_Real V, const gp_Cone& C, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 148 149 static void D3 (const Standard_Real U, const Standard_Real V, const gp_Cylinder& C, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 150 151 static void D3 (const Standard_Real U, const Standard_Real V, const gp_Sphere& S, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 152 153 //! Surface evaluation 154 //! The following functions compute the point and the 155 //! derivatives on elementary surfaces defined with their 156 //! geometric characteristics. 157 //! You don't need to create the surface to use these functions. 158 //! These functions are called by the previous ones. 159 //! Example : 160 //! A cylinder is defined with its position and its radius. 161 static void D3 (const Standard_Real U, const Standard_Real V, const gp_Torus& T, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 162 163 Standard_EXPORT static gp_Pnt PlaneValue (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos); 164 165 Standard_EXPORT static gp_Pnt CylinderValue (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius); 166 167 Standard_EXPORT static gp_Pnt ConeValue (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle); 168 169 Standard_EXPORT static gp_Pnt SphereValue (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius); 170 171 Standard_EXPORT static gp_Pnt TorusValue (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius); 172 173 Standard_EXPORT static gp_Vec PlaneDN (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Integer Nu, const Standard_Integer Nv); 174 175 Standard_EXPORT static gp_Vec CylinderDN (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Integer Nu, const Standard_Integer Nv); 176 177 Standard_EXPORT static gp_Vec ConeDN (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, const Standard_Integer Nu, const Standard_Integer Nv); 178 179 Standard_EXPORT static gp_Vec SphereDN (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Integer Nu, const Standard_Integer Nv); 180 181 Standard_EXPORT static gp_Vec TorusDN (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, const Standard_Integer Nu, const Standard_Integer Nv); 182 183 Standard_EXPORT static void PlaneD0 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, gp_Pnt& P); 184 185 Standard_EXPORT static void ConeD0 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, gp_Pnt& P); 186 187 Standard_EXPORT static void CylinderD0 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P); 188 189 Standard_EXPORT static void SphereD0 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P); 190 191 Standard_EXPORT static void TorusD0 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, gp_Pnt& P); 192 193 Standard_EXPORT static void PlaneD1 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 194 195 Standard_EXPORT static void ConeD1 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 196 197 Standard_EXPORT static void CylinderD1 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 198 199 Standard_EXPORT static void SphereD1 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 200 201 Standard_EXPORT static void TorusD1 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv); 202 203 Standard_EXPORT static void ConeD2 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 204 205 Standard_EXPORT static void CylinderD2 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 206 207 Standard_EXPORT static void SphereD2 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 208 209 Standard_EXPORT static void TorusD2 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv); 210 211 Standard_EXPORT static void ConeD3 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 212 213 Standard_EXPORT static void CylinderD3 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 214 215 Standard_EXPORT static void SphereD3 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real Radius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 216 217 218 //! The following functions compute the parametric values 219 //! corresponding to a given point on a elementary surface. 220 //! The point should be on the surface. 221 Standard_EXPORT static void TorusD3 (const Standard_Real U, const Standard_Real V, const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, gp_Pnt& P, gp_Vec& Vu, gp_Vec& Vv, gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv, gp_Vec& Vuuu, gp_Vec& Vvvv, gp_Vec& Vuuv, gp_Vec& Vuvv); 222 223 //! parametrization 224 //! P (U, V) = 225 //! Pl.Location() + U * Pl.XDirection() + V * Pl.YDirection() 226 static void Parameters (const gp_Pln& Pl, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 227 228 //! parametrization 229 //! P (U, V) = Location + V * ZDirection + 230 //! Radius * (Cos(U) * XDirection + Sin (U) * YDirection) 231 static void Parameters (const gp_Cylinder& C, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 232 233 //! parametrization 234 //! P (U, V) = Location + V * ZDirection + 235 //! (Radius + V * Tan (SemiAngle)) * 236 //! (Cos(U) * XDirection + Sin(U) * YDirection) 237 static void Parameters (const gp_Cone& C, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 238 239 //! parametrization 240 //! P (U, V) = Location + 241 //! Radius * Cos (V) * (Cos (U) * XDirection + Sin (U) * YDirection) + 242 //! Radius * Sin (V) * ZDirection 243 static void Parameters (const gp_Sphere& S, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 244 245 //! parametrization 246 //! P (U, V) = Location + 247 //! (MajorRadius + MinorRadius * Cos(U)) * 248 //! (Cos(V) * XDirection - Sin(V) * YDirection) + 249 //! MinorRadius * Sin(U) * ZDirection 250 static void Parameters (const gp_Torus& T, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 251 252 //! parametrization 253 //! P (U, V) = 254 //! Pl.Location() + U * Pl.XDirection() + V * Pl.YDirection() 255 Standard_EXPORT static void PlaneParameters (const gp_Ax3& Pos, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 256 257 //! parametrization 258 //! P (U, V) = Location + V * ZDirection + 259 //! Radius * (Cos(U) * XDirection + Sin (U) * YDirection) 260 Standard_EXPORT static void CylinderParameters (const gp_Ax3& Pos, const Standard_Real Radius, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 261 262 //! parametrization 263 //! P (U, V) = Location + V * ZDirection + 264 //! (Radius + V * Tan (SemiAngle)) * 265 //! (Cos(U) * XDirection + Sin(U) * YDirection) 266 Standard_EXPORT static void ConeParameters (const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 267 268 //! parametrization 269 //! P (U, V) = Location + 270 //! Radius * Cos (V) * (Cos (U) * XDirection + Sin (U) * YDirection) + 271 //! Radius * Sin (V) * ZDirection 272 Standard_EXPORT static void SphereParameters (const gp_Ax3& Pos, const Standard_Real Radius, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 273 274 //! parametrization 275 //! P (U, V) = Location + 276 //! (MajorRadius + MinorRadius * Cos(U)) * 277 //! (Cos(V) * XDirection - Sin(V) * YDirection) + 278 //! MinorRadius * Sin(U) * ZDirection 279 Standard_EXPORT static void TorusParameters (const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, const gp_Pnt& P, Standard_Real& U, Standard_Real& V); 280 281 //! compute the U Isoparametric gp_Lin of the plane. 282 Standard_EXPORT static gp_Lin PlaneUIso (const gp_Ax3& Pos, const Standard_Real U); 283 284 //! compute the U Isoparametric gp_Lin of the cylinder. 285 Standard_EXPORT static gp_Lin CylinderUIso (const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real U); 286 287 //! compute the U Isoparametric gp_Lin of the cone. 288 Standard_EXPORT static gp_Lin ConeUIso (const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, const Standard_Real U); 289 290 //! compute the U Isoparametric gp_Circ of the sphere, 291 //! (the meridian is not trimmed). 292 Standard_EXPORT static gp_Circ SphereUIso (const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real U); 293 294 //! compute the U Isoparametric gp_Circ of the torus. 295 Standard_EXPORT static gp_Circ TorusUIso (const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, const Standard_Real U); 296 297 //! compute the V Isoparametric gp_Lin of the plane. 298 Standard_EXPORT static gp_Lin PlaneVIso (const gp_Ax3& Pos, const Standard_Real V); 299 300 //! compute the V Isoparametric gp_Circ of the cylinder. 301 Standard_EXPORT static gp_Circ CylinderVIso (const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real V); 302 303 //! compute the V Isoparametric gp_Circ of the cone. 304 Standard_EXPORT static gp_Circ ConeVIso (const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real SAngle, const Standard_Real V); 305 306 //! compute the V Isoparametric gp_Circ of the sphere, 307 //! (the meridian is not trimmed). 308 Standard_EXPORT static gp_Circ SphereVIso (const gp_Ax3& Pos, const Standard_Real Radius, const Standard_Real V); 309 310 //! compute the V Isoparametric gp_Circ of the torus. 311 Standard_EXPORT static gp_Circ TorusVIso (const gp_Ax3& Pos, const Standard_Real MajorRadius, const Standard_Real MinorRadius, const Standard_Real V); 312 313 314 315 316 protected: 317 318 319 320 321 322 private: 323 324 325 326 327 328 }; 329 330 331 #include <ElSLib.lxx> 332 333 334 335 336 337 #endif // _ElSLib_HeaderFile 338