0025936: Reusable data structure for 2D tesselation (3- and 4-nodal mesh)
[occt.git] / src / DrawTrSurf / DrawTrSurf_Triangulation.cxx
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 #include <DrawTrSurf_Triangulation.ixx>
18 #include <Poly_Connect.hxx>
19 #include <Poly_Triangle.hxx>
20 #include <Poly_Array1OfTriangle.hxx>
21 #include <TColStd_Array1OfInteger.hxx>
22 #include <gp_Pnt.hxx>
23 #include <Draw_Color.hxx>
24 #include <Poly.hxx>
25
26 //#ifdef WNT
27 #include <stdio.h>
28 //#endif
29
30 //=======================================================================
31 //function : DrawTrSurf_Triangulation
32 //purpose  : 
33 //=======================================================================
34
35 DrawTrSurf_Triangulation::DrawTrSurf_Triangulation
36 (const Handle(Poly_Triangulation)& T): 
37     myTriangulation(T), 
38     myNodes(Standard_False), 
39     myTriangles(Standard_False)
40 {
41   // Build the connect tool
42   Poly_Connect pc(T);
43
44   Standard_Integer i,j,nFree, nInternal, nbTriangles = T->NbTriangles();
45   Standard_Integer t[3];
46
47   // count the free edges
48   nFree = 0;
49   for (i = 1; i <= nbTriangles; i++) {
50     pc.Triangles(i,t[0],t[1],t[2]);
51     for (j = 0; j < 3; j++)
52       if (t[j] == 0) nFree++;
53   }
54
55   // allocate the arrays
56   myFree = new TColStd_HArray1OfInteger(1,2*nFree);
57   nInternal = (3*nbTriangles - nFree) / 2;
58   myInternals = new TColStd_HArray1OfInteger(1,2*nInternal);
59
60   TColStd_Array1OfInteger& Free     = myFree->ChangeArray1();
61   TColStd_Array1OfInteger& Internal = myInternals->ChangeArray1();
62
63   Standard_Integer fr = 1, in = 1;
64   Standard_Integer n[3];
65   for (i = 1; i <= nbTriangles; i++) {
66     pc.Triangles(i,t[0],t[1],t[2]);
67     T->Triangle (i).Get(n[0],n[1],n[2]);
68     for (j = 0; j < 3; j++) {
69       Standard_Integer k = (j+1) % 3;
70       if (t[j] == 0) {
71         Free(fr)   = n[j];
72         Free(fr+1) = n[k];
73         fr += 2;
74       }
75       // internal edge if this triangle has a lower index than the adjacent
76       else if (i < t[j]) {
77         Internal(in)   = n[j];
78         Internal(in+1) = n[k];
79         in += 2;
80       }
81     }
82   }
83 }
84
85 //=======================================================================
86 //function : Triangulation
87 //purpose  : 
88 //=======================================================================
89
90 Handle(Poly_Triangulation) DrawTrSurf_Triangulation::Triangulation() const 
91 {
92   return myTriangulation;
93 }
94
95 //=======================================================================
96 //function : ShowNodes
97 //purpose  : 
98 //=======================================================================
99
100 void DrawTrSurf_Triangulation::ShowNodes(const Standard_Boolean B)
101 {
102   myNodes = B;
103 }
104
105 //=======================================================================
106 //function : ShowNodes
107 //purpose  : 
108 //=======================================================================
109
110 Standard_Boolean DrawTrSurf_Triangulation::ShowNodes() const 
111 {
112   return myNodes;
113 }
114
115 //=======================================================================
116 //function : ShowTriangles
117 //purpose  : 
118 //=======================================================================
119
120 void DrawTrSurf_Triangulation::ShowTriangles(const Standard_Boolean B)
121 {
122   myTriangles = B;
123 }
124
125 //=======================================================================
126 //function : ShowTriangles
127 //purpose  : 
128 //=======================================================================
129
130 Standard_Boolean DrawTrSurf_Triangulation::ShowTriangles() const 
131 {
132   return myTriangles;
133 }
134
135 //=======================================================================
136 //function : DrawOn
137 //purpose  : 
138 //=======================================================================
139
140 void DrawTrSurf_Triangulation::DrawOn(Draw_Display& dis) const 
141 {
142   // Display the edges
143   Standard_Integer i,n;
144
145   // free edges
146
147   dis.SetColor(Draw_rouge);
148   const TColStd_Array1OfInteger& Free = myFree->Array1();
149   n = Free.Length() / 2;
150   for (i = 1; i <= n; i++) {
151     dis.Draw(myTriangulation->Node (Free(2*i-1)),myTriangulation->Node (Free(2*i)));
152   }
153   
154   // internal edges
155
156   dis.SetColor(Draw_bleu);
157   const TColStd_Array1OfInteger& Internal = myInternals->Array1();
158   n = Internal.Length() / 2;
159   for (i = 1; i <= n; i++) {
160     dis.Draw(myTriangulation->Node (Internal(2*i-1)),myTriangulation->Node (Internal(2*i)));
161   }
162
163   // texts
164   char text[50];
165   if (myNodes) {
166     dis.SetColor(Draw_jaune);
167     n = myTriangulation->NbNodes();
168     for (i = 1; i <= n; i++) {
169       Sprintf(text,"%d",i);
170       dis.DrawString(myTriangulation->Node (i),text);
171     }
172   }
173
174   if (myTriangles) {
175     dis.SetColor(Draw_vert);
176     n = myTriangulation->NbTriangles();
177     Standard_Integer t[3],j;
178     for (i = 1; i <= n; i++) {
179       myTriangulation->Triangle (i).Get(t[0],t[1],t[2]);
180       gp_Pnt P(0,0,0);
181       gp_XYZ& bary = P.ChangeCoord();
182       for (j = 0; j < 3; j++)
183         bary.Add(myTriangulation->Node (t[j]).Coord());
184       bary.Multiply(1./3.);
185
186       Sprintf(text,"%d",i);
187       dis.DrawString(P,text);
188     }
189   }
190 }
191
192 //=======================================================================
193 //function : Copy
194 //purpose  : 
195 //=======================================================================
196
197 Handle(Draw_Drawable3D) DrawTrSurf_Triangulation::Copy() const 
198 {
199   return new DrawTrSurf_Triangulation(myTriangulation);
200 }
201
202 //=======================================================================
203 //function : Dump
204 //purpose  : 
205 //=======================================================================
206
207 void DrawTrSurf_Triangulation::Dump(Standard_OStream& S) const 
208 {
209   Poly::Dump(myTriangulation,S);
210 }
211
212 //=======================================================================
213 //function : Whatis
214 //purpose  : 
215 //=======================================================================
216
217 void DrawTrSurf_Triangulation::Whatis(Draw_Interpretor& I) const 
218 {
219   I << "triangulation";
220 }
221