1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
#ifndef __setdest_h__
#define __setdest_h__
/*#include <sys/queue.h>*/
#include "../../../config.h"
#include "../../../lib/bsd-list.h"
#ifndef LIST_FIRST
#define LIST_FIRST(head) ((head)->lh_first)
#endif
#ifndef LIST_NEXT
#define LIST_NEXT(elm, field) ((elm)->field.le_next)
#endif
void ReadInMovementPattern(void);
class vector {
public:
vector(double x = 0.0, double y = 0.0, double z = 0.0) {
X = x; Y = y; Z = z;
}
double length() {
return sqrt(X*X + Y*Y + Z*Z);
}
inline void operator=(const vector a) {
X = a.X;
Y = a.Y;
Z = a.Z;
}
inline void operator+=(const vector a) {
X += a.X;
Y += a.Y;
Z += a.Z;
}
inline int operator==(const vector a) {
return (X == a.X && Y == a.Y && Z == a.Z);
}
inline int operator!=(const vector a) {
return (X != a.X || Y != a.Y || Z != a.Z);
}
inline vector operator-(const vector a) {
return vector(X-a.X, Y-a.Y, Z-a.Z);
}
friend inline vector operator*(const double a, const vector b) {
return vector(a*b.X, a*b.Y, a*b.Z);
}
friend inline vector operator/(const vector a, const double b) {
return vector(a.X/b, a.Y/b, a.Z/b);
}
double X;
double Y;
double Z;
};
class Neighbor {
public:
u_int32_t index; // index into NodeList
u_int32_t reachable; // != 0 --> reachable.
double time_transition; // next change
};
struct setdest {
double time;
double X, Y, Z;
double speed;
LIST_ENTRY(setdest) traj;
};
class Node {
friend void ReadInMovementPattern(void);
public:
Node(void);
void Update(void);
void UpdateNeighbors(void);
void Dump(void);
double time_arrival; // time of arrival at dest
double time_transition; // min of all neighbor times
// # of optimal route changes for this node
int route_changes;
int link_changes;
private:
void RandomPosition(void);
void RandomDestination(void);
void RandomSpeed(void);
u_int32_t index; // unique node identifier
u_int32_t first_trip; // 1 if first trip, 0 otherwise. (by J. Yoon)
vector position; // current position
vector destination; // destination
vector direction; // computed from pos and dest
double speed;
double time_update; // when pos last updated
static u_int32_t NodeIndex;
LIST_HEAD(traj, setdest) traj;
public:
// An array of NODES neighbors.
Neighbor *neighbor;
};
#endif /* __setdest_h__ */
|