15 #include "pointerEventList.h"
17 #include "config_event.h"
18 #include "clockObject.h"
19 #include "deg_2_rad.h"
30 INLINE
double delta_angle(
double angle1,
double angle2) {
31 double deltang = angle2 - angle1;
32 while (deltang < -180.0) deltang += 360.0;
33 while (deltang > 180.0) deltang -= 360.0;
44 INLINE
double normalize_angle(
double angle) {
45 while (angle < 0.0) angle += 360.0;
46 while (angle > 360.0) angle -= 360.0;
57 void PointerEventList::
58 output(ostream &out)
const {
59 if (_events.empty()) {
60 out <<
"(no pointers)";
62 Events::const_iterator ei;
66 while (ei != _events.end()) {
79 void PointerEventList::
80 write(ostream &out,
int indent_level)
const {
81 indent(out, indent_level) << _events.size() <<
" events:\n";
82 Events::const_iterator ei;
83 for (ei = _events.begin(); ei != _events.end(); ++ei) {
84 indent(out, indent_level + 2) << (*ei) <<
"\n";
96 add_event(
bool in_win,
int xpos,
int ypos,
int seq,
double time) {
98 pe._in_window = in_win;
103 if (_events.size() > 0) {
104 pe._dx = xpos - _events.back()._xpos;
105 pe._dy = ypos - _events.back()._ypos;
108 pe._length = csqrt(ddx*ddx + ddy*ddy);
109 if (pe._length > 0.0) {
110 pe._direction = normalize_angle(rad_2_deg(catan2(-ddy,ddx)));
112 pe._direction = _events.back()._direction;
114 pe._rotation = delta_angle(_events.back()._direction, pe._direction);
122 _events.push_back(pe);
133 int tot_events = _events.size();
134 if (tot_events < 3) {
137 int last = tot_events-1;
138 double dx = _events[last]._xpos - x;
139 double dy = _events[last]._ypos - y;
140 double lastang = rad_2_deg(catan2(dy, dx));
142 for (
int i=last; (i>=0) && (total < 360.0) && (total > -360.0); i--) {
143 dx = _events[i]._xpos - x;
144 dy = _events[i]._ypos - y;
145 if ((dx==0.0)&&(dy==0.0)) {
148 double angle = rad_2_deg(catan2(dy,dx));
149 double deltang = delta_angle(lastang, angle);
150 if (deltang * total < 0.0) {
156 return (total > 360.0) || (total < -360.0);
171 int pos = _events.size()-1;
173 while ((pos >= 0)&&(_events[pos]._time >= old)) {
174 double rot = _events[pos]._rotation;
175 if (rot < 0.0) rot = -rot;
200 vector_double pattern;
201 parse_pattern(ascpat, pattern);
204 for (
size_t i=0; i<pattern.size(); i++) {
205 pattern[i] = normalize_angle(pattern[i] + rot);
216 void PointerEventList::
217 parse_pattern(
const string &ascpat, vector_double &pattern) {
220 for (
size_t i=0; i<ascpat.size(); i++) {
223 if ((c==
'E')||(c==
'e')) ang=0.0;
224 else if ((c==
'N')||(c==
'n')) ang=90.0;
225 else if ((c==
'W')||(c==
'w')) ang=180.0;
226 else if ((c==
'S')||(c==
's')) ang=270.0;
228 double offset = delta_angle(dir, ang);
229 double newang = dir + offset;
230 dir = normalize_angle((dir * chars + newang) / (chars + 1));
233 if ((c !=
' ')&&(c !=
'\t')) {
234 event_cat.warning() <<
235 "Invalid pattern in PointerEventList::match_pattern\n";
240 pattern.push_back(dir);
247 pattern.push_back(dir);
251 for (
int i=0; i<(int)pattern.size(); i++) {
252 cerr << pattern[i] <<
" ";
static ClockObject * get_global_clock()
Returns a pointer to the global ClockObject.
double match_pattern(const string &pattern, double rot, double seglen)
This function is not implemented yet.
double get_frame_time(Thread *current_thread=Thread::get_current_thread()) const
Returns the time in seconds as of the last time tick() was called (typically, this will be as of the ...
void add_event(bool in_win, int xpos, int ypos, int seq, double time)
Adds a new event to the end of the list.
bool encircles(int x, int y) const
Returns true if the trail loops around the specified point.
double total_turns(double sec) const
returns the total angular deviation that the trail has made in the specified time period...
TypeHandle is the identifier used to differentiate C++ class types.
Records a pointer movement event.