Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
loeasy68
GitHub Repository: loeasy68/loeasy68.github.io
Path: blob/main/website/GAUSS/js/walkbox-manager.js
2941 views
1
var WalkBox = function(id)
2
{
3
this.id = id;
4
this.visible = true;
5
this.polygon = new Polygon();
6
this.maxScaleFactor = 100;
7
this.minScaleFactor = 100;
8
this.deltaScale = 1;
9
this.walkingSound = null;
10
this.neighbors = [];
11
};
12
13
var Neighbor = function(wbId, commonEdge)
14
{
15
this.wbId = wbId;
16
this.commonEdge = commonEdge;
17
};
18
19
var Polygon = function()
20
{
21
this.points = [];
22
this.edges = [];
23
this.closed = false;
24
this.centroid = null;
25
this.top = null;
26
this.bottom = null;
27
this.close = function()
28
{
29
this.closed = true;
30
var points = this.points;
31
for(var i = 0; i < points.length; i++)
32
this.edges[i] = [points[i], points[(i + 1) % points.length]];
33
34
this.centroid = getPolygonCentroid(this);
35
var topAndBottom = getPolygonTopAndBottom(this);
36
this.top = topAndBottom.top;
37
this.bottom = topAndBottom.bottom;
38
};
39
this.getNearestPointToEdge = function(p, vertex1, vertex2)
40
{
41
var sqr = function(x) { return x * x; };
42
var l2 = sqr(vertex1.getDistance(vertex2));
43
if (l2 == 0) return vertex1;
44
var t = ((p.x - vertex1.x) * (vertex2.x - vertex1.x) + (p.y - vertex1.y) * (vertex2.y - vertex1.y)) / l2;
45
if (t < 0) return vertex1;
46
if (t > 1) return vertex2;
47
return new paper.Point(vertex1.x + t * (vertex2.x - vertex1.x), vertex1.y + t * (vertex2.y - vertex1.y));
48
};
49
this.getNearestPoint = function(p)
50
{
51
var list = [];
52
53
for(var i = 0; i < this.edges.length; i++)
54
list.push(this.getNearestPointToEdge(p, this.edges[i][0], this.edges[i][1]));
55
56
var minDist = Number.MAX_VALUE;
57
var minIdx = -1;
58
59
for(var i = 0; i < list.length; i++)
60
{
61
var dist = getDistanceFromPoints(p, list[i]);
62
if(minDist > dist)
63
{
64
minDist = dist;
65
minIdx = i;
66
}
67
}
68
69
return list[minIdx];
70
};
71
};
72
73
var Point = function(x, y)
74
{
75
this.x = x;
76
this.y = y;
77
};
78
79
var highlightCloseVertex = function(p, wb, precision)
80
{
81
var points = wb.polygon.points;
82
for(var i = 0; i < points.length; i++)
83
if(p.x >= points[i].x - precision && p.x < points[i].x + precision)
84
if(p.y >= points[i].y - precision && p.y < points[i].y + precision)
85
{
86
wb.polygon.points[i].highlight = true;
87
return;
88
}
89
};
90
91
var resetVertexHighlighting = function(wb)
92
{
93
var points = wb.polygon.points;
94
for(var i = 0; i < points.length; i++)
95
wb.polygon.points[i].highlight = false;
96
};
97
98
var resetVertexLocking = function(wb)
99
{
100
var points = wb.polygon.points;
101
for(var i = 0; i < points.length; i++)
102
wb.polygon.points[i].locked = false;
103
};
104
105
var getHighlightedWalkboxVertex = function(wboxes)
106
{
107
for(var i in wboxes)
108
{
109
var points = wboxes[i].polygon.points;
110
for(var j = 0; j < points.length; j++)
111
if(points[j].highlight)
112
return { wboxId : i, point : points[j] };
113
}
114
return null;
115
};
116
117
var getLockedWalkboxVertex = function(wboxes)
118
{
119
for(var i in wboxes)
120
{
121
var points = wboxes[i].polygon.points;
122
for(var j = 0; j < points.length; j++)
123
if(points[j].locked)
124
return { wboxId : i, point : points[j] };
125
}
126
return null;
127
};
128
129
var changeLockedWalkboxVertexPosition = function(wboxes, wboxId, x, y)
130
{
131
var poly = wboxes[wboxId].polygon;
132
var points = poly.points;
133
for(var j = 0; j < points.length; j++)
134
if(points[j].locked)
135
{
136
points[j].x = x;
137
points[j].y = y;
138
}
139
if(poly.closed === true)
140
poly.close();
141
};
142
143
var isPointOnLine = function(edge, p, precision)
144
{
145
var edgePointA = edge[0];
146
var edgePointB = edge[1];
147
148
var dist = Math.abs((edgePointB.y - edgePointA.y) * p.x - (edgePointB.x - edgePointA.x) * p.y + edgePointB.x * edgePointA.y
149
- edgePointB.y * edgePointA.x) / Math.sqrt(Math.pow(edgePointB.y - edgePointA.y, 2)
150
+ Math.pow(edgePointB.x - edgePointA.x, 2));
151
152
var maxX = Math.max(edgePointA.x, edgePointB.x);
153
var minX = Math.min(edgePointA.x, edgePointB.x);
154
var maxY = Math.max(edgePointA.y, edgePointB.y);
155
var minY = Math.min(edgePointA.y, edgePointB.y);
156
157
if(dist <= precision && (p.x >= minX - 5 && p.x < maxX + 5 && p.y >= minY -5 && p.y < maxY + 5))
158
return true;
159
};
160
161
162
var highlightCloseEdge = function(p, wb, precision)
163
{
164
var edges = wb.polygon.edges;
165
for(var i = 0; i < edges.length; i++)
166
if(isPointOnLine(edges[i], p, precision))
167
{
168
wb.polygon.edges[i].highlight = true;
169
return;
170
}
171
};
172
173
var getHighlightedWalkboxEdge = function(wboxes)
174
{
175
for(var i in wboxes)
176
{
177
var edges = wboxes[i].polygon.edges;
178
for(var j = 0; j < edges.length; j++)
179
if(edges[j].highlight)
180
return { wboxId : i, edge : edges[j] };
181
}
182
return null;
183
};
184
185
var lockVertex = function(wb, p)
186
{
187
var points = wb.polygon.points;
188
for(var i = 0; i < points.length; i++)
189
if(p.x == points[i].x && p.y == points[i].y)
190
{
191
wb.polygon.points[i].locked = true;
192
return;
193
}
194
};
195
196
var resetEdgeHighlighting = function(wb)
197
{
198
var edges = wb.polygon.edges;
199
for(var i = 0; i < edges.length; i++)
200
wb.polygon.edges[i].highlight = false;
201
};
202
203
var splitEdge = function(wb, edge, newPoint)
204
{
205
var edges = wb.polygon.edges;
206
var points = wb.polygon.points;
207
var x1 = edge[0].x, y1 = edge[0].y;
208
for(var i = 0; i < edges.length; i++)
209
if(edges[i][0].x == edge[0].x && edges[i][0].y == edge[0].y
210
&& edges[i][1].x == edge[1].x && edges[i][1].y == edge[1].y)
211
{
212
wb.polygon.edges.splice(i, 0, [edge[0], new paper.Point(newPoint.x, newPoint.y)]);
213
wb.polygon.edges[i + 1][0] = new paper.Point(newPoint.x, newPoint.y);
214
break;
215
}
216
for(var i = 0; i < points.length; i++)
217
if(points[i].x == x1 && points[i].y == y1)
218
{
219
wb.polygon.points.splice(i + 1, 0, new paper.Point(newPoint.x, newPoint.y));
220
break;
221
}
222
};
223
224
var getPolygonCentroid = function(poly)
225
{
226
var p = new paper.Point(0, 0);
227
var points = poly.points;
228
229
for(var i = 0; i < points.length; i++)
230
{
231
p.x += points[i].x;
232
p.y += points[i].y;
233
}
234
235
p.x /= points.length;
236
p.y /= points.length;
237
238
return p;
239
};
240
241
var getPolygonTopAndBottom = function(poly)
242
{
243
var points = poly.points;
244
var minY = points[0].y;
245
var maxY = points[0].y;
246
247
for(var i = 1; i < points.length; i++)
248
{
249
if(minY > points[i].y)
250
minY = points[i].y;
251
if(maxY < points[i].y)
252
maxY = points[i].y;
253
}
254
255
return { top : minY, bottom : maxY };
256
};
257
258
var getEdgeList = function(room)
259
{
260
var edges = {};
261
for (var key in room.walkBoxes)
262
{
263
var _edges = room.walkBoxes[key].polygon.edges;
264
for (var i = 0; i < _edges.length; i++)
265
{
266
var edge_str1 = '(' + _edges[i][0].x + ', ' + _edges[i][0].y + ')';
267
var edge_str2 = '(' + _edges[i][1].x + ', ' + _edges[i][1].y + ')';
268
var tmp = edge_str1 + ', ' + edge_str2;
269
if (tmp in edges)
270
edges[tmp]['IDs'].push(key);
271
else
272
{
273
tmp = edge_str2 + ', ' + edge_str1;
274
if (tmp in edges)
275
edges[tmp]['IDs'].push(key);
276
else
277
edges[tmp] = {IDs: [key], edge: _edges[i] };
278
}
279
}
280
}
281
return edges;
282
};
283
284
var computeWalkboxNeighbors = function(rooms)
285
{
286
for(var i in rooms)
287
{
288
var edgeList = getEdgeList(rooms[i]);
289
for(var key in edgeList)
290
if(edgeList[key].IDs.length > 1)
291
{
292
var IDs = edgeList[key].IDs;
293
var neighborsList = rooms[i].walkBoxes[IDs[0]].neighbors;
294
var alreadyPresent = false;
295
for(var j = 0; j < neighborsList.length; j++)
296
if(neighborsList[j].wbId === IDs[1]) // has the neighbor already been added?
297
{
298
alreadyPresent = true;
299
break;
300
}
301
302
if(alreadyPresent === true)
303
continue;
304
rooms[i].walkBoxes[IDs[0]].neighbors.push(new Neighbor(IDs[1], edgeList[key].edge));
305
rooms[i].walkBoxes[IDs[1]].neighbors.push(new Neighbor(IDs[0], edgeList[key].edge));
306
}
307
}
308
309
};
310
311
var getWalkboxFromPoint = function(wboxes, p, skipInvisible)
312
{
313
for(var i in wboxes)
314
{
315
if(skipInvisible === true && wboxes[i].visible === false)
316
continue;
317
if (isPointInPoly(wboxes[i].polygon.points, p))
318
return wboxes[i];
319
}
320
return null;
321
};
322
323
var getCommonEdge = function(wb1, wb2)
324
{
325
var edge1 = null, edge2 = null;
326
327
for(var i = 0; i < wb1.neighbors.length; i++)
328
{
329
var n = wb1.neighbors[i];
330
if(n.wbId === wb2.id)
331
{
332
edge1 = n.commonEdge;
333
break;
334
}
335
}
336
337
if(!edge1)
338
return null;
339
340
for(var i = 0; i < wb2.neighbors.length; i++)
341
{
342
var n = wb2.neighbors[i];
343
if(n.wbId === wb1.id)
344
{
345
edge2 = n.commonEdge;
346
break;
347
}
348
}
349
350
if(!edge2)
351
return null;
352
353
if(edge1 !== edge2)
354
return null;
355
356
return edge1;
357
};
358
359
var getNearestWalkBox = function(wboxes, point)
360
{
361
var wb;
362
var minDist = Infinity;
363
var p;
364
365
for(var i in wboxes)
366
{
367
if(wboxes[i].visible === false)
368
continue;
369
p = wboxes[i].polygon.getNearestPoint(point);
370
var dist = getDistanceBetweenPoints(p, point);
371
if (dist < minDist)
372
{
373
minDist = dist;
374
wb = wboxes[i];
375
}
376
}
377
return wb;
378
};
379
380
var deleteWalkbox = function(roomId, wbId)
381
{
382
delete editorMapIdRoom[roomId].walkBoxes[wbId];
383
};
384