Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/rvo2/rvo2_2d/RVOSimulator2d.h
9905 views
1
/*
2
* RVOSimulator2d.h
3
* RVO2 Library
4
*
5
* Copyright 2008 University of North Carolina at Chapel Hill
6
*
7
* Licensed under the Apache License, Version 2.0 (the "License");
8
* you may not use this file except in compliance with the License.
9
* You may obtain a copy of the License at
10
*
11
* http://www.apache.org/licenses/LICENSE-2.0
12
*
13
* Unless required by applicable law or agreed to in writing, software
14
* distributed under the License is distributed on an "AS IS" BASIS,
15
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
* See the License for the specific language governing permissions and
17
* limitations under the License.
18
*
19
* Please send all bug reports to <[email protected]>.
20
*
21
* The authors may be contacted via:
22
*
23
* Jur van den Berg, Stephen J. Guy, Jamie Snape, Ming C. Lin, Dinesh Manocha
24
* Dept. of Computer Science
25
* 201 S. Columbia St.
26
* Frederick P. Brooks, Jr. Computer Science Bldg.
27
* Chapel Hill, N.C. 27599-3175
28
* United States of America
29
*
30
* <http://gamma.cs.unc.edu/RVO2/>
31
*/
32
33
#ifndef RVO2D_RVO_SIMULATOR_H_
34
#define RVO2D_RVO_SIMULATOR_H_
35
36
/**
37
* \file RVOSimulator2d.h
38
* \brief Contains the RVOSimulator2D class.
39
*/
40
41
#include <cstddef>
42
#include <limits>
43
#include <vector>
44
45
#include "Vector2.h"
46
47
namespace RVO2D {
48
/**
49
* \brief Error value.
50
*
51
* A value equal to the largest unsigned integer that is returned in case
52
* of an error by functions in RVO2D::RVOSimulator2D.
53
*/
54
const size_t RVO2D_ERROR = std::numeric_limits<size_t>::max();
55
56
/**
57
* \brief Defines a directed line.
58
*/
59
class Line {
60
public:
61
/**
62
* \brief A point on the directed line.
63
*/
64
Vector2 point;
65
66
/**
67
* \brief The direction of the directed line.
68
*/
69
Vector2 direction;
70
};
71
72
class Agent2D;
73
class KdTree2D;
74
class Obstacle2D;
75
76
/**
77
* \brief Defines the simulation.
78
*
79
* The main class of the library that contains all simulation functionality.
80
*/
81
class RVOSimulator2D {
82
public:
83
/**
84
* \brief Constructs a simulator instance.
85
*/
86
RVOSimulator2D();
87
88
/**
89
* \brief Constructs a simulator instance and sets the default
90
* properties for any new agent that is added.
91
* \param timeStep The time step of the simulation.
92
* Must be positive.
93
* \param neighborDist The default maximum distance (center point
94
* to center point) to other agents a new agent
95
* takes into account in the navigation. The
96
* larger this number, the longer he running
97
* time of the simulation. If the number is too
98
* low, the simulation will not be safe. Must be
99
* non-negative.
100
* \param maxNeighbors The default maximum number of other agents a
101
* new agent takes into account in the
102
* navigation. The larger this number, the
103
* longer the running time of the simulation.
104
* If the number is too low, the simulation
105
* will not be safe.
106
* \param timeHorizon The default minimal amount of time for which
107
* a new agent's velocities that are computed
108
* by the simulation are safe with respect to
109
* other agents. The larger this number, the
110
* sooner an agent will respond to the presence
111
* of other agents, but the less freedom the
112
* agent has in choosing its velocities.
113
* Must be positive.
114
* \param timeHorizonObst The default minimal amount of time for which
115
* a new agent's velocities that are computed
116
* by the simulation are safe with respect to
117
* obstacles. The larger this number, the
118
* sooner an agent will respond to the presence
119
* of obstacles, but the less freedom the agent
120
* has in choosing its velocities.
121
* Must be positive.
122
* \param radius The default radius of a new agent.
123
* Must be non-negative.
124
* \param maxSpeed The default maximum speed of a new agent.
125
* Must be non-negative.
126
* \param velocity The default initial two-dimensional linear
127
* velocity of a new agent (optional).
128
*/
129
RVOSimulator2D(float timeStep, float neighborDist, size_t maxNeighbors,
130
float timeHorizon, float timeHorizonObst, float radius,
131
float maxSpeed, const Vector2 &velocity = Vector2());
132
133
/**
134
* \brief Destroys this simulator instance.
135
*/
136
~RVOSimulator2D();
137
138
/**
139
* \brief Adds a new agent with default properties to the
140
* simulation.
141
* \param position The two-dimensional starting position of
142
* this agent.
143
* \return The number of the agent, or RVO2D::RVO2D_ERROR when the agent
144
* defaults have not been set.
145
*/
146
size_t addAgent(const Vector2 &position);
147
148
/**
149
* \brief Adds a new agent to the simulation.
150
* \param position The two-dimensional starting position of
151
* this agent.
152
* \param neighborDist The maximum distance (center point to
153
* center point) to other agents this agent
154
* takes into account in the navigation. The
155
* larger this number, the longer the running
156
* time of the simulation. If the number is too
157
* low, the simulation will not be safe.
158
* Must be non-negative.
159
* \param maxNeighbors The maximum number of other agents this
160
* agent takes into account in the navigation.
161
* The larger this number, the longer the
162
* running time of the simulation. If the
163
* number is too low, the simulation will not
164
* be safe.
165
* \param timeHorizon The minimal amount of time for which this
166
* agent's velocities that are computed by the
167
* simulation are safe with respect to other
168
* agents. The larger this number, the sooner
169
* this agent will respond to the presence of
170
* other agents, but the less freedom this
171
* agent has in choosing its velocities.
172
* Must be positive.
173
* \param timeHorizonObst The minimal amount of time for which this
174
* agent's velocities that are computed by the
175
* simulation are safe with respect to
176
* obstacles. The larger this number, the
177
* sooner this agent will respond to the
178
* presence of obstacles, but the less freedom
179
* this agent has in choosing its velocities.
180
* Must be positive.
181
* \param radius The radius of this agent.
182
* Must be non-negative.
183
* \param maxSpeed The maximum speed of this agent.
184
* Must be non-negative.
185
* \param velocity The initial two-dimensional linear velocity
186
* of this agent (optional).
187
* \return The number of the agent.
188
*/
189
size_t addAgent(const Vector2 &position, float neighborDist,
190
size_t maxNeighbors, float timeHorizon,
191
float timeHorizonObst, float radius, float maxSpeed,
192
const Vector2 &velocity = Vector2());
193
194
/**
195
* \brief Adds a new obstacle to the simulation.
196
* \param vertices List of the vertices of the polygonal
197
* obstacle in counterclockwise order.
198
* \return The number of the first vertex of the obstacle,
199
* or RVO2D::RVO2D_ERROR when the number of vertices is less than two.
200
* \note To add a "negative" obstacle, e.g. a bounding polygon around
201
* the environment, the vertices should be listed in clockwise
202
* order.
203
*/
204
size_t addObstacle(const std::vector<Vector2> &vertices);
205
206
/**
207
* \brief Lets the simulator perform a simulation step and updates the
208
* two-dimensional position and two-dimensional velocity of
209
* each agent.
210
*/
211
void doStep();
212
213
/**
214
* \brief Returns the specified agent neighbor of the specified
215
* agent.
216
* \param agentNo The number of the agent whose agent
217
* neighbor is to be retrieved.
218
* \param neighborNo The number of the agent neighbor to be
219
* retrieved.
220
* \return The number of the neighboring agent.
221
*/
222
size_t getAgentAgentNeighbor(size_t agentNo, size_t neighborNo) const;
223
224
/**
225
* \brief Returns the maximum neighbor count of a specified agent.
226
* \param agentNo The number of the agent whose maximum
227
* neighbor count is to be retrieved.
228
* \return The present maximum neighbor count of the agent.
229
*/
230
size_t getAgentMaxNeighbors(size_t agentNo) const;
231
232
/**
233
* \brief Returns the maximum speed of a specified agent.
234
* \param agentNo The number of the agent whose maximum speed
235
* is to be retrieved.
236
* \return The present maximum speed of the agent.
237
*/
238
float getAgentMaxSpeed(size_t agentNo) const;
239
240
/**
241
* \brief Returns the maximum neighbor distance of a specified
242
* agent.
243
* \param agentNo The number of the agent whose maximum
244
* neighbor distance is to be retrieved.
245
* \return The present maximum neighbor distance of the agent.
246
*/
247
float getAgentNeighborDist(size_t agentNo) const;
248
249
/**
250
* \brief Returns the count of agent neighbors taken into account to
251
* compute the current velocity for the specified agent.
252
* \param agentNo The number of the agent whose count of agent
253
* neighbors is to be retrieved.
254
* \return The count of agent neighbors taken into account to compute
255
* the current velocity for the specified agent.
256
*/
257
size_t getAgentNumAgentNeighbors(size_t agentNo) const;
258
259
/**
260
* \brief Returns the count of obstacle neighbors taken into account
261
* to compute the current velocity for the specified agent.
262
* \param agentNo The number of the agent whose count of
263
* obstacle neighbors is to be retrieved.
264
* \return The count of obstacle neighbors taken into account to
265
* compute the current velocity for the specified agent.
266
*/
267
size_t getAgentNumObstacleNeighbors(size_t agentNo) const;
268
269
270
/**
271
* \brief Returns the count of ORCA constraints used to compute
272
* the current velocity for the specified agent.
273
* \param agentNo The number of the agent whose count of ORCA
274
* constraints is to be retrieved.
275
* \return The count of ORCA constraints used to compute the current
276
* velocity for the specified agent.
277
*/
278
size_t getAgentNumORCALines(size_t agentNo) const;
279
280
/**
281
* \brief Returns the specified obstacle neighbor of the specified
282
* agent.
283
* \param agentNo The number of the agent whose obstacle
284
* neighbor is to be retrieved.
285
* \param neighborNo The number of the obstacle neighbor to be
286
* retrieved.
287
* \return The number of the first vertex of the neighboring obstacle
288
* edge.
289
*/
290
size_t getAgentObstacleNeighbor(size_t agentNo, size_t neighborNo) const;
291
292
/**
293
* \brief Returns the specified ORCA constraint of the specified
294
* agent.
295
* \param agentNo The number of the agent whose ORCA
296
* constraint is to be retrieved.
297
* \param lineNo The number of the ORCA constraint to be
298
* retrieved.
299
* \return A line representing the specified ORCA constraint.
300
* \note The halfplane to the left of the line is the region of
301
* permissible velocities with respect to the specified
302
* ORCA constraint.
303
*/
304
const Line &getAgentORCALine(size_t agentNo, size_t lineNo) const;
305
306
/**
307
* \brief Returns the two-dimensional position of a specified
308
* agent.
309
* \param agentNo The number of the agent whose
310
* two-dimensional position is to be retrieved.
311
* \return The present two-dimensional position of the (center of the)
312
* agent.
313
*/
314
const Vector2 &getAgentPosition(size_t agentNo) const;
315
316
/**
317
* \brief Returns the two-dimensional preferred velocity of a
318
* specified agent.
319
* \param agentNo The number of the agent whose
320
* two-dimensional preferred velocity is to be
321
* retrieved.
322
* \return The present two-dimensional preferred velocity of the agent.
323
*/
324
const Vector2 &getAgentPrefVelocity(size_t agentNo) const;
325
326
/**
327
* \brief Returns the radius of a specified agent.
328
* \param agentNo The number of the agent whose radius is to
329
* be retrieved.
330
* \return The present radius of the agent.
331
*/
332
float getAgentRadius(size_t agentNo) const;
333
334
/**
335
* \brief Returns the time horizon of a specified agent.
336
* \param agentNo The number of the agent whose time horizon
337
* is to be retrieved.
338
* \return The present time horizon of the agent.
339
*/
340
float getAgentTimeHorizon(size_t agentNo) const;
341
342
/**
343
* \brief Returns the time horizon with respect to obstacles of a
344
* specified agent.
345
* \param agentNo The number of the agent whose time horizon
346
* with respect to obstacles is to be
347
* retrieved.
348
* \return The present time horizon with respect to obstacles of the
349
* agent.
350
*/
351
float getAgentTimeHorizonObst(size_t agentNo) const;
352
353
/**
354
* \brief Returns the two-dimensional linear velocity of a
355
* specified agent.
356
* \param agentNo The number of the agent whose
357
* two-dimensional linear velocity is to be
358
* retrieved.
359
* \return The present two-dimensional linear velocity of the agent.
360
*/
361
const Vector2 &getAgentVelocity(size_t agentNo) const;
362
363
/**
364
* \brief Returns the global time of the simulation.
365
* \return The present global time of the simulation (zero initially).
366
*/
367
float getGlobalTime() const;
368
369
/**
370
* \brief Returns the count of agents in the simulation.
371
* \return The count of agents in the simulation.
372
*/
373
size_t getNumAgents() const;
374
375
/**
376
* \brief Returns the count of obstacle vertices in the simulation.
377
* \return The count of obstacle vertices in the simulation.
378
*/
379
size_t getNumObstacleVertices() const;
380
381
/**
382
* \brief Returns the two-dimensional position of a specified obstacle
383
* vertex.
384
* \param vertexNo The number of the obstacle vertex to be
385
* retrieved.
386
* \return The two-dimensional position of the specified obstacle
387
* vertex.
388
*/
389
const Vector2 &getObstacleVertex(size_t vertexNo) const;
390
391
/**
392
* \brief Returns the number of the obstacle vertex succeeding the
393
* specified obstacle vertex in its polygon.
394
* \param vertexNo The number of the obstacle vertex whose
395
* successor is to be retrieved.
396
* \return The number of the obstacle vertex succeeding the specified
397
* obstacle vertex in its polygon.
398
*/
399
size_t getNextObstacleVertexNo(size_t vertexNo) const;
400
401
/**
402
* \brief Returns the number of the obstacle vertex preceding the
403
* specified obstacle vertex in its polygon.
404
* \param vertexNo The number of the obstacle vertex whose
405
* predecessor is to be retrieved.
406
* \return The number of the obstacle vertex preceding the specified
407
* obstacle vertex in its polygon.
408
*/
409
size_t getPrevObstacleVertexNo(size_t vertexNo) const;
410
411
/**
412
* \brief Returns the time step of the simulation.
413
* \return The present time step of the simulation.
414
*/
415
float getTimeStep() const;
416
417
/**
418
* \brief Processes the obstacles that have been added so that they
419
* are accounted for in the simulation.
420
* \note Obstacles added to the simulation after this function has
421
* been called are not accounted for in the simulation.
422
*/
423
void processObstacles();
424
425
/**
426
* \brief Performs a visibility query between the two specified
427
* points with respect to the obstacles
428
* \param point1 The first point of the query.
429
* \param point2 The second point of the query.
430
* \param radius The minimal distance between the line
431
* connecting the two points and the obstacles
432
* in order for the points to be mutually
433
* visible (optional). Must be non-negative.
434
* \return A boolean specifying whether the two points are mutually
435
* visible. Returns true when the obstacles have not been
436
* processed.
437
*/
438
bool queryVisibility(const Vector2 &point1, const Vector2 &point2,
439
float radius = 0.0f) const;
440
441
/**
442
* \brief Sets the default properties for any new agent that is
443
* added.
444
* \param neighborDist The default maximum distance (center point
445
* to center point) to other agents a new agent
446
* takes into account in the navigation. The
447
* larger this number, the longer he running
448
* time of the simulation. If the number is too
449
* low, the simulation will not be safe.
450
* Must be non-negative.
451
* \param maxNeighbors The default maximum number of other agents a
452
* new agent takes into account in the
453
* navigation. The larger this number, the
454
* longer the running time of the simulation.
455
* If the number is too low, the simulation
456
* will not be safe.
457
* \param timeHorizon The default minimal amount of time for which
458
* a new agent's velocities that are computed
459
* by the simulation are safe with respect to
460
* other agents. The larger this number, the
461
* sooner an agent will respond to the presence
462
* of other agents, but the less freedom the
463
* agent has in choosing its velocities.
464
* Must be positive.
465
* \param timeHorizonObst The default minimal amount of time for which
466
* a new agent's velocities that are computed
467
* by the simulation are safe with respect to
468
* obstacles. The larger this number, the
469
* sooner an agent will respond to the presence
470
* of obstacles, but the less freedom the agent
471
* has in choosing its velocities.
472
* Must be positive.
473
* \param radius The default radius of a new agent.
474
* Must be non-negative.
475
* \param maxSpeed The default maximum speed of a new agent.
476
* Must be non-negative.
477
* \param velocity The default initial two-dimensional linear
478
* velocity of a new agent (optional).
479
*/
480
void setAgentDefaults(float neighborDist, size_t maxNeighbors,
481
float timeHorizon, float timeHorizonObst,
482
float radius, float maxSpeed,
483
const Vector2 &velocity = Vector2());
484
485
/**
486
* \brief Sets the maximum neighbor count of a specified agent.
487
* \param agentNo The number of the agent whose maximum
488
* neighbor count is to be modified.
489
* \param maxNeighbors The replacement maximum neighbor count.
490
*/
491
void setAgentMaxNeighbors(size_t agentNo, size_t maxNeighbors);
492
493
/**
494
* \brief Sets the maximum speed of a specified agent.
495
* \param agentNo The number of the agent whose maximum speed
496
* is to be modified.
497
* \param maxSpeed The replacement maximum speed. Must be
498
* non-negative.
499
*/
500
void setAgentMaxSpeed(size_t agentNo, float maxSpeed);
501
502
/**
503
* \brief Sets the maximum neighbor distance of a specified agent.
504
* \param agentNo The number of the agent whose maximum
505
* neighbor distance is to be modified.
506
* \param neighborDist The replacement maximum neighbor distance.
507
* Must be non-negative.
508
*/
509
void setAgentNeighborDist(size_t agentNo, float neighborDist);
510
511
/**
512
* \brief Sets the two-dimensional position of a specified agent.
513
* \param agentNo The number of the agent whose
514
* two-dimensional position is to be modified.
515
* \param position The replacement of the two-dimensional
516
* position.
517
*/
518
void setAgentPosition(size_t agentNo, const Vector2 &position);
519
520
/**
521
* \brief Sets the two-dimensional preferred velocity of a
522
* specified agent.
523
* \param agentNo The number of the agent whose
524
* two-dimensional preferred velocity is to be
525
* modified.
526
* \param prefVelocity The replacement of the two-dimensional
527
* preferred velocity.
528
*/
529
void setAgentPrefVelocity(size_t agentNo, const Vector2 &prefVelocity);
530
531
/**
532
* \brief Sets the radius of a specified agent.
533
* \param agentNo The number of the agent whose radius is to
534
* be modified.
535
* \param radius The replacement radius.
536
* Must be non-negative.
537
*/
538
void setAgentRadius(size_t agentNo, float radius);
539
540
/**
541
* \brief Sets the time horizon of a specified agent with respect
542
* to other agents.
543
* \param agentNo The number of the agent whose time horizon
544
* is to be modified.
545
* \param timeHorizon The replacement time horizon with respect
546
* to other agents. Must be positive.
547
*/
548
void setAgentTimeHorizon(size_t agentNo, float timeHorizon);
549
550
/**
551
* \brief Sets the time horizon of a specified agent with respect
552
* to obstacles.
553
* \param agentNo The number of the agent whose time horizon
554
* with respect to obstacles is to be modified.
555
* \param timeHorizonObst The replacement time horizon with respect to
556
* obstacles. Must be positive.
557
*/
558
void setAgentTimeHorizonObst(size_t agentNo, float timeHorizonObst);
559
560
/**
561
* \brief Sets the two-dimensional linear velocity of a specified
562
* agent.
563
* \param agentNo The number of the agent whose
564
* two-dimensional linear velocity is to be
565
* modified.
566
* \param velocity The replacement two-dimensional linear
567
* velocity.
568
*/
569
void setAgentVelocity(size_t agentNo, const Vector2 &velocity);
570
571
/**
572
* \brief Sets the time step of the simulation.
573
* \param timeStep The time step of the simulation.
574
* Must be positive.
575
*/
576
void setTimeStep(float timeStep);
577
578
public:
579
std::vector<Agent2D *> agents_;
580
Agent2D *defaultAgent_;
581
float globalTime_;
582
KdTree2D *kdTree_;
583
std::vector<Obstacle2D *> obstacles_;
584
float timeStep_;
585
586
friend class Agent2D;
587
friend class KdTree2D;
588
friend class Obstacle2D;
589
};
590
}
591
592
#endif /* RVO2D_RVO_SIMULATOR_H_ */
593
594