ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/test/brains/StuntDouble.hpp
Revision: 1640
Committed: Sat Oct 23 23:09:46 2004 UTC (19 years, 8 months ago) by tim
File size: 28307 byte(s)
Log Message:
Refactoring in progress

File Contents

# User Rev Content
1 tim 1639 /*
2     * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project
3     *
4     * Contact: oopse@oopse.org
5     *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU Lesser General Public License
8     * as published by the Free Software Foundation; either version 2.1
9     * of the License, or (at your option) any later version.
10     * All we ask is that proper credit is given for our work, which includes
11     * - but is not limited to - adding the above copyright notice to the beginning
12     * of your source code files, and to any copyright notice that you may distribute
13     * with programs based on this work.
14     *
15     * This program is distributed in the hope that it will be useful,
16     * but WITHOUT ANY WARRANTY; without even the implied warranty of
17     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18     * GNU Lesser General Public License for more details.
19     *
20     * You should have received a copy of the GNU Lesser General Public License
21     * along with this program; if not, write to the Free Software
22     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23     *
24     */
25 tim 1640
26     /**
27     * @file StuntDouble.hpp
28     * @author tlin
29     * @date 10/22/2004
30     * @version 1.0
31     */
32    
33 tim 1639 #ifndef _STUNTDOUBLE_HPP_
34     #define _STUNTDOUBLE_HPP_
35    
36     #include <vector>
37    
38     #include <core/BaseVisitor.hpp>
39     #include <math/Quaternion.hpp>
40 tim 1640 #include <math/SquareMatrix3.hpp>
41     #include <math/Vector3.hpp>
42     #include <utils/PropertyMap.hpp>
43 tim 1639
44     namespace oopse{
45    
46 tim 1640
47    
48 tim 1639 /**
49 tim 1640 * @class StuntDouble StuntDouble.hpp "Primitives/StuntDouble.hpp"
50     * @brief
51     * StuntDouble is a very strange idea. A StuntDouble stands in for
52     * some object that can be manipulated by the Integrators or
53     * Minimizers. Some of the manipulable objects are Atoms, some are
54     * DirectionalAtoms, and some are RigidBodies. StuntDouble
55     * provides an interface for the Integrators and Minimizers to use,
56     * and does some preliminary sanity checking so that the program
57     * doesn't try to do something stupid like torque an Atom
58     * @note the dynamoc data of stuntdouble will be stored outside of the class
59 tim 1639 */
60     class StuntDouble{
61 tim 1640 public:
62 tim 1639
63 tim 1640 enum ObjectType{
64     otAtom,
65     otDAtom,
66     otRigidBody
67     };
68    
69     virtual ~StuntDouble();
70    
71 tim 1639 /**
72     * Returns the global index of this stuntdouble.
73     * @return the global index of this stuntdouble
74     */
75     int getGlobalIndex() {
76     return globalIndex_;
77     }
78    
79     /**
80     * Sets the global index of this stuntdouble.
81     * @param new global index to be set
82     */
83     void setGlobalIndex(int index) {
84     return globalIndex_;
85     }
86    
87     /**
88     * Returns the local index of this stuntdouble
89     * @return the local index of this stuntdouble
90     */
91     int getLocalIndex() {
92     return localIndex_;
93     }
94    
95     /**
96     * Sets the local index of this stuntdouble
97     * @param index new index to be set
98     */
99     void setLocalIndex(int index) {
100     localIndex_ = index;
101     }
102    
103 tim 1640 /**
104     * Tests if this stuntdouble is an atom
105     * @return true is this stuntdouble is an atom(or a directional atom), return false otherwise
106     */
107     bool isAtom(){
108     return objType_ == otAtom || objType_ == otDAtom;
109     }
110    
111     /**
112     * Tests if this stuntdouble is an directional atom
113     * @return true if this stuntdouble is an directional atom, return false otherwise
114     */
115     bool isDirectionalAtom(){
116     return objType_ == otDAtom;
117     }
118    
119     /**
120     * Tests if this stuntdouble is a rigid body.
121     * @return true if this stuntdouble is a rigid body, otherwise return false
122     */
123     bool isRigidBody(){
124     return objType_ == otRigidBody;
125     }
126    
127     /**
128     * Tests if this stuntdouble is a directional one.
129     * @return true is this stuntdouble is a directional atom or a rigid body, return false otherwise
130     */
131     bool isDirectional(){
132     return isDirectionalAtom() || isRigidBody();
133     }
134    
135 tim 1639 /**
136 tim 1640 * Returns the previous position of this stuntdouble
137 tim 1639 * @return the position of this stuntdouble
138     */
139     void Vector3d getPrevPos() {
140 tim 1640 return (snapshotMan_->getPrevSnapshot())->storage_->position[LocalIndex_];
141 tim 1639 }
142    
143     /**
144 tim 1640 * Returns the current position of this stuntdouble
145 tim 1639 * @return the position of this stuntdouble
146     */
147     void Vector3d getPos() {
148 tim 1640 return (snapshotMan_->getCurrentSnapshot())->storage_->position[LocalIndex_];
149 tim 1639 }
150    
151     /**
152 tim 1640 * Returns the position of this stuntdouble in specified snapshot
153 tim 1639 * @return the position of this stuntdouble
154     * @param snapshotNo
155     */
156     Vector3d getPos(int snapshotNo) {
157 tim 1640 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->position[LocalIndex_];
158 tim 1639 }
159    
160     /**
161     * Sets the previous position of this stuntdouble
162     * @param pos new position
163     * @see #getPos
164     */
165     void setPrevPos(const Vector3d& pos) {
166 tim 1640 (snapshotMan_->getPrevSnapshot())->storage_->position[LocalIndex_] = pos;
167 tim 1639 }
168    
169     /**
170     * Sets the current position of this stuntdouble
171     * @param pos new position
172     */
173     void setPos(const Vector3d& pos) {
174 tim 1640 (snapshotMan_->getCurrentSnapshot())->storage_->position[LocalIndex_] = pos;
175 tim 1639 }
176    
177     /**
178     * Sets the position of this stuntdouble in specified snapshot
179     * @param pos position to be set
180     * @param snapshotNo
181     * @see #getPos
182     */
183     void setPos(const Vector3d& pos, int snapshotNo) {
184 tim 1640 (snapshotMan_->getSnapshot(snapshotNo))->storage_->position[LocalIndex_] = pos;
185 tim 1639 }
186    
187     /**
188 tim 1640 * Returns the previous velocity of this stuntdouble
189 tim 1639 * @return the velocity of this stuntdouble
190     */
191     Vector3d getPrevVel() {
192 tim 1640 return (snapshotMan_->getPrevSnapshot())->storage_->velocity[LocalIndex_];
193 tim 1639 }
194    
195     /**
196 tim 1640 * Returns the current velocity of this stuntdouble
197 tim 1639 * @return the velocity of this stuntdouble
198     */
199     Vector3d getVel() {
200 tim 1640 return (snapshotMan_->getCurrentSnapshot())->storage_->velocity[LocalIndex_];
201 tim 1639 }
202    
203     /**
204 tim 1640 * Returns the velocity of this stuntdouble in specified snapshot
205 tim 1639 * @return the velocity of this stuntdouble
206     * @param snapshotNo
207     */
208     Vector3d getVel(int snapshotNo) {
209 tim 1640 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->velocity[LocalIndex_];
210 tim 1639 }
211    
212     /**
213     * Sets the previous velocity of this stuntdouble
214     * @param vel new velocity
215     * @see #getVel
216     */
217     void setPrevVel(const Vector3d& vel) {
218 tim 1640 (snapshotMan_->getPrevSnapshot())->storage_->velocity[LocalIndex_] = vel;
219 tim 1639 }
220    
221     /**
222     * Sets the current velocity of this stuntdouble
223     * @param vel new velocity
224     */
225     void setVel(const Vector3d& vel) {
226 tim 1640 (snapshotMan_->getCurrentSnapshot())->storage_->velocity[LocalIndex_] = vel;
227 tim 1639 }
228    
229     /**
230     * Sets the velocity of this stuntdouble in specified snapshot
231     * @param vel velocity to be set
232     * @param snapshotNo
233     * @see #getVel
234     */
235     void setVel(const Vector3d& vel, int snapshotNo) {
236 tim 1640 (snapshotMan_->getSnapshot(snapshotNo))->storage_->velocity[LocalIndex_] = vel;
237 tim 1639 }
238    
239     /**
240 tim 1640 * Returns the previous rotation matrix of this stuntdouble
241 tim 1639 * @return the rotation matrix of this stuntdouble
242     */
243     RotMat3x3d getPrevA() {
244 tim 1640 return (snapshotMan_->getPrevSnapshot())->storage_->aMat[LocalIndex_];
245 tim 1639 }
246    
247     /**
248 tim 1640 * Returns the current rotation matrix of this stuntdouble
249 tim 1639 * @return the rotation matrix of this stuntdouble
250     */
251     RotMat3x3d getA() {
252 tim 1640 return (snapshotMan_->getCurrentSnapshot())->storage_->aMat[LocalIndex_];
253 tim 1639 }
254    
255     /**
256 tim 1640 * Returns the rotation matrix of this stuntdouble in specified snapshot
257 tim 1639 *
258     * @return the rotation matrix of this stuntdouble
259     * @param snapshotNo
260     */
261     RotMat3x3d getA(int snapshotNo) {
262 tim 1640 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->aMat[LocalIndex_];
263 tim 1639 }
264    
265     /**
266     * Sets the previous rotation matrix of this stuntdouble
267     * @param a new rotation matrix
268     * @see #getA
269     */
270     void setPrevA(const RotMat3x3d& a) {
271 tim 1640 (snapshotMan_->getPrevSnapshot())->storage_->aMat[LocalIndex_] = a;
272 tim 1639 }
273    
274     /**
275     * Sets the current rotation matrix of this stuntdouble
276     * @param a new rotation matrix
277     */
278     void setA(const RotMat3x3d& a) {
279 tim 1640 (snapshotMan_->getCurrentSnapshot())->storage_->aMat[LocalIndex_] = a;
280 tim 1639 }
281    
282     /**
283     * Sets the rotation matrix of this stuntdouble in specified snapshot
284     * @param a rotation matrix to be set
285     * @param snapshotNo
286     * @see #getA
287     */
288     void setA(const RotMat3x3d& a, int snapshotNo) {
289 tim 1640 (snapshotMan_->getSnapshot(snapshotNo))->storage_->a[LocalIndex_] = a;
290 tim 1639 }
291    
292     /**
293 tim 1640 * Returns the previous angular momentum of this stuntdouble
294 tim 1639 * @return the angular momentum of this stuntdouble
295     */
296     Vector3d getPrevJ() {
297 tim 1640 return (snapshotMan_->getPrevSnapshot())->storage_->angularMomentum[LocalIndex_];
298 tim 1639 }
299    
300     /**
301 tim 1640 * Returns the current angular momentum of this stuntdouble
302 tim 1639 * @return the angular momentum of this stuntdouble
303     */
304     Vector3d getJ() {
305 tim 1640 return (snapshotMan_->getCurrentSnapshot())->storage_->angularMomentum[LocalIndex_];
306 tim 1639 }
307    
308     /**
309 tim 1640 * Returns the angular momentum of this stuntdouble in specified snapshot
310 tim 1639 * @return the angular momentum of this stuntdouble
311     * @param snapshotNo
312     */
313     Vector3d getJ(int snapshotNo) {
314 tim 1640 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->angularMomentum[LocalIndex_];
315 tim 1639 }
316    
317     /**
318     * Sets the previous angular momentum of this stuntdouble
319     * @param angMom new angular momentum
320     * @see #getJ
321     */
322     void setPrevJ(const Vector3d& angMom) {
323 tim 1640 (snapshotMan_->getPrevSnapshot())->storage_->angularMomentum[LocalIndex_] = angMom;
324 tim 1639 }
325    
326     /**
327     * Sets the current angular momentum of this stuntdouble
328     * @param angMom new angular momentum
329     */
330     void setJ(const Vector3d& angMom) {
331 tim 1640 (snapshotMan_->getCurrentSnapshot())->storage_->angularMomentum[LocalIndex_] = angMom;
332 tim 1639 }
333    
334     /**
335     * Sets the angular momentum of this stuntdouble in specified snapshot
336     * @param angMom angular momentum to be set
337     * @param snapshotNo
338     * @see #getJ
339     */
340     void setJ(const Vector3d& angMom, int snapshotNo) {
341 tim 1640 (snapshotMan_->getSnapshot(snapshotNo))->storage_->angularMomentum[LocalIndex_] = angMom;
342 tim 1639 }
343    
344     /**
345 tim 1640 * Returns the previous quaternion of this stuntdouble
346 tim 1639 * @return the quaternion of this stuntdouble
347     */
348     Quat4d getPrevQ() {
349 tim 1640 return (snapshotMan_->getPrevSnapshot())->storage_->aMat[LocalIndex_].toQuaternion();
350 tim 1639 }
351    
352     /**
353 tim 1640 * Returns the current quaternion of this stuntdouble
354 tim 1639 * @return the quaternion of this stuntdouble
355     */
356     Quat4d getQ() {
357 tim 1640 return (snapshotMan_->getCurrentSnapshot())->storage_->aMat[LocalIndex_].toQuaternion();
358 tim 1639 }
359    
360     /**
361 tim 1640 * Returns the quaternion of this stuntdouble in specified snapshot
362 tim 1639 * @return the quaternion of this stuntdouble
363     * @param snapshotNo
364     */
365     Quat4d getQ(int snapshotNo) {
366 tim 1640 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->aMat[LocalIndex_].toQuaternion();
367 tim 1639 }
368    
369     /**
370     * Sets the previous quaternion of this stuntdouble
371     * @param q new quaternion
372     * @see #getQ
373     */
374     void setPrevQ(const Quat4d& q) {
375 tim 1640 (snapshotMan_->getPrevSnapshot())->storage_->aMat[LocalIndex_] = q;
376 tim 1639 }
377    
378     /**
379     * Sets the current quaternion of this stuntdouble
380     * @param q new quaternion
381     */
382     void setQ(const Quat4d& q) {
383 tim 1640 (snapshotMan_->getCurrentSnapshot())->storage_->aMat[LocalIndex_] = q;
384 tim 1639 }
385    
386     /**
387     * Sets the quaternion of this stuntdouble in specified snapshot
388     *
389     * @param q quaternion to be set
390     * @param snapshotNo
391     * @see #getQ
392     */
393     void setQ(const Quat4d& q, int snapshotNo) {
394 tim 1640 (snapshotMan_->getSnapshot(snapshotNo))->storage_->aMat[LocalIndex_] = q;
395 tim 1639 }
396 tim 1640
397     /**
398     * Returns the previous euler angles of this stuntdouble
399     * @return the euler angles of this stuntdouble
400     */
401     Vector3d getPrevEuler() {
402     return (snapshotMan_->getPrevSnapshot())->storage_->aMat[LocalIndex_].toEulerAngles();
403     }
404 tim 1639
405 tim 1640 /**
406     * Returns the current euler angles of this stuntdouble
407     * @return the euler angles of this stuntdouble
408     */
409     Vector3d getEuler() {
410     return (snapshotMan_->getCurrentSnapshot())->storage_->aMat[LocalIndex_].toEulerAngles();
411     }
412    
413 tim 1639 /**
414 tim 1640 * Returns the euler angles of this stuntdouble in specified snapshot
415 tim 1639 *
416 tim 1640 * @return the euler angles of this stuntdouble
417     * @param snapshotNo
418     */
419     Vector3d getEuler(int snapshotNo) {
420     return (snapshotMan_->getSnapshot(snapShotNo))->storage_->aMat[LocalIndex_].toEulerAngles();
421     }
422    
423     /**
424     * Sets the previous euler angles of this stuntdouble
425 tim 1639 *
426 tim 1640 * @param euler new euler angles
427     * @see #getEuler
428     */
429     void setPrevEuler(const Vector3d& euler) {
430     (snapshotMan_->getPrevSnapshot())->storage_->aMat[LocalIndex_] = euler;
431     }
432    
433     /**
434     * Sets the current euler angles of this stuntdouble
435     * @param euler new euler angles
436     */
437     void setEuler(const Vector3d& euler) {
438     (snapshotMan_->getCurrentSnapshot())->storage_->aMat[LocalIndex_] = euler;
439     }
440 tim 1639
441     /**
442 tim 1640 * Sets the euler angles of this stuntdouble in specified snapshot
443 tim 1639 *
444 tim 1640 * @param euler euler angles to be set
445     * @param snapshotNo
446     * @see #getEuler
447     */
448     void setEuler(const Vector3d& euler, int snapshotNo) {
449     (snapshotMan_->getSnapshot(snapshotNo))->storage_->aMat[LocalIndex_] = euler;
450     }
451    
452     /**
453     * Returns the previous force of this stuntdouble
454     * @return the force of this stuntdouble
455     */
456     Vector3d getPrevFrc() {
457     return (snapshotMan_->getPrevSnapshot())->storage_->force[LocalIndex_];
458     }
459    
460     /**
461     * Returns the current force of this stuntdouble
462     * @return the force of this stuntdouble
463     */
464     Vector3d getFrc() {
465     return (snapshotMan_->getCurrentSnapshot())->storage_->force[LocalIndex_];
466     }
467    
468     /**
469     * Returns the force of this stuntdouble in specified snapshot
470 tim 1639 *
471 tim 1640 * @return the force of this stuntdouble
472     * @param snapshotNo
473     */
474     Vector3d getFrc(int snapshotNo) {
475     return (snapshotMan_->getSnapshot(snapShotNo))->storage_->force[LocalIndex_];
476     }
477    
478     /**
479     * Sets the previous force of this stuntdouble
480     *
481     * @param frc new force
482 tim 1639 * @see #getFrc
483 tim 1640 */
484     void setPrevFrc(const Vector3d& frc) {
485     (snapshotMan_->getPrevSnapshot())->storage_->force[LocalIndex_] = frc;
486     }
487    
488     /**
489     * Sets the current force of this stuntdouble
490     * @param frc new force
491     */
492     void setFrc(const Vector3d& frc) {
493     (snapshotMan_->getCurrentSnapshot())->storage_->force[LocalIndex_] = frc;
494     }
495 tim 1639
496     /**
497 tim 1640 * Sets the force of this stuntdouble in specified snapshot
498 tim 1639 *
499 tim 1640 * @param frc force to be set
500     * @param snapshotNo
501     * @see #getFrc
502     */
503     void setFrc(const Vector3d& frc, int snapshotNo) {
504     (snapshotMan_->getSnapshot(snapshotNo))->storage_->force[LocalIndex_] = frc;
505     }
506    
507     /**
508     * Adds force into the previous force of this stuntdouble
509 tim 1639 *
510 tim 1640 * @param frc new force
511 tim 1639 * @see #getFrc
512 tim 1640 */
513     void setPrevFrc(const Vector3d& frc) {
514     (snapshotMan_->getPrevSnapshot())->storage_->force[LocalIndex_] += frc;
515     }
516    
517     /**
518     * Adds force into the current force of this stuntdouble
519     * @param frc new force
520     */
521     void setFrc(const Vector3d& frc) {
522     (snapshotMan_->getCurrentSnapshot())->storage_->force[LocalIndex_] += frc;
523     }
524 tim 1639
525     /**
526 tim 1640 * Adds force into the force of this stuntdouble in specified snapshot
527 tim 1639 *
528 tim 1640 * @param frc force to be set
529     * @param snapshotNo
530     * @see #getFrc
531     */
532     void setFrc(const Vector3d& frc, int snapshotNo) {
533     (snapshotMan_->getSnapshot(snapshotNo))->storage_->force[LocalIndex_] += frc;
534     }
535    
536     /**
537     * Returns the previous torque of this stuntdouble
538 tim 1639 * @return the torque of this stuntdouble
539 tim 1640 */
540     Vector3d getPrevTrq() {
541     return (snapshotMan_->getPrevSnapshot())->storage_->torque[LocalIndex_];
542     }
543    
544     /**
545     * Returns the current torque of this stuntdouble
546     * @return the torque of this stuntdouble
547     */
548     Vector3d getTrq() {
549     return (snapshotMan_->getCurrentSnapshot())->storage_->torque[LocalIndex_];
550     }
551    
552     /**
553     * Returns the torque of this stuntdouble in specified snapshot
554 tim 1639 *
555 tim 1640 * @return the torque of this stuntdouble
556     * @param snapshotNo
557     */
558     Vector3d getTrq(int snapshotNo) {
559     return (snapshotMan_->getSnapshot(snapShotNo))->storage_->torque[LocalIndex_];
560     }
561 tim 1639
562     /**
563 tim 1640 * Sets the previous torque of this stuntdouble
564 tim 1639 *
565 tim 1640 * @param trq new torque
566     * @see #getTrq
567     */
568     void setPrevTrq(const Vector3d& trq) {
569     (snapshotMan_->getPrevSnapshot())->storage_->torque[LocalIndex_] = trq;
570     }
571    
572     /**
573     * Sets the current torque of this stuntdouble
574     * @param trq new torque
575     */
576     void setTrq(const Vector3d& trq) {
577     (snapshotMan_->getCurrentSnapshot())->storage_->torque[LocalIndex_] = trq;
578     }
579    
580     /**
581     * Sets the torque of this stuntdouble in specified snapshot
582 tim 1639 *
583 tim 1640 * @param trq torque to be set
584     * @param snapshotNo
585 tim 1639 * @see #getTrq
586 tim 1640 */
587     void setTrq(const Vector3d& trq, int snapshotNo) {
588     (snapshotMan_->getSnapshot(snapshotNo))->storage_->torque[LocalIndex_] = trq;
589     }
590 tim 1639
591     /**
592 tim 1640 * Adds torque into the previous torque of this stuntdouble
593 tim 1639 *
594 tim 1640 * @param trq new torque
595     * @see #getTrq
596     */
597     void addPrevTrq(const Vector3d& trq) {
598     (snapshotMan_->getPrevSnapshot())->storage_->torque[LocalIndex_] += trq;
599     }
600    
601     /**
602     * Adds torque into the current torque of this stuntdouble
603     * @param trq new torque
604     */
605     void addTrq(const Vector3d& trq) {
606     (snapshotMan_->getCurrentSnapshot())->storage_->torque[LocalIndex_] += trq;
607     }
608    
609     /**
610     * Adds torque into the torque of this stuntdouble in specified snapshot
611 tim 1639 *
612 tim 1640 * @param trq torque to be add
613     * @param snapshotNo
614 tim 1639 * @see #getTrq
615 tim 1640 */
616     void addTrq(const Vector3d& trq, int snapshotNo) {
617     (snapshotMan_->getSnapshot(snapshotNo))->storage_->torque[LocalIndex_] += trq;
618     }
619 tim 1639
620 tim 1640
621 tim 1639 /**
622 tim 1640 * Returns the previous z-angle of this stuntdouble
623     * @return the z-angle of this stuntdouble
624     */
625     Vector3d getPrevZangle() {
626     return (snapshotMan_->getPrevSnapshot())->storage_->zAngle[LocalIndex_];
627     }
628    
629     /**
630     * Returns the current z-angle of this stuntdouble
631     * @return the z-angle of this stuntdouble
632     */
633     Vector3d getZangle() {
634     return (snapshotMan_->getCurrentSnapshot())->storage_->zAngle[LocalIndex_];
635     }
636    
637     /**
638     * Returns the z-angle of this stuntdouble in specified snapshot
639     * @return the z-angle of this stuntdouble
640     * @param snapshotNo
641     */
642     Vector3d getZangle(int snapshotNo) {
643     return (snapshotMan_->getSnapshot(snapShotNo))->storage_->zAngle[LocalIndex_];
644     }
645    
646     /**
647     * Sets the previous z-angle of this stuntdouble
648     * @param angle new z-angle
649     * @see #getZangle
650     */
651     void setPrevZangle(const Vector3d& angle) {
652     (snapshotMan_->getPrevSnapshot())->storage_->zAngle[LocalIndex_] = angle;
653     }
654    
655     /**
656     * Sets the current z-angle of this stuntdouble
657     * @param angle new z-angle
658     */
659     void setZangle(const Vector3d& angle) {
660     (snapshotMan_->getCurrentSnapshot())->storage_->zAngle[LocalIndex_] = angle;
661     }
662    
663     /**
664     * Sets the z-angle of this stuntdouble in specified snapshot
665     * @param angle z-angle to be set
666     * @param snapshotNo
667     * @see #getZangle
668     */
669     void setZangle(const Vector3d& angle, int snapshotNo) {
670     (snapshotMan_->getSnapshot(snapshotNo))->storage_->zAngle[LocalIndex_] = angle;
671     }
672    
673     /**
674     * Adds z-angle into the previous z-angle of this stuntdouble
675     * @param angle new z-angle
676     * @see #getZangle
677     */
678     void addPrevZangle(const Vector3d& angle) {
679     (snapshotMan_->getPrevSnapshot())->storage_->zAngle[LocalIndex_] += angle;
680     }
681    
682     /**
683     * Adds z-angle into the current z-angle of this stuntdouble
684     * @param angle new z-angle
685     */
686     void addZangle(const Vector3d& angle) {
687     (snapshotMan_->getCurrentSnapshot())->storage_->zAngle[LocalIndex_] += angle;
688     }
689    
690     /**
691     * Adds z-angle into the z-angle of this stuntdouble in specified snapshot
692     * @param angle z-angle to be add
693     * @param snapshotNo
694     * @see #getZangle
695     */
696     void addZangle(const Vector3d& angle, int snapshotNo) {
697     (snapshotMan_->getSnapshot(snapshotNo))->storage_->zAngle[LocalIndex_] += angle;
698     }
699    
700     /**
701 tim 1639 * Returns the inertia tensor of this stuntdouble
702     * @return the inertia tensor of this stuntdouble
703     * @see #setI
704     */
705     virtual Mat3x3d getI() = 0;
706    
707     /**
708     * Sets the inertia tensor of this stuntdouble
709     * @param trq new inertia tensor
710     * @see #getI
711     */
712     virtual void setI(Mat3x3d& I) = 0;
713    
714     /**
715     * Returns the gradient of this stuntdouble
716     * @return the inertia tensor of this stuntdouble
717     * @see #setI
718     */
719     virtual std::vector<double> getGrad() = 0;
720    
721     /**
722 tim 1640 * Tests the if this stuntdouble is a linear rigidbody
723 tim 1639 *
724 tim 1640 * @return true if this stuntdouble is a linear rigidbody, otherwise return false
725     * @note atom and directional atom will always return false
726     *
727     * @see #linearAxis
728     */
729     bool isLinear() {
730     return linear_;
731     }
732 tim 1639
733     /**
734     * Returns the linear axis of the rigidbody, atom and directional atom will always return -1
735     *
736     * @return the linear axis of the rigidbody
737     *
738     * @see #isLinear
739     */
740 tim 1640 int linearAxis() {
741     return linearAxis_;
742     }
743 tim 1639
744 tim 1640 /** Returns the mass of this stuntdouble */
745     double getMass() {
746     return mass_;
747     }
748 tim 1639
749 tim 1640 /**
750     * Sets the mass of this stuntdoulbe
751     * @param mass the mass to be set
752     */
753     void setMass(double mass) {
754     mass_ = mass;
755     }
756 tim 1639
757 tim 1640 /** Returns the name of this stuntdouble */
758     std::string getType();
759    
760     /** Sets the name of this stuntdouble*/
761     void setType(const std::string& name);
762 tim 1639
763 tim 1640 /**
764     * Converts a lab fixed vector to a body fixed vector
765     * @v lab fixed vector. On return, it will store body fixed vector
766     */
767     void lab2Body(Vector3d& v);
768    
769     /**
770     * Converts a body fixed vector to a lab fixed vector
771     * @v body fixed vector. On return, it will store lab fixed vector
772     */
773     void body2Lab(Vector3d& v);
774     /**
775 tim 1639 * <p>
776     * The purpose of the Visitor Pattern is to encapsulate an operation that you want to perform on
777     * the elements of a data structure. In this way, you can change the operation being performed
778     * on a structure without the need of changing the classes of the elements that you are operating
779     * on. Using a Visitor pattern allows you to decouple the classes for the data structure and the
780     * algorithms used upon them
781     * </p>
782     * @param v visitor
783     */
784     virtual void accept(BaseVisitor* v) = 0;
785    
786     //below functions are just forward functions
787     /**
788     * Adds property into property map
789     * @param genData GenericData to be added into PropertyMap
790     */
791 tim 1640 void addProperty(GenericData* genData);
792 tim 1639
793     /**
794     * Removes property from PropertyMap by name
795     * @param propName the name of property to be removed
796     */
797 tim 1640 void removeProperty(std::string& propName);
798 tim 1639
799     /**
800     * clear all of the properties
801     */
802 tim 1640 void clearProperties();
803 tim 1639
804     /**
805     * Returns all names of properties
806     * @return all names of properties
807     */
808 tim 1640 std::vector<std::string> getPropertyNames();
809 tim 1639
810     /**
811     * Returns all of the properties in PropertyMap
812     * @return all of the properties in PropertyMap
813     */
814 tim 1640 std::vector<GenericData*> getProperties();
815 tim 1639
816     /**
817     * Returns property
818     * @param propName name of property
819     * @return a pointer point to property with propName. If no property named propName
820     * exists, return NULL
821     */
822 tim 1640 GenericData* getPropertyByName(std:string& propName);
823 tim 1639
824 tim 1640 protected:
825 tim 1639
826 tim 1640 StuntDouble();
827    
828     StuntDouble(const StuntDouble& sd);
829     StuntDouble& operator=(const StuntDouble& sd);
830    
831     ObjectType objType_;
832    
833     bool linear_;
834     int linearAxis_;
835    
836     DataStoragePointer storage_;
837     SnapshotManager* snapshotMan_;
838    
839     private:
840    
841 tim 1639 int globalIndex_;
842     int localIndex_;
843    
844 tim 1640 std::string name_;
845    
846     double mass_;
847    
848     PropertyMap properties_;
849     };
850    
851 tim 1639 }//end namespace oopse
852     #endif //ifndef _STUNTDOUBLE_HPP_

Properties

Name Value
svn:executable *