@@ -39,8 +39,8 @@ public class Graph
39
39
return ( x , y ) ;
40
40
41
41
// Merge test
42
- }
43
-
42
+ }
43
+
44
44
/// <summary>
45
45
/// Возвращает вес ребра, соединяющего две соседние (смежные) вершины графа
46
46
/// </summary>
@@ -49,6 +49,33 @@ public class Graph
49
49
/// <returns></returns>
50
50
double Weight ( Vertex v1 , Vertex v2 )
51
51
{
52
+ #region Блок для тестирования
53
+
54
+ if ( IsWeightFromTo ( v1 , 0 , 0 , v2 , 0 , 1 ) )
55
+ return 1.0 ;
56
+ if ( IsWeightFromTo ( v1 , 0 , 1 , v2 , 0 , 2 ) )
57
+ return 3.0 ;
58
+ if ( IsWeightFromTo ( v1 , 0 , 0 , v2 , 1 , 0 ) )
59
+ return 1.0 ;
60
+ if ( IsWeightFromTo ( v1 , 1 , 0 , v2 , 1 , 1 ) )
61
+ return 100.0 ;
62
+ if ( IsWeightFromTo ( v1 , 1 , 1 , v2 , 1 , 2 ) )
63
+ return 10.0 ;
64
+ if ( IsWeightFromTo ( v1 , 0 , 2 , v2 , 1 , 2 ) )
65
+ return 2.0 ;
66
+ if ( IsWeightFromTo ( v1 , 0 , 0 , v2 , 1 , 1 ) )
67
+ return 40.0 ;
68
+ if ( IsWeightFromTo ( v1 , 1 , 0 , v2 , 0 , 1 ) )
69
+ return 50.0 ;
70
+ if ( IsWeightFromTo ( v1 , 0 , 1 , v2 , 1 , 2 ) )
71
+ return 70.0 ;
72
+ if ( IsWeightFromTo ( v1 , 1 , 1 , v2 , 0 , 2 ) )
73
+ return 30.0 ;
74
+ if ( IsWeightFromTo ( v1 , 0 , 1 , v2 , 1 , 1 ) )
75
+ return 50.0 ;
76
+
77
+ #endregion
78
+
52
79
( double , double ) x1y1 = GetRealXY ( v1 ) ;
53
80
( double , double ) x2y2 = GetRealXY ( v2 ) ;
54
81
@@ -59,7 +86,18 @@ double Weight(Vertex v1, Vertex v2)
59
86
double sumOfSquares = Math . Pow ( xDiff , 2.0 ) + Math . Pow ( yDiff , 2.0 ) + gamma * Math . Pow ( zDiff , 2.0 ) ;
60
87
61
88
return Math . Sqrt ( sumOfSquares ) ;
62
- }
89
+ }
90
+
91
+ private bool IsWeightFromTo ( Vertex v1 , int x1 , int y1 , Vertex v2 , int x2 , int y2 )
92
+ {
93
+ bool case1 = x1 == v1 . Coordinate . i && y1 == v1 . Coordinate . j &&
94
+ x2 == v2 . Coordinate . i && y2 == v2 . Coordinate . j ;
95
+
96
+ bool case2 = x1 == v2 . Coordinate . i && y1 == v2 . Coordinate . j &&
97
+ x2 == v1 . Coordinate . i && y2 == v1 . Coordinate . j ;
98
+
99
+ return case1 || case2 ;
100
+ }
63
101
64
102
/// <summary>
65
103
/// Возвращает кратчайший путь между двумя заданными вершинами графа
@@ -126,6 +164,7 @@ private List<Point2D> GetShortestPath(Vertex goal)
126
164
127
165
return path ;
128
166
}
167
+
129
168
/// <summary>
130
169
/// Возвращает текущую вершину используя список посещенных вершин
131
170
/// </summary>
@@ -162,12 +201,13 @@ private bool HasUnvisitedAndNotGoalNeighbors(Vertex vertex, out List<Vertex> unv
162
201
unvisitedAndNotGoalNeighbors = GetUnvisitedNeighbors ( vertex ) . Where ( v => ! v . IsGoal ) . ToList ( ) ;
163
202
return unvisitedAndNotGoalNeighbors . Any ( ) ;
164
203
}
204
+
165
205
/// <summary>
166
206
/// Возвращает все смежные вершины для текущей, которые не посещены
167
207
/// </summary>
168
208
/// <param name="current">текущая вершина</param>
169
209
/// <returns></returns>
170
- private List < Vertex > GetUnvisitedNeighbors ( Vertex current ) => GetAllAdjacentVertices ( current ) . Where ( v => ! v . IsVisited ) . ToList ( ) ;
210
+ private List < Vertex > GetUnvisitedNeighbors ( Vertex current ) => GetAllAdjacentVertices ( current ) . Where ( v => ! v . IsVisited && ! v . IsObstacle ) . ToList ( ) ;
171
211
172
212
#region Методы для поиска соседней вершины в зависимости от направления
173
213
private Vertex GetTopVertex ( Vertex v ) => Vertices [ v . Coordinate . i , v . Coordinate . j + 1 ] ;
@@ -293,6 +333,7 @@ private List<Vertex> GetAllAdjacentVertices(Vertex vertex)
293
333
GetTopLeftVertex ( vertex )
294
334
} ;
295
335
}
336
+
296
337
public Graph ( double dx , double dy , int N , int M , Func < double , double , double > SurfaceFunc , double gamma = 1.0 )
297
338
{
298
339
this . N = N ;
0 commit comments