42cf5bc1 |
1 | // Created on: 1995-03-06 |
2 | // Created by: Laurent PAINNOT |
3 | // Copyright (c) 1995-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 _Poly_Connect_HeaderFile |
18 | #define _Poly_Connect_HeaderFile |
19 | |
20 | #include <Standard.hxx> |
21 | #include <Standard_DefineAlloc.hxx> |
22 | #include <Standard_Handle.hxx> |
23 | |
24 | #include <TColStd_Array1OfInteger.hxx> |
25 | #include <Standard_Integer.hxx> |
26 | #include <Standard_Boolean.hxx> |
27 | class Poly_Triangulation; |
28 | |
42cf5bc1 |
29 | //! Provides an algorithm to explore, inside a triangulation, the |
30 | //! adjacency data for a node or a triangle. |
31 | //! Adjacency data for a node consists of triangles which |
32 | //! contain the node. |
33 | //! Adjacency data for a triangle consists of: |
34 | //! - the 3 adjacent triangles which share an edge of the triangle, |
35 | //! - and the 3 nodes which are the other nodes of these adjacent triangles. |
36 | //! Example |
37 | //! Inside a triangulation, a triangle T |
38 | //! has nodes n1, n2 and n3. |
39 | //! It has adjacent triangles AT1, AT2 and AT3 where: |
40 | //! - AT1 shares the nodes n2 and n3, |
41 | //! - AT2 shares the nodes n3 and n1, |
42 | //! - AT3 shares the nodes n1 and n2. |
43 | //! It has adjacent nodes an1, an2 and an3 where: |
44 | //! - an1 is the third node of AT1, |
45 | //! - an2 is the third node of AT2, |
46 | //! - an3 is the third node of AT3. |
47 | //! So triangle AT1 is composed of nodes n2, n3 and an1. |
48 | //! There are two ways of using this algorithm. |
49 | //! - From a given node you can look for one triangle that |
50 | //! passes through the node, then look for the triangles |
51 | //! adjacent to this triangle, then the adjacent nodes. You |
52 | //! can thus explore the triangulation step by step (functions |
53 | //! Triangle, Triangles and Nodes). |
54 | //! - From a given node you can look for all the triangles |
55 | //! that pass through the node (iteration method, using the |
56 | //! functions Initialize, More, Next and Value). |
57 | //! A Connect object can be seen as a tool which analyzes a |
58 | //! triangulation and translates it into a series of triangles. By |
59 | //! doing this, it provides an interface with other tools and |
60 | //! applications working on basic triangles, and which do not |
61 | //! work directly with a Poly_Triangulation. |
62 | class Poly_Connect |
63 | { |
64 | public: |
65 | |
66 | DEFINE_STANDARD_ALLOC |
67 | |
450c83ad |
68 | //! Constructs an uninitialized algorithm. |
69 | Standard_EXPORT Poly_Connect(); |
70 | |
42cf5bc1 |
71 | //! Constructs an algorithm to explore the adjacency data of |
72 | //! nodes or triangles for the triangulation T. |
450c83ad |
73 | Standard_EXPORT Poly_Connect (const Handle(Poly_Triangulation)& theTriangulation); |
74 | |
75 | //! Initialize the algorithm to explore the adjacency data of |
76 | //! nodes or triangles for the triangulation theTriangulation. |
77 | Standard_EXPORT void Load (const Handle(Poly_Triangulation)& theTriangulation); |
78 | |
42cf5bc1 |
79 | //! Returns the triangulation analyzed by this tool. |
450c83ad |
80 | const Handle(Poly_Triangulation)& Triangulation() const { return myTriangulation; } |
81 | |
42cf5bc1 |
82 | //! Returns the index of a triangle containing the node at |
83 | //! index N in the nodes table specific to the triangulation analyzed by this tool |
450c83ad |
84 | Standard_Integer Triangle (const Standard_Integer N) const { return myTriangles (N); } |
85 | |
42cf5bc1 |
86 | //! Returns in t1, t2 and t3, the indices of the 3 triangles |
87 | //! adjacent to the triangle at index T in the triangles table |
88 | //! specific to the triangulation analyzed by this tool. |
89 | //! Warning |
90 | //! Null indices are returned when there are fewer than 3 |
91 | //! adjacent triangles. |
450c83ad |
92 | void Triangles (const Standard_Integer T, Standard_Integer& t1, Standard_Integer& t2, Standard_Integer& t3) const |
93 | { |
94 | Standard_Integer index = 6*(T-1); |
95 | t1 = myAdjacents(index+1); |
96 | t2 = myAdjacents(index+2); |
97 | t3 = myAdjacents(index+3); |
98 | } |
99 | |
42cf5bc1 |
100 | //! Returns, in n1, n2 and n3, the indices of the 3 nodes |
101 | //! adjacent to the triangle referenced at index T in the |
102 | //! triangles table specific to the triangulation analyzed by this tool. |
103 | //! Warning |
104 | //! Null indices are returned when there are fewer than 3 adjacent nodes. |
450c83ad |
105 | void Nodes (const Standard_Integer T, Standard_Integer& n1, Standard_Integer& n2, Standard_Integer& n3) const |
106 | { |
107 | Standard_Integer index = 6*(T-1); |
108 | n1 = myAdjacents(index+4); |
109 | n2 = myAdjacents(index+5); |
110 | n3 = myAdjacents(index+6); |
111 | } |
112 | |
113 | public: |
114 | |
42cf5bc1 |
115 | //! Initializes an iterator to search for all the triangles |
116 | //! containing the node referenced at index N in the nodes |
117 | //! table, for the triangulation analyzed by this tool. |
118 | //! The iterator is managed by the following functions: |
119 | //! - More, which checks if there are still elements in the iterator |
120 | //! - Next, which positions the iterator on the next element |
121 | //! - Value, which returns the current element. |
122 | //! The use of such an iterator provides direct access to the |
123 | //! triangles around a particular node, i.e. it avoids iterating on |
124 | //! all the component triangles of a triangulation. |
125 | //! Example |
126 | //! Poly_Connect C(Tr); |
127 | //! for |
128 | //! (C.Initialize(n1);C.More();C.Next()) |
129 | //! { |
130 | //! t = C.Value(); |
131 | //! } |
132 | Standard_EXPORT void Initialize (const Standard_Integer N); |
133 | |
134 | //! Returns true if there is another element in the iterator |
135 | //! defined with the function Initialize (i.e. if there is another |
136 | //! triangle containing the given node). |
450c83ad |
137 | Standard_Boolean More() const { return mymore; } |
138 | |
42cf5bc1 |
139 | //! Advances the iterator defined with the function Initialize to |
140 | //! access the next triangle. |
141 | //! Note: There is no action if the iterator is empty (i.e. if the |
142 | //! function More returns false).- |
143 | Standard_EXPORT void Next(); |
144 | |
145 | //! Returns the index of the current triangle to which the |
146 | //! iterator, defined with the function Initialize, points. This is |
147 | //! an index in the triangles table specific to the triangulation |
148 | //! analyzed by this tool |
450c83ad |
149 | Standard_Integer Value() const { return mytr; } |
42cf5bc1 |
150 | |
151 | private: |
152 | |
42cf5bc1 |
153 | Handle(Poly_Triangulation) myTriangulation; |
154 | TColStd_Array1OfInteger myTriangles; |
155 | TColStd_Array1OfInteger myAdjacents; |
156 | Standard_Integer mytr; |
157 | Standard_Integer myfirst; |
158 | Standard_Integer mynode; |
159 | Standard_Integer myothernode; |
160 | Standard_Boolean mysense; |
161 | Standard_Boolean mymore; |
162 | |
42cf5bc1 |
163 | }; |
164 | |
42cf5bc1 |
165 | #endif // _Poly_Connect_HeaderFile |