jps 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,230 @@
1
+ #include "jps.hh"
2
+ #include <iostream>
3
+ #include <algorithm>
4
+ #include <string>
5
+ #include <string.h>
6
+ #include <assert.h>
7
+ #include <vector>
8
+ #include "map_jps.h"
9
+
10
+ using namespace std;
11
+
12
+ Map *map = NULL;
13
+ vector<JPS::Position> *path = NULL;
14
+ // std::vector<std::string> out;
15
+
16
+ inline unsigned Map::operator()(unsigned x, unsigned y) const
17
+ {
18
+ unsigned canwalk = x < this->w && y < this->h;
19
+ if(canwalk)
20
+ canwalk = data[y][x] != 1;
21
+
22
+ return canwalk;
23
+ }
24
+
25
+ void Map::clear()
26
+ {
27
+ int i;
28
+ for(i = 0;i < this->h; ++i)
29
+ {
30
+ delete[] this->data[i];
31
+ }
32
+ delete[] this->data;
33
+ }
34
+
35
+ void Map::init(int width, int height)
36
+ {
37
+ this->w = width;
38
+ this->h = height;
39
+ this->data = new int*[height];
40
+ int i,j;
41
+ for(j = 0; j < height; ++j)
42
+ {
43
+ this->data[j] = new int[width];
44
+ for(i = 0; i < width; ++i)
45
+ {
46
+ this->data[j][i] = 0;
47
+ }
48
+ }
49
+ }
50
+
51
+ void clearMap()
52
+ {
53
+ if(!map){
54
+ delete map;
55
+ map = NULL;
56
+ }
57
+ }
58
+
59
+ void clearPath()
60
+ {
61
+ if(!path)
62
+ {
63
+ delete path;
64
+ path = NULL;
65
+ }
66
+ }
67
+
68
+ vector<JPS::Position> * findPath(int startX, int startY, int stopX, int stopY)
69
+ {
70
+ if(!map || !path){
71
+ return NULL;
72
+ }
73
+
74
+ path->clear();
75
+
76
+ //开始和结束位置不能是障碍 不然找不到路径
77
+ //这里先设置成非障碍,查询结束后重置回去
78
+ int oldStartFlag = map->data[startY][startX];
79
+ int oldStopFlag = map->data[stopY][stopX];
80
+ map->data[startY][startX] = 0;
81
+ map->data[stopY][stopX] = 0;
82
+
83
+ JPS::PathVector waypoints;
84
+ JPS::PathVector result;
85
+ waypoints.push_back(JPS::Pos(JPS::PosType(startX), startY));
86
+ waypoints.push_back(JPS::Pos(JPS::PosType(stopX), stopY));
87
+
88
+ JPS::Searcher<Map> search(*map);
89
+ search.findPath(result, waypoints[0], waypoints[1], 1);
90
+
91
+ int curX = startX;
92
+ int curY = startY;
93
+ for(JPS::PathVector::iterator it = result.begin(); it != result.end(); ++it)
94
+ {
95
+ int x = it -> x;
96
+ int y = it -> y;
97
+
98
+ //不反回目标点
99
+ // if(x == stopX && y == stopY)
100
+ // {
101
+ // break;
102
+ // }
103
+
104
+ if(curX != x && curY != y)
105
+ {
106
+ JPS::Position pos1;
107
+ if(map->data[curY][x] == 0)
108
+ {
109
+ pos1.x = x;
110
+ pos1.y = curY;
111
+ path->push_back(pos1);
112
+ curX = x;
113
+ }
114
+ else if(map->data[y][curX] == 0)
115
+ {
116
+ pos1.x = curX;
117
+ pos1.y = y;
118
+ path->push_back(pos1);
119
+ curY = y;
120
+ }
121
+ }
122
+
123
+ JPS::Position pos2;
124
+ pos2.x = x;
125
+ pos2.y = y;
126
+ path->push_back(pos2);
127
+ curX = x;
128
+ curY = y;
129
+ }
130
+
131
+ //查询结束后重置回去
132
+ map->data[startY][startX] = oldStartFlag;
133
+ map->data[stopY][stopX] = oldStopFlag;
134
+ return path;
135
+ }
136
+
137
+ JPS::Position findDstPos(int startX,int startY, int endX, int endY,int step)
138
+ {
139
+ JPS::Position dstPos;
140
+ if(!map){
141
+ return dstPos;
142
+ }
143
+
144
+ int oldStartFlag = map->data[startY][startX];
145
+ int oldStopFlag = map->data[endY][endX];
146
+ map->data[startY][startX] = 0;
147
+ map->data[endY][endX] = 0;
148
+
149
+ JPS::PathVector waypoints;
150
+
151
+ waypoints.push_back(JPS::Pos(startX, startY));
152
+ waypoints.push_back(JPS::Pos(endX, endY));
153
+
154
+ JPS::PathVector result;
155
+ JPS::Searcher<Map> search(*map);
156
+ search.findPath(result, waypoints[0], waypoints[1], 1);
157
+
158
+ int curStep = 0;
159
+ int curX = startX;
160
+ int curY = startY;
161
+ for(JPS::PathVector::iterator it = result.begin(); it != result.end(); ++it)
162
+ {
163
+ int y = it->y;
164
+ int x = it->x;
165
+ //到最后一个点的话使用倒数第二个点
166
+ if(x == endX && y == endY)
167
+ {
168
+ dstPos.x = curX;
169
+ dstPos.y = curY;
170
+ break;
171
+ }
172
+
173
+ if(curX != x && curY != y)
174
+ {
175
+ vector<int> v1;
176
+ if(map->data[curY][x] == 0)
177
+ curX = x;
178
+ else if(map->data[y][curX] == 0)
179
+ curY = y;
180
+ curStep++;
181
+
182
+ if(curStep == step)
183
+ {
184
+ dstPos.x = curX;
185
+ dstPos.y = curY;
186
+ break;
187
+ }
188
+ }
189
+
190
+ curX = x;
191
+ curY = y;
192
+ curStep++;
193
+
194
+ if(curStep == step )
195
+ {
196
+ dstPos.x = curX;
197
+ dstPos.y = curY;
198
+ break;
199
+ }
200
+ }
201
+
202
+ map->data[startY][startX] = oldStartFlag;
203
+ map->data[endY][endX] = oldStopFlag;
204
+
205
+ return dstPos;
206
+
207
+ }
208
+
209
+ void initMap(int width,int height)
210
+ {
211
+ if(map != NULL){
212
+ clearMap();
213
+ }
214
+ if(path != NULL){
215
+ clearPath();
216
+ }
217
+
218
+ map = new Map();
219
+ map->init(width, height);
220
+
221
+ path = new vector<JPS::Position>();
222
+ }
223
+
224
+ void setMapPos(int posX, int posY,int flag)
225
+ {
226
+ if(!map){
227
+ return;
228
+ }
229
+ map->data[posY][posX] = flag;
230
+ }
data/ext/jps/map_jps.h ADDED
@@ -0,0 +1,22 @@
1
+ #ifndef MAP_JPS_H_
2
+ #define MAP_JPS_H_
3
+ #include "jps.hh"
4
+ #include <vector>
5
+ #include <iostream>
6
+ using namespace std;
7
+ struct Map{
8
+ void init(int width, int height);
9
+ void clear();
10
+ unsigned operator()(unsigned x, unsigned y) const;
11
+ int w,h;
12
+ int **data;
13
+ };
14
+
15
+ void clearMap();
16
+ void clearPath();
17
+ void initMap(int width,int height);
18
+ vector<JPS::Position> * findPath(int startX, int startY, int stopX, int stopY);
19
+ JPS::Position findDstPos(int startX,int startY, int endX, int endY,int step);
20
+ void initMap(int width,int height);
21
+ void setMapPos(int posX, int posY,int flag);
22
+ #endif
data/ext/jps/rjps.cpp ADDED
@@ -0,0 +1,126 @@
1
+ #include <ruby.h>
2
+
3
+ #include "map_jps.h"
4
+ #include "jps.hh"
5
+ #include <vector>
6
+
7
+ extern vector<JPS::Position> *path;
8
+ extern Map *map;
9
+
10
+
11
+ VALUE find_path(VALUE self, VALUE start_x, VALUE start_y, VALUE stop_x, VALUE stop_y)
12
+ {
13
+ if(map == NULL)
14
+ return rb_str_new2("Map is null, plz init map first!");
15
+ if(path == NULL)
16
+ return rb_str_new2("path is null, plz init map first!");
17
+
18
+ int startX = NUM2INT(start_x);
19
+ int startY = NUM2INT(start_y);
20
+ int stopX = NUM2INT(stop_x);
21
+ int stopY = NUM2INT(stop_y);
22
+
23
+ vector<JPS::Position> * p;
24
+ p = findPath(startX, startY, stopX, stopY);
25
+
26
+ VALUE arr1 = rb_ary_new();
27
+ int i;
28
+ for(i=0; i< p->size(); ++i)
29
+ {
30
+ VALUE arr2 = rb_ary_new();
31
+ JPS::Position ret = (*path)[i];
32
+ rb_ary_push(arr2, INT2NUM(ret.x));
33
+ rb_ary_push(arr2, INT2NUM(ret.y));
34
+ rb_ary_push(arr1, arr2);
35
+ }
36
+
37
+ return arr1;
38
+ // return INT2FIX(p);
39
+ }
40
+
41
+ VALUE get_path_length(VALUE self)
42
+ {
43
+ return INT2NUM(path->size());
44
+ }
45
+
46
+ VALUE clear_map(VALUE self)
47
+ {
48
+ clearMap();
49
+ clearPath();
50
+ return INT2NUM(0);
51
+ }
52
+
53
+ VALUE find_dst_pos(VALUE self, VALUE start_x, VALUE start_y, VALUE end_x, VALUE end_y, VALUE step)
54
+ {
55
+ if(map == NULL)
56
+ return rb_str_new2("Map is null, plz init map first!");
57
+ if(path == NULL)
58
+ return rb_str_new2("path is null, plz init map first!");
59
+
60
+ int startX = NUM2INT(start_x);
61
+ int startY = NUM2INT(start_y);
62
+ int endX = NUM2INT(end_x);
63
+ int endY = NUM2INT(end_y);
64
+ int sp = NUM2INT(step);
65
+
66
+ if(startX < 0 || startX >= map->w)
67
+ return rb_str_new2("startX is overflow!");
68
+ if(startY < 0 || startY >= map->w)
69
+ return rb_str_new2("startY is overflow!");
70
+ if(endX < 0 || endX >= map->w)
71
+ return rb_str_new2("endX is overflow!");
72
+ if(endY < 0 || endY >= map->w)
73
+ return rb_str_new2("endY is overflow!");
74
+
75
+ JPS::Position ret = findDstPos(startX, startY, endX, endY, sp);
76
+
77
+ VALUE point = rb_ary_new();
78
+ rb_ary_push(point, INT2NUM(ret.x));
79
+ rb_ary_push(point, INT2NUM(ret.y));
80
+ return point;
81
+
82
+ }
83
+
84
+ VALUE get_path_point(VALUE self, VALUE idx)
85
+ {
86
+ int index = NUM2INT(idx);
87
+ JPS::Position ret = (*path)[index];
88
+ VALUE point = rb_ary_new();
89
+ rb_ary_push(point, INT2NUM(ret.x));
90
+ rb_ary_push(point, INT2NUM(ret.y));
91
+ return point;
92
+ }
93
+
94
+ VALUE set_map_pos(VALUE self, VALUE posX, VALUE posY, VALUE flag)
95
+ {
96
+ if(map == NULL)
97
+ return rb_str_new2("Map is null, plz init map first!");
98
+ int x = NUM2INT(posX);
99
+ int y = NUM2INT(posY);
100
+ int fg = NUM2INT(flag);
101
+
102
+ setMapPos(x, y, fg);
103
+ return INT2NUM(0);
104
+ }
105
+
106
+ VALUE init_map(VALUE self, VALUE width, VALUE height)
107
+ {
108
+ int w = NUM2INT(width);
109
+ int h = NUM2INT(height);
110
+ initMap(w, h);
111
+ return INT2NUM(0);
112
+ }
113
+
114
+
115
+ extern "C" void Init_rjps()
116
+ {
117
+ VALUE jps = rb_define_module("Jps");
118
+ rb_define_module_function(jps, "find_path", RUBY_METHOD_FUNC(find_path), 4);
119
+ rb_define_module_function(jps, "init_map", RUBY_METHOD_FUNC(init_map), 2);
120
+ rb_define_module_function(jps, "get_path_length", RUBY_METHOD_FUNC(get_path_length), 0);
121
+ rb_define_module_function(jps, "get_path_point", RUBY_METHOD_FUNC(get_path_point), 1);
122
+ rb_define_module_function(jps, "set_map_pos", RUBY_METHOD_FUNC(set_map_pos), 3);
123
+ rb_define_module_function(jps, "clear_map", RUBY_METHOD_FUNC(clear_map), 0);
124
+ rb_define_module_function(jps, "find_dst_pos", RUBY_METHOD_FUNC(find_dst_pos), 5);
125
+ }
126
+
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jps
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - ljf
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: jps automated test application
14
+ email: xxxxxxx@xxxnets.com
15
+ executables: []
16
+ extensions:
17
+ - ext/jps/extconf.rb
18
+ extra_rdoc_files: []
19
+ files:
20
+ - ext/jps/extconf.rb
21
+ - ext/jps/jps.hh
22
+ - ext/jps/map_jps.cpp
23
+ - ext/jps/map_jps.h
24
+ - ext/jps/rjps.cpp
25
+ homepage: http://172.17.2.44:9527/welcome/index
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 2.6.14
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: jps
49
+ test_files: []