1 // Created on: 2008-09-01
2 // Created by: Vladislav ROMASHKO
3 // Copyright (c) 2008-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #ifndef _Voxel_ROctBoolDS_HeaderFile
17 #define _Voxel_ROctBoolDS_HeaderFile
19 #include <Standard.hxx>
20 #include <Standard_DefineAlloc.hxx>
21 #include <Standard_Handle.hxx>
23 #include <Voxel_DS.hxx>
24 #include <Standard_Real.hxx>
25 #include <Standard_Integer.hxx>
26 #include <Standard_Boolean.hxx>
29 //! A 3D voxel model keeping a boolean flag (1 or 0)
30 //! value for each voxel, and having an opportunity to split each voxel
31 //! into 8 sub-voxels recursively.
32 class Voxel_ROctBoolDS : public Voxel_DS
39 //! An empty constructor.
40 Standard_EXPORT Voxel_ROctBoolDS();
42 //! A constructor initializing the voxel model.
43 //! (x, y, z) - the start point of the box.
44 //! (x_len, y_len, z_len) - lengths in x, y and z directions along axes of a co-ordinate system.
45 //! (nb_x, nb_y, nb_z) - number of splits (voxels) along x, y and z directions.
46 Standard_EXPORT Voxel_ROctBoolDS(const Standard_Real x, const Standard_Real y, const Standard_Real z, const Standard_Real x_len, const Standard_Real y_len, const Standard_Real z_len, const Standard_Integer nb_x, const Standard_Integer nb_y, const Standard_Integer nb_z);
48 //! Initialization of the voxel model.
49 //! (x, y, z) - the start point of the box.
50 //! (x_len, y_len, z_len) - lengths in x, y and z directions along axes of a co-ordinate system.
51 //! (nb_x, nb_y, nb_z) - number of splits (voxels) along x, y and z directions.
52 Standard_EXPORT virtual void Init (const Standard_Real x, const Standard_Real y, const Standard_Real z, const Standard_Real x_len, const Standard_Real y_len, const Standard_Real z_len, const Standard_Integer nb_x, const Standard_Integer nb_y, const Standard_Integer nb_z) Standard_OVERRIDE;
54 //! A destructor of the voxel model.
55 Standard_EXPORT void Destroy();
61 //! The method sets all values equal to 0 (false) and
62 //! releases the memory.
63 Standard_EXPORT void SetZero();
65 //! The method searches voxels with equal-value of sub-voxels
66 //! and removes them (remaining the value for the voxel).
67 Standard_EXPORT void OptimizeMemory();
69 //! Defines a value for voxel with co-ordinates (ix, iy, iz).
70 //! If the voxel is split into 8 sub-voxels, the split disappears.
71 //! Initial state of the model is so that all voxels have value 0 (false),
72 //! and this data doesn't occupy memory.
73 //! Memory for data is allocating during setting non-zero values (true).
74 Standard_EXPORT void Set (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz, const Standard_Boolean data);
76 //! Defines a value for a sub-voxel of a voxel with co-ordinates (ix, iy, iz).
77 //! If the voxel is not split into 8 sub-voxels yet, this method splits the voxel.
78 //! Range of sub-voxels is 0 - 7.
79 Standard_EXPORT void Set (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz, const Standard_Integer ioct1, const Standard_Boolean data);
81 //! Defines a value for a sub-voxel of a sub-voxel of a voxel with co-ordinates (ix, iy, iz).
82 //! If the voxel is not split into 8 sub-voxels yet, this method splits the voxel.
83 //! Range of sub-voxels is 0 - 7.
84 Standard_EXPORT void Set (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz, const Standard_Integer ioct1, const Standard_Integer ioct2, const Standard_Boolean data);
86 //! Returns true if the voxel is split into 8 sub-voxels.
87 Standard_EXPORT Standard_Boolean IsSplit (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz) const;
89 //! Returns the deepness of splits of a voxel.
90 //! 0 - no splits (::IsSplit() being called would return false).
91 //! 1 - the voxel is split into 8 sub-voxels.
92 //! 2 - the voxels is split into 8 sub-voxels,
93 //! and each of the sub-voxels is split into 8 sub-sub-voxels.
95 Standard_EXPORT Standard_Integer Deepness (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz) const;
97 //! Returns the value of voxel with co-ordinates (ix, iy, iz).
98 //! Warning!: the returned value may not coincide with the value of its 8 sub-voxels.
99 //! Use the method ::IsSplit() to check whether a voxel has sub-voxels.
100 Standard_EXPORT Standard_Boolean Get (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz) const;
102 //! Returns the value of a sub-voxel of a voxel with co-ordinates (ix, iy, iz).
103 //! If the voxel is not split, it returns the value of the voxel.
104 //! Range of sub-voxels is 0 - 7.
105 Standard_EXPORT Standard_Boolean Get (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz, const Standard_Integer ioct1) const;
107 //! Returns the value of a sub-voxel of a sub-voxel of a voxel with co-ordinates (ix, iy, iz).
108 //! If the voxel is not split, it returns the value of the voxel.
109 //! Range of sub-voxels is 0 - 7.
110 Standard_EXPORT Standard_Boolean Get (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz, const Standard_Integer ioct1, const Standard_Integer ioct2) const;
112 //! Returns the center point of a sub-voxel with co-ordinates (ix, iy, iz, i).
113 Standard_EXPORT void GetCenter (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz, const Standard_Integer i, Standard_Real& xc, Standard_Real& yc, Standard_Real& zc) const;
115 //! Returns the center point of a sub-voxel with co-ordinates (ix, iy, iz, i, j).
116 Standard_EXPORT void GetCenter (const Standard_Integer ix, const Standard_Integer iy, const Standard_Integer iz, const Standard_Integer i, const Standard_Integer j, Standard_Real& xc, Standard_Real& yc, Standard_Real& zc) const;
141 #endif // _Voxel_ROctBoolDS_HeaderFile