1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-09 18:50:54 +03:00
occt/src/BRepGProp/BRepGProp_Gauss.hxx
abv c04c30b3ee 0024023: Revamp the OCCT Handle -- general
Missing headers added; includes of headers "Handle_...hxx" removed.

Misuses of macro Handle() and its use in typedefs corrected.

Alias classes Profile and Option are removed from IFSelect; ones defined in MoniTool are used directly.

Removed header files defining only Handle classes (except Image_PixMap_Handle.hxx)

Classes SelectMgr_BaseFrustum and now inherit Standard_Transient and can be manipulated by Handle (not NCollection_Handle)

Fixed reference-type local variable pointing to temporary object

Use of handle in conditional expressions and comparisons to NULL are replaced by call to method IsNull()
2015-07-11 12:08:02 +03:00

283 lines
12 KiB
C++

// Copyright (c) 2015 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.
#ifndef _BRepGProp_Gauss_HeaderFile
#define _BRepGProp_Gauss_HeaderFile
#include <NCollection_Handle.hxx>
#include <NCollection_Array1.hxx>
class math_Vector;
//! Class performs computing of the global inertia properties
//! of geometric object in 3D space by adaptive and non-adaptive
//! 2D Gauss integration algorithms.
class BRepGProp_Gauss
{
//! Auxiliary structure for storing of inertial moments.
struct Inertia
{
//! Mass of the current system (without density).
//! May correspond to: length, area, volume.
Standard_Real Mass;
//! Static moments of inertia.
Standard_Real Ix;
Standard_Real Iy;
Standard_Real Iz;
//! Quadratic moments of inertia.
Standard_Real Ixx;
Standard_Real Iyy;
Standard_Real Izz;
Standard_Real Ixy;
Standard_Real Ixz;
Standard_Real Iyz;
//! Default constructor.
Inertia();
//! Zeroes all values.
void Reset();
};
typedef NCollection_Handle< NCollection_Array1<Inertia> > InertiaArray;
typedef Standard_Real(*BRepGProp_GaussFunc)(const Standard_Real, const Standard_Real);
public: //! @name public API
//! Describes types of geometric objects.
//! - Vinert is 3D closed region of space delimited with:
//! -- Surface;
//! -- Point and Surface;
//! -- Plane and Surface.
//! - Sinert is face in 3D space.
typedef enum { Vinert = 0, Sinert } BRepGProp_GaussType;
//! Constructor
Standard_EXPORT explicit BRepGProp_Gauss(const BRepGProp_GaussType theType);
//! Computes the global properties of a solid region of 3D space which can be
//! delimited by the surface and point or surface and plane. Surface can be closed.
//! The method is quick and its precision is enough for many cases of analytical surfaces.
//! Non-adaptive 2D Gauss integration with predefined numbers of Gauss points
//! is used. Numbers of points depend on types of surfaces and curves.
//! Error of the computation is not calculated.
//! @param theSurface - bounding surface of the region;
//! @param theLocation - location of the point or the plane;
//! @param theCoeff - plane coefficients;
//! @param theIsByPoint - flag of restricition (point/plane);
//! @param theOutMass[out] - mass (volume) of region;
//! @param theOutGravityCenter[out] - garvity center of region;
//! @param theOutInertia[out] - matrix of inertia;
Standard_EXPORT void Compute(
const BRepGProp_Face& theSurface,
const gp_Pnt& theLocation,
const Standard_Real theCoeff[],
const Standard_Boolean theIsByPoint,
Standard_Real& theOutMass,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutInertia);
//! Computes the global properties of a surface. Surface can be closed.
//! The method is quick and its precision is enough for many cases of analytical surfaces.
//! Non-adaptive 2D Gauss integration with predefined numbers of Gauss points
//! is used. Numbers of points depend on types of surfaces and curves.
//! Error of the computation is not calculated.
//! @param theSurface - bounding surface of the region;
//! @param theLocation - surface location;
//! @param theOutMass[out] - mass (volume) of region;
//! @param theOutGravityCenter[out] - garvity center of region;
//! @param theOutInertia[out] - matrix of inertia;
Standard_EXPORT void Compute(
const BRepGProp_Face& theSurface,
const gp_Pnt& theLocation,
Standard_Real& theOutMass,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutInertia);
//! Computes the global properties of a region of 3D space which can be
//! delimited by the surface and point or surface and plane. Surface can be closed.
//! The method is quick and its precision is enough for many cases of analytical surfaces.
//! Non-adaptive 2D Gauss integration with predefined numbers of Gauss points is used.
//! Numbers of points depend on types of surfaces and curves.
//! Error of the computation is not calculated.
//! @param theSurface - bounding surface of the region;
//! @param theDomain - surface boundings;
//! @param theLocation - location of the point or the plane;
//! @param theCoeff - plane coefficients;
//! @param theIsByPoint - flag of restricition (point/plane);
//! @param theOutMass[out] - mass (volume) of region;
//! @param theOutGravityCenter[out] - garvity center of region;
//! @param theOutInertia[out] - matrix of inertia;
Standard_EXPORT void Compute(
BRepGProp_Face& theSurface,
BRepGProp_Domain& theDomain,
const gp_Pnt& theLocation,
const Standard_Real theCoeff[],
const Standard_Boolean theIsByPoint,
Standard_Real& theOutMass,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutInertia);
//! Computes the global properties of a surface. Surface can be closed.
//! The method is quick and its precision is enough for many cases of analytical surfaces.
//! Non-adaptive 2D Gauss integration with predefined numbers of Gauss points
//! is used. Numbers of points depend on types of surfaces and curves.
//! Error of the computation is not calculated.
//! @param theSurface - bounding surface of the region;
//! @param theDomain - surface boundings;
//! @param theLocation - surface location;
//! @param theOutMass[out] - mass (volume) of region;
//! @param theOutGravityCenter[out] - garvity center of region;
//! @param theOutInertia[out] - matrix of inertia;
Standard_EXPORT void Compute(
BRepGProp_Face& theSurface,
BRepGProp_Domain& theDomain,
const gp_Pnt& theLocation,
Standard_Real& theOutMass,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutInertia);
//! Computes the global properties of the region of 3D space which can be
//! delimited by the surface and point or surface and plane.
//! Adaptive 2D Gauss integration is used.
//! If Epsilon more than 0.001 then algorithm performs non-adaptive integration.
//! @param theSurface - bounding surface of the region;
//! @param theDomain - surface boundings;
//! @param theLocation - location of the point or the plane;
//! @param theEps - maximal relative error of computed mass (volume) for face;
//! @param theCoeff - plane coefficients;
//! @param theIsByPoint - flag of restricition (point/plane);
//! @param theOutMass[out] - mass (volume) of region;
//! @param theOutGravityCenter[out] - garvity center of region;
//! @param theOutInertia[out] - matrix of inertia;
//! @return value of error which is calculated as
//! Abs((M(i+1)-M(i))/M(i+1)), M(i+1) and M(i) are values
//! for two successive steps of adaptive integration.
Standard_EXPORT Standard_Real Compute(
BRepGProp_Face& theSurface,
BRepGProp_Domain& theDomain,
const gp_Pnt& theLocation,
const Standard_Real theEps,
const Standard_Real theCoeff[],
const Standard_Boolean theByPoint,
Standard_Real& theOutMass,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutInertia);
//! Computes the global properties of the face. Adaptive 2D Gauss integration is used.
//! If Epsilon more than 0.001 then algorithm performs non-adaptive integration.
//! @param theSurface - bounding surface of the region;
//! @param theDomain - surface boundings;
//! @param theLocation - surface location;
//! @param theEps - maximal relative error of computed mass (square) for face;
//! @param theOutMass[out] - mass (volume) of region;
//! @param theOutGravityCenter[out] - garvity center of region;
//! @param theOutInertia[out] - matrix of inertia;
//! @return value of error which is calculated as
//! Abs((M(i+1)-M(i))/M(i+1)), M(i+1) and M(i) are values
//! for two successive steps of adaptive integration.
Standard_EXPORT Standard_Real Compute(
BRepGProp_Face& theSurface,
BRepGProp_Domain& theDomain,
const gp_Pnt& theLocation,
const Standard_Real theEps,
Standard_Real& theOutMass,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutInertia);
private: //! @name private methods
BRepGProp_Gauss(BRepGProp_Gauss const&);
BRepGProp_Gauss& operator= (BRepGProp_Gauss const&);
void computeVInertiaOfElementaryPart(
const gp_Pnt& thePoint,
const gp_Vec& theNormal,
const gp_Pnt& theLocation,
const Standard_Real theWeight,
const Standard_Real theCoeff[],
const Standard_Boolean theIsByPoint,
BRepGProp_Gauss::Inertia& theOutInertia);
void computeSInertiaOfElementaryPart(
const gp_Pnt& thePoint,
const gp_Vec& theNormal,
const gp_Pnt& theLocation,
const Standard_Real theWeight,
BRepGProp_Gauss::Inertia& theOutInertia);
void checkBounds(
const Standard_Real theU1,
const Standard_Real theU2,
const Standard_Real theV1,
const Standard_Real theV2);
void addAndRestoreInertia(
const BRepGProp_Gauss::Inertia& theInInertia,
BRepGProp_Gauss::Inertia& theOutInertia);
void multAndRestoreInertia(
const Standard_Real theValue,
BRepGProp_Gauss::Inertia& theInertia);
void convert(
const BRepGProp_Gauss::Inertia& theInertia,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutMatrixOfInertia,
Standard_Real& theOutMass);
void convert(
const BRepGProp_Gauss::Inertia& theInertia,
const Standard_Real theCoeff[],
const Standard_Boolean theIsByPoint,
gp_Pnt& theOutGravityCenter,
gp_Mat& theOutMatrixOfInertia,
Standard_Real& theOutMass);
static Standard_Integer MaxSubs(
const Standard_Integer theN,
const Standard_Integer theCoeff = 32);
static void Init(
NCollection_Handle<math_Vector>& theOutVec,
const Standard_Real theValue,
const Standard_Integer theFirst = 0,
const Standard_Integer theLast = 0);
static void InitMass(
const Standard_Real theValue,
const Standard_Integer theFirst,
const Standard_Integer theLast,
InertiaArray& theArray);
static Standard_Integer FillIntervalBounds(
const Standard_Real theA,
const Standard_Real theB,
const TColStd_Array1OfReal& theKnots,
const Standard_Integer theNumSubs,
InertiaArray& theInerts,
NCollection_Handle<math_Vector>& theParam1,
NCollection_Handle<math_Vector>& theParam2,
NCollection_Handle<math_Vector>& theError,
NCollection_Handle<math_Vector>& theCommonError);
private: //! @name private fields
BRepGProp_GaussType myType; //!< Type of geometric object
BRepGProp_GaussFunc add; //!< Pointer on the add function
BRepGProp_GaussFunc mult; //!< Pointer on the mult function
};
#endif