ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magicsld/grille.vb
Revision: 40
Committed: Mon Aug 20 21:30:28 2007 UTC (17 years, 8 months ago) by bournival
File size: 11140 byte(s)
Log Message:
Projet de these de Sylvain Bournival. Attention projet VB.

File Contents

# User Rev Content
1 bournival 40 Public Class point_grille
2     Private xyz(2) As Double
3     Private id As Integer
4    
5     Public Sub New(ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal indice As Integer)
6     xyz(0) = x
7     xyz(1) = y
8     xyz(2) = z
9     id = indice ' indice du points dans le tableau PogCode - tabpoints
10     End Sub
11     Public Sub New(ByRef x() As Double, ByVal indice As Integer)
12     xyz(0) = x(0)
13     xyz(1) = x(1)
14     xyz(2) = x(2)
15     id = indice ' indice du points dans le tableau PogCode - tabpoints
16     End Sub
17     Public Function get_x() As Double
18     Return xyz(0)
19     End Function
20     Public Function get_y() As Double
21     Return xyz(1)
22     End Function
23     Public Function get_z() As Double
24     Return xyz(2)
25     End Function
26     Public Sub get_coord(ByRef x() As Double)
27     x(0) = xyz(0)
28     x(1) = xyz(1)
29     x(2) = xyz(2)
30     End Sub
31     Public Function get_id() As Integer
32     Return id
33     End Function
34     End Class
35    
36     Public Class case_grille
37     Private xyz(2) As Double
38     REM Private dxyz(2) As Double
39     Private lst_point_grille As New Collection
40    
41     Public Sub New(ByVal x As Double, ByVal y As Double, ByVal z As Double) REM , ByVal dx As Double, ByVal dy As Double, ByVal dz As Double)
42     xyz(0) = x
43     xyz(1) = y
44     xyz(2) = z
45     REM dxyz(0) = dx
46     REM dxyz(1) = dy
47     REM dxyz(2) = dz
48     End Sub
49    
50     Public Sub add_point_grille(ByRef ptgr As point_grille)
51     lst_point_grille.Add(ptgr)
52     End Sub
53     Public Sub rm_point_grille(ByVal id As Integer)
54     lst_point_grille.Remove(id)
55     End Sub
56     Public Function get_nb_point_grille() As Integer
57     Return lst_point_grille.Count
58     End Function
59     Public Function get_point_grille(ByVal num As Integer) As point_grille
60     Return (lst_point_grille.Item(num))
61     End Function
62     Protected Overrides Sub Finalize()
63     Do While lst_point_grille.Count <> 0
64     lst_point_grille.Remove(1)
65     Loop
66     MyBase.Finalize()
67     End Sub
68     End Class
69    
70     Public Class grille
71     Private xyz(2) As Double
72     Private dxyz(2) As Double
73     Private lst_case_grille() As case_grille
74     'Private lst_case_grille As New Collection
75     Private pasx As Double
76     Private pasy As Double
77     Private pasz As Double
78     Private nbpasx As Integer
79     Private nbpasy As Integer
80     Private nbpasz As Integer
81    
82     Public Sub New()
83     End Sub
84     Public Sub initialiser(ByVal xmin As Double, ByVal ymin As Double, ByVal zmin As Double, ByVal xmax As Double, ByVal ymax As Double, ByVal zmax As Double, ByVal nb_pasx As Integer, ByVal nb_pasy As Integer, ByVal nb_pasz As Integer)
85     nbpasx = nb_pasx
86     nbpasy = nb_pasy
87     nbpasz = nb_pasz
88     If nbpasx = 0 Then
89     nbpasx = 1
90     If Math.Abs(xmin - xmax) < 0.0000000001 Then
91     xmax = xmax + 0.05
92     xmin = xmin - 0.05
93     End If
94     End If
95     If nbpasy = 0 Then
96     nbpasy = 1
97     If Math.Abs(ymin - ymax) < 0.0000000001 Then
98     ymax = ymax + 0.05
99     ymin = ymin - 0.05
100     End If
101     End If
102     If nbpasz = 0 Then
103     nbpasz = 1
104     If Math.Abs(zmin - zmax) < 0.0000000001 Then
105     zmax = zmax + 0.05
106     zmin = zmin - 0.05
107     End If
108     End If
109     pasx = (xmax - xmin) / nbpasx
110     pasy = (ymax - ymin) / nbpasy
111     pasz = (zmax - zmin) / nbpasz
112     xyz(0) = xmin
113     xyz(1) = ymin
114     xyz(2) = zmin
115     dxyz(0) = xmax - xmin
116     dxyz(1) = ymax - ymin
117     dxyz(2) = zmax - zmin
118     Dim i As Integer, j As Integer, k As Integer
119     Dim x1 As Double, x2 As Double
120     Dim y1 As Double, y2 As Double
121     Dim z1 As Double, z2 As Double
122     Dim cagr As case_grille
123    
124     ReDim lst_case_grille((nbpasx + 1) * (nbpasy + 1) * (nbpasz + 1))
125    
126     For k = 0 To nbpasz
127     For j = 0 To nbpasy
128     For i = 0 To nbpasx
129     x1 = xmin + i * pasx
130     y1 = ymin + j * pasy
131     z1 = zmin + k * pasz
132     x2 = xmin + (i + 1) * pasx
133     y2 = ymin + (j + 1) * pasy
134     z2 = zmin + (k + 1) * pasz
135     cagr = New case_grille(x1, y1, z1)
136     Dim num As Long
137     num = i + j * nbpasx + k * nbpasy * nbpasx + 1
138     lst_case_grille(num) = cagr
139     Next
140     Next
141     Next
142     End Sub
143    
144     Public Sub get_cellule(ByVal x As Double, ByVal y As Double, ByVal z As Double, ByRef cellgrille As case_grille)
145     Dim nx As Integer
146     Dim ny As Integer
147     Dim nz As Integer
148     Dim num As Long
149     nx = Int((x - xyz(0)) / pasx)
150     ny = Int((y - xyz(1)) / pasy)
151     nz = Int((z - xyz(2)) / pasz)
152     num = nx + ny * nbpasx + nz * nbpasy * nbpasx + 1
153     cellgrille = lst_case_grille((num))
154     End Sub
155     Public Sub get_cellule(ByVal nx As Integer, ByVal ny As Integer, ByVal nz As Integer, ByRef cellgrille As case_grille)
156     Dim num As Long
157     num = nx + ny * nbpasx + nz * nbpasy * nbpasx + 1
158     If (num <= 0) Or (num > nbpasx * nbpasy * nbpasz) Then
159     cellgrille = Nothing
160     Return
161     End If
162     cellgrille = lst_case_grille(num)
163     End Sub
164    
165     Public Sub inserer(ByRef ptgr As point_grille)
166     Dim cagr As case_grille
167     get_cellule(ptgr.get_x(), ptgr.get_y(), ptgr.get_z(), cagr)
168     cagr.add_point_grille(ptgr)
169     End Sub
170    
171     Public Sub rechercher(ByVal xc As Double, ByVal yc As Double, ByVal zc As Double, ByVal rayon As Double, ByRef lst_pt_grille_trouve As Collection)
172     Dim bxmin As Double
173     Dim bymin As Double
174     Dim bzmin As Double
175     Dim bxmax As Double
176     Dim bymax As Double
177     Dim bzmax As Double
178    
179     bxmin = xc - rayon
180     bymin = yc - rayon
181     bzmin = zc - rayon
182     bxmax = xc + rayon
183     bymax = yc + rayon
184     bzmax = zc + rayon
185     Dim nxmin As Integer = Int((bxmin - xyz(0)) / pasx)
186     Dim nxmax As Integer = Int((bxmax - xyz(0)) / pasx)
187     Dim nymin As Integer = Int((bymin - xyz(1)) / pasy)
188     Dim nymax As Integer = Int((bymax - xyz(1)) / pasy)
189     Dim nzmin As Integer = Int((bzmin - xyz(2)) / pasz)
190     Dim nzmax As Integer = Int((bzmax - xyz(2)) / pasz)
191    
192     If nxmin < 0 Then nxmin = 0
193     If nymin < 0 Then nymin = 0
194     If nzmin < 0 Then nzmin = 0
195     If nxmin > nbpasx - 1 Then nxmin = nbpasx - 1
196     If nymin > nbpasy - 1 Then nymin = nbpasy - 1
197     If nzmin > nbpasz - 1 Then nzmin = nbpasz - 1
198    
199     If nxmax < 0 Then nxmax = 0
200     If nymax < 0 Then nymax = 0
201     If nzmax < 0 Then nzmax = 0
202     If nxmax > nbpasx - 1 Then nxmax = nbpasx - 1
203     If nymax > nbpasy - 1 Then nymax = nbpasy - 1
204     If nzmax > nbpasz - 1 Then nzmax = nbpasz - 1
205    
206     Dim i As Integer, j As Integer, k As Integer, kk As Integer, nb As Integer
207     Dim xx As Double, yy As Double, zz As Double, dist As Double
208    
209     Dim cellgrille As case_grille
210     Dim ptgrille As point_grille
211     For i = nxmin To nxmax
212     For j = nymin To nymax
213     For k = nzmin To nzmax
214     get_cellule(i, j, k, cellgrille)
215     If Not cellgrille Is Nothing Then
216     nb = cellgrille.get_nb_point_grille()
217     For kk = 1 To nb
218     ptgrille = cellgrille.get_point_grille(kk)
219     xx = ptgrille.get_x() - xc
220     yy = ptgrille.get_y() - yc
221     zz = ptgrille.get_z() - zc
222     dist = xx * xx + yy * yy + zz * zz
223     If dist < rayon * rayon + (xx + yy + zz) * 0.0000000002 Then
224     lst_pt_grille_trouve.Add(ptgrille)
225     End If
226    
227     Next
228     End If
229     Next
230     Next
231     Next
232    
233     End Sub
234     Public Function chercher(ByVal xc As Double, ByVal yc As Double, ByVal zc As Double, ByVal rayon As Double) As Boolean
235     Dim bxmin As Double
236     Dim bymin As Double
237     Dim bzmin As Double
238     Dim bxmax As Double
239     Dim bymax As Double
240     Dim bzmax As Double
241    
242     bxmin = xc - rayon
243     bymin = yc - rayon
244     bzmin = zc - rayon
245     bxmax = xc + rayon
246     bymax = yc + rayon
247     bzmax = zc + rayon
248     Dim nxmin As Integer = Int((bxmin - xyz(0)) / pasx)
249     Dim nxmax As Integer = Int((bxmax - xyz(0)) / pasx)
250     Dim nymin As Integer = Int((bymin - xyz(1)) / pasy)
251     Dim nymax As Integer = Int((bymax - xyz(1)) / pasy)
252     Dim nzmin As Integer = Int((bzmin - xyz(2)) / pasz)
253     Dim nzmax As Integer = Int((bzmax - xyz(2)) / pasz)
254    
255     If nxmin < 0 Then nxmin = 0
256     If nymin < 0 Then nymin = 0
257     If nzmin < 0 Then nzmin = 0
258     If nxmin > nbpasx - 1 Then nxmin = nbpasx - 1
259     If nymin > nbpasy - 1 Then nymin = nbpasy - 1
260     If nzmin > nbpasz - 1 Then nzmin = nbpasz - 1
261    
262     If nxmax < 0 Then nxmax = 0
263     If nymax < 0 Then nymax = 0
264     If nzmax < 0 Then nzmax = 0
265     If nxmax > nbpasx - 1 Then nxmax = nbpasx - 1
266     If nymax > nbpasy - 1 Then nymax = nbpasy - 1
267     If nzmax > nbpasz - 1 Then nzmax = nbpasz - 1
268    
269     Dim i As Integer, j As Integer, k As Integer, kk As Integer, nb As Integer
270     Dim xx As Double, yy As Double, zz As Double, dist As Double
271    
272     chercher = False
273     Dim cellgrille As case_grille
274     Dim ptgrille As point_grille
275     For i = nxmin To nxmax
276     For j = nymin To nymax
277     For k = nzmin To nzmax
278     get_cellule(i, j, k, cellgrille)
279     If Not cellgrille Is Nothing Then
280     nb = cellgrille.get_nb_point_grille()
281     For kk = 1 To nb
282     ptgrille = cellgrille.get_point_grille(kk)
283     xx = ptgrille.get_x() - xc
284     yy = ptgrille.get_y() - yc
285     zz = ptgrille.get_z() - zc
286     dist = xx * xx + yy * yy + zz * zz
287     If dist < rayon * rayon + (xx + yy + zz) * 0.0000000002 Then
288     Return True
289     End If
290    
291     Next
292     End If
293     Next
294     Next
295     Next
296    
297     End Function
298    
299     Protected Overrides Sub Finalize()
300     REM Do While lst_case_grille.GetLength() <> 0
301     REM lst_case_grille.Remove(1)
302     REM Loop
303     MyBase.Finalize()
304     End Sub
305     End Class