ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/test/brains/StuntDouble.hpp
Revision: 1682
Committed: Thu Oct 28 22:34:01 2004 UTC (19 years, 8 months ago) by tim
File size: 29550 byte(s)
Log Message:
More work on StuntDouble, Atom, DirectionalAtom and RigidBody

File Contents

# Content
1 /*
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
26 /**
27 * @file StuntDouble.hpp
28 * @author tlin
29 * @date 10/22/2004
30 * @version 1.0
31 */
32
33 #ifndef _STUNTDOUBLE_HPP_
34 #define _STUNTDOUBLE_HPP_
35
36 #include <vector>
37
38 #include <core/BaseVisitor.hpp>
39 #include <math/Quaternion.hpp>
40 #include <math/SquareMatrix3.hpp>
41 #include <math/Vector3.hpp>
42 #include <utils/PropertyMap.hpp>
43
44 namespace oopse{
45
46
47
48 /**
49 * @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 */
60 class StuntDouble{
61 public:
62
63 enum ObjectType{
64 otAtom,
65 otDAtom,
66 otRigidBody
67 };
68
69 virtual ~StuntDouble();
70
71 /**
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 /**
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 /**
136 * Returns the previous position of this stuntdouble
137 * @return the position of this stuntdouble
138 */
139 void Vector3d getPrevPos() {
140 return (snapshotMan_->getPrevSnapshot())->storage_->position[localIndex_];
141 }
142
143 /**
144 * Returns the current position of this stuntdouble
145 * @return the position of this stuntdouble
146 */
147 void Vector3d getPos() {
148 return (snapshotMan_->getCurrentSnapshot())->storage_->position[localIndex_];
149 }
150
151 /**
152 * Returns the position of this stuntdouble in specified snapshot
153 * @return the position of this stuntdouble
154 * @param snapshotNo
155 */
156 Vector3d getPos(int snapshotNo) {
157 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->position[localIndex_];
158 }
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 (snapshotMan_->getPrevSnapshot())->storage_->position[localIndex_] = pos;
167 }
168
169 /**
170 * Sets the current position of this stuntdouble
171 * @param pos new position
172 */
173 void setPos(const Vector3d& pos) {
174 (snapshotMan_->getCurrentSnapshot())->storage_->position[localIndex_] = pos;
175 }
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 (snapshotMan_->getSnapshot(snapshotNo))->storage_->position[localIndex_] = pos;
185 }
186
187 /**
188 * Returns the previous velocity of this stuntdouble
189 * @return the velocity of this stuntdouble
190 */
191 Vector3d getPrevVel() {
192 return (snapshotMan_->getPrevSnapshot())->storage_->velocity[localIndex_];
193 }
194
195 /**
196 * Returns the current velocity of this stuntdouble
197 * @return the velocity of this stuntdouble
198 */
199 Vector3d getVel() {
200 return (snapshotMan_->getCurrentSnapshot())->storage_->velocity[localIndex_];
201 }
202
203 /**
204 * Returns the velocity of this stuntdouble in specified snapshot
205 * @return the velocity of this stuntdouble
206 * @param snapshotNo
207 */
208 Vector3d getVel(int snapshotNo) {
209 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->velocity[localIndex_];
210 }
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 (snapshotMan_->getPrevSnapshot())->storage_->velocity[localIndex_] = vel;
219 }
220
221 /**
222 * Sets the current velocity of this stuntdouble
223 * @param vel new velocity
224 */
225 void setVel(const Vector3d& vel) {
226 (snapshotMan_->getCurrentSnapshot())->storage_->velocity[localIndex_] = vel;
227 }
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 (snapshotMan_->getSnapshot(snapshotNo))->storage_->velocity[localIndex_] = vel;
237 }
238
239 /**
240 * Returns the previous rotation matrix of this stuntdouble
241 * @return the rotation matrix of this stuntdouble
242 */
243 RotMat3x3d getPrevA() {
244 return (snapshotMan_->getPrevSnapshot())->storage_->aMat[localIndex_];
245 }
246
247 /**
248 * Returns the current rotation matrix of this stuntdouble
249 * @return the rotation matrix of this stuntdouble
250 */
251 RotMat3x3d getA() {
252 return (snapshotMan_->getCurrentSnapshot())->storage_->aMat[localIndex_];
253 }
254
255 /**
256 * Returns the rotation matrix of this stuntdouble in specified snapshot
257 *
258 * @return the rotation matrix of this stuntdouble
259 * @param snapshotNo
260 */
261 RotMat3x3d getA(int snapshotNo) {
262 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->aMat[localIndex_];
263 }
264
265 /**
266 * Sets the previous rotation matrix of this stuntdouble
267 * @param a new rotation matrix
268 * @see #getA
269 */
270 virtual void setPrevA(const RotMat3x3d& a) {
271 (snapshotMan_->getPrevSnapshot())->storage_->aMat[localIndex_] = a;
272 }
273
274 /**
275 * Sets the current rotation matrix of this stuntdouble
276 * @param a new rotation matrix
277 */
278 virtual void setA(const RotMat3x3d& a) {
279 (snapshotMan_->getCurrentSnapshot())->storage_->aMat[localIndex_] = a;
280 }
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 virtual void setA(const RotMat3x3d& a, int snapshotNo) {
289 (snapshotMan_->getSnapshot(snapshotNo))->storage_->aMat[localIndex_] = a;
290 }
291
292 /**
293 * Returns the previous angular momentum of this stuntdouble (body-fixed).
294 * @return the angular momentum of this stuntdouble
295 */
296 Vector3d getPrevJ() {
297 return (snapshotMan_->getPrevSnapshot())->storage_->angularMomentum[localIndex_];
298 }
299
300 /**
301 * Returns the current angular momentum of this stuntdouble (body -fixed).
302 * @return the angular momentum of this stuntdouble
303 */
304 Vector3d getJ() {
305 return (snapshotMan_->getCurrentSnapshot())->storage_->angularMomentum[localIndex_];
306 }
307
308 /**
309 * Returns the angular momentum of this stuntdouble in specified snapshot (body-fixed).
310 * @return the angular momentum of this stuntdouble
311 * @param snapshotNo
312 */
313 Vector3d getJ(int snapshotNo) {
314 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->angularMomentum[localIndex_];
315 }
316
317 /**
318 * Sets the previous angular momentum of this stuntdouble (body-fixed).
319 * @param angMom new angular momentum
320 * @see #getJ
321 */
322 void setPrevJ(const Vector3d& angMom) {
323 (snapshotMan_->getPrevSnapshot())->storage_->angularMomentum[localIndex_] = angMom;
324 }
325
326 /**
327 * Sets the current angular momentum of this stuntdouble (body-fixed).
328 * @param angMom new angular momentum
329 */
330 void setJ(const Vector3d& angMom) {
331 (snapshotMan_->getCurrentSnapshot())->storage_->angularMomentum[localIndex_] = angMom;
332 }
333
334 /**
335 * Sets the angular momentum of this stuntdouble in specified snapshot(body-fixed).
336 * @param angMom angular momentum to be set
337 * @param snapshotNo
338 * @see #getJ
339 */
340 void setJ(const Vector3d& angMom, int snapshotNo) {
341 (snapshotMan_->getSnapshot(snapshotNo))->storage_->angularMomentum[localIndex_] = angMom;
342 }
343
344 /**
345 * Returns the previous quaternion of this stuntdouble
346 * @return the quaternion of this stuntdouble
347 */
348 Quat4d getPrevQ() {
349 return (snapshotMan_->getPrevSnapshot())->storage_->aMat[localIndex_].toQuaternion();
350 }
351
352 /**
353 * Returns the current quaternion of this stuntdouble
354 * @return the quaternion of this stuntdouble
355 */
356 Quat4d getQ() {
357 return (snapshotMan_->getCurrentSnapshot())->storage_->aMat[localIndex_].toQuaternion();
358 }
359
360 /**
361 * Returns the quaternion of this stuntdouble in specified snapshot
362 * @return the quaternion of this stuntdouble
363 * @param snapshotNo
364 */
365 Quat4d getQ(int snapshotNo) {
366 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->aMat[localIndex_].toQuaternion();
367 }
368
369 /**
370 * Sets the previous quaternion of this stuntdouble
371 * @param q new quaternion
372 * @note actual storage data is rotation matrix
373 */
374 void setPrevQ(const Quat4d& q) {
375 (snapshotMan_->getPrevSnapshot())->storage_->aMat[localIndex_] = q;
376 }
377
378 /**
379 * Sets the current quaternion of this stuntdouble
380 * @param q new quaternion
381 * @note actual storage data is rotation matrix
382 */
383 void setQ(const Quat4d& q) {
384 (snapshotMan_->getCurrentSnapshot())->storage_->aMat[localIndex_] = q;
385 }
386
387 /**
388 * Sets the quaternion of this stuntdouble in specified snapshot
389 *
390 * @param q quaternion to be set
391 * @param snapshotNo
392 * @note actual storage data is rotation matrix
393 */
394 void setQ(const Quat4d& q, int snapshotNo) {
395 (snapshotMan_->getSnapshot(snapshotNo))->storage_->aMat[localIndex_] = q;
396 }
397
398 /**
399 * Returns the previous euler angles of this stuntdouble
400 * @return the euler angles of this stuntdouble
401 */
402 Vector3d getPrevEuler() {
403 return (snapshotMan_->getPrevSnapshot())->storage_->aMat[localIndex_].toEulerAngles();
404 }
405
406 /**
407 * Returns the current euler angles of this stuntdouble
408 * @return the euler angles of this stuntdouble
409 */
410 Vector3d getEuler() {
411 return (snapshotMan_->getCurrentSnapshot())->storage_->aMat[localIndex_].toEulerAngles();
412 }
413
414 /**
415 * Returns the euler angles of this stuntdouble in specified snapshot.
416 * @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 * @param euler new euler angles
426 * @see #getEuler
427 * @note actual storage data is rotation matrix
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
441 /**
442 * Sets the euler angles of this stuntdouble in specified snapshot
443 *
444 * @param euler euler angles to be set
445 * @param snapshotNo
446 * @note actual storage data is rotation matrix
447 */
448 void setEuler(const Vector3d& euler, int snapshotNo) {
449 (snapshotMan_->getSnapshot(snapshotNo))->storage_->aMat[localIndex_] = euler;
450 }
451
452 /**
453 * Returns the previous unit vectors of this stuntdouble
454 * @return the unit vectors of this stuntdouble
455 */
456 Vector3d getPrevUnitVector() {
457 return (snapshotMan_->getPrevSnapshot())->storage_->unitVector[localIndex_];
458 }
459
460 /**
461 * Returns the current unit vectors of this stuntdouble
462 * @return the unit vectors of this stuntdouble
463 */
464 Vector3d getUnitVector() {
465 return (snapshotMan_->getCurrentSnapshot())->storage_->unitVector[localIndex_];
466 }
467
468 /**
469 * Returns the unit vectors of this stuntdouble in specified snapshot
470 *
471 * @return the unit vectors of this stuntdouble
472 * @param snapshotNo
473 */
474 Vector3d getUnitVector(int snapshotNo) {
475 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->unitVector[localIndex_];
476 }
477
478 /**
479 * Returns the previous force of this stuntdouble
480 * @return the force of this stuntdouble
481 */
482 Vector3d getPrevFrc() {
483 return (snapshotMan_->getPrevSnapshot())->storage_->force[localIndex_];
484 }
485
486 /**
487 * Returns the current force of this stuntdouble
488 * @return the force of this stuntdouble
489 */
490 Vector3d getFrc() {
491 return (snapshotMan_->getCurrentSnapshot())->storage_->force[localIndex_];
492 }
493
494 /**
495 * Returns the force of this stuntdouble in specified snapshot
496 *
497 * @return the force of this stuntdouble
498 * @param snapshotNo
499 */
500 Vector3d getFrc(int snapshotNo) {
501 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->force[localIndex_];
502 }
503
504 /**
505 * Sets the previous force of this stuntdouble
506 *
507 * @param frc new force
508 * @see #getFrc
509 */
510 void setPrevFrc(const Vector3d& frc) {
511 (snapshotMan_->getPrevSnapshot())->storage_->force[localIndex_] = frc;
512 }
513
514 /**
515 * Sets the current force of this stuntdouble
516 * @param frc new force
517 */
518 void setFrc(const Vector3d& frc) {
519 (snapshotMan_->getCurrentSnapshot())->storage_->force[localIndex_] = frc;
520 }
521
522 /**
523 * Sets the force of this stuntdouble in specified snapshot
524 *
525 * @param frc force to be set
526 * @param snapshotNo
527 * @see #getFrc
528 */
529 void setFrc(const Vector3d& frc, int snapshotNo) {
530 (snapshotMan_->getSnapshot(snapshotNo))->storage_->force[localIndex_] = frc;
531 }
532
533 /**
534 * Adds force into the previous force of this stuntdouble
535 *
536 * @param frc new force
537 * @see #getFrc
538 */
539 void setPrevFrc(const Vector3d& frc) {
540 (snapshotMan_->getPrevSnapshot())->storage_->force[localIndex_] += frc;
541 }
542
543 /**
544 * Adds force into the current force of this stuntdouble
545 * @param frc new force
546 */
547 void setFrc(const Vector3d& frc) {
548 (snapshotMan_->getCurrentSnapshot())->storage_->force[localIndex_] += frc;
549 }
550
551 /**
552 * Adds force into the force of this stuntdouble in specified snapshot
553 *
554 * @param frc force to be set
555 * @param snapshotNo
556 * @see #getFrc
557 */
558 void setFrc(const Vector3d& frc, int snapshotNo) {
559 (snapshotMan_->getSnapshot(snapshotNo))->storage_->force[localIndex_] += frc;
560 }
561
562 /**
563 * Returns the previous torque of this stuntdouble
564 * @return the torque of this stuntdouble
565 */
566 Vector3d getPrevTrq() {
567 return (snapshotMan_->getPrevSnapshot())->storage_->torque[localIndex_];
568 }
569
570 /**
571 * Returns the current torque of this stuntdouble
572 * @return the torque of this stuntdouble
573 */
574 Vector3d getTrq() {
575 return (snapshotMan_->getCurrentSnapshot())->storage_->torque[localIndex_];
576 }
577
578 /**
579 * Returns the torque of this stuntdouble in specified snapshot
580 *
581 * @return the torque of this stuntdouble
582 * @param snapshotNo
583 */
584 Vector3d getTrq(int snapshotNo) {
585 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->torque[localIndex_];
586 }
587
588 /**
589 * Sets the previous torque of this stuntdouble
590 *
591 * @param trq new torque
592 * @see #getTrq
593 */
594 void setPrevTrq(const Vector3d& trq) {
595 (snapshotMan_->getPrevSnapshot())->storage_->torque[localIndex_] = trq;
596 }
597
598 /**
599 * Sets the current torque of this stuntdouble
600 * @param trq new torque
601 */
602 void setTrq(const Vector3d& trq) {
603 (snapshotMan_->getCurrentSnapshot())->storage_->torque[localIndex_] = trq;
604 }
605
606 /**
607 * Sets the torque of this stuntdouble in specified snapshot
608 *
609 * @param trq torque to be set
610 * @param snapshotNo
611 * @see #getTrq
612 */
613 void setTrq(const Vector3d& trq, int snapshotNo) {
614 (snapshotMan_->getSnapshot(snapshotNo))->storage_->torque[localIndex_] = trq;
615 }
616
617 /**
618 * Adds torque into the previous torque of this stuntdouble
619 *
620 * @param trq new torque
621 * @see #getTrq
622 */
623 void addPrevTrq(const Vector3d& trq) {
624 (snapshotMan_->getPrevSnapshot())->storage_->torque[localIndex_] += trq;
625 }
626
627 /**
628 * Adds torque into the current torque of this stuntdouble
629 * @param trq new torque
630 */
631 void addTrq(const Vector3d& trq) {
632 (snapshotMan_->getCurrentSnapshot())->storage_->torque[localIndex_] += trq;
633 }
634
635 /**
636 * Adds torque into the torque of this stuntdouble in specified snapshot
637 *
638 * @param trq torque to be add
639 * @param snapshotNo
640 * @see #getTrq
641 */
642 void addTrq(const Vector3d& trq, int snapshotNo) {
643 (snapshotMan_->getSnapshot(snapshotNo))->storage_->torque[localIndex_] += trq;
644 }
645
646
647 /**
648 * Returns the previous z-angle of this stuntdouble
649 * @return the z-angle of this stuntdouble
650 */
651 Vector3d getPrevZangle() {
652 return (snapshotMan_->getPrevSnapshot())->storage_->zAngle[localIndex_];
653 }
654
655 /**
656 * Returns the current z-angle of this stuntdouble
657 * @return the z-angle of this stuntdouble
658 */
659 Vector3d getZangle() {
660 return (snapshotMan_->getCurrentSnapshot())->storage_->zAngle[localIndex_];
661 }
662
663 /**
664 * Returns the z-angle of this stuntdouble in specified snapshot
665 * @return the z-angle of this stuntdouble
666 * @param snapshotNo
667 */
668 Vector3d getZangle(int snapshotNo) {
669 return (snapshotMan_->getSnapshot(snapShotNo))->storage_->zAngle[localIndex_];
670 }
671
672 /**
673 * Sets the previous z-angle of this stuntdouble
674 * @param angle new z-angle
675 * @see #getZangle
676 */
677 void setPrevZangle(const Vector3d& angle) {
678 (snapshotMan_->getPrevSnapshot())->storage_->zAngle[localIndex_] = angle;
679 }
680
681 /**
682 * Sets the current z-angle of this stuntdouble
683 * @param angle new z-angle
684 */
685 void setZangle(const Vector3d& angle) {
686 (snapshotMan_->getCurrentSnapshot())->storage_->zAngle[localIndex_] = angle;
687 }
688
689 /**
690 * Sets the z-angle of this stuntdouble in specified snapshot
691 * @param angle z-angle to be set
692 * @param snapshotNo
693 * @see #getZangle
694 */
695 void setZangle(const Vector3d& angle, int snapshotNo) {
696 (snapshotMan_->getSnapshot(snapshotNo))->storage_->zAngle[localIndex_] = angle;
697 }
698
699 /**
700 * Adds z-angle into the previous z-angle of this stuntdouble
701 * @param angle new z-angle
702 * @see #getZangle
703 */
704 void addPrevZangle(const Vector3d& angle) {
705 (snapshotMan_->getPrevSnapshot())->storage_->zAngle[localIndex_] += angle;
706 }
707
708 /**
709 * Adds z-angle into the current z-angle of this stuntdouble
710 * @param angle new z-angle
711 */
712 void addZangle(const Vector3d& angle) {
713 (snapshotMan_->getCurrentSnapshot())->storage_->zAngle[localIndex_] += angle;
714 }
715
716 /**
717 * Adds z-angle into the z-angle of this stuntdouble in specified snapshot
718 * @param angle z-angle to be add
719 * @param snapshotNo
720 * @see #getZangle
721 */
722 void addZangle(const Vector3d& angle, int snapshotNo) {
723 (snapshotMan_->getSnapshot(snapshotNo))->storage_->zAngle[localIndex_] += angle;
724 }
725
726 /**
727 * Returns the inertia tensor of this stuntdouble
728 * @return the inertia tensor of this stuntdouble
729 * @see #setI
730 */
731 virtual Mat3x3d getI() = 0;
732
733 /**
734 * Sets the inertia tensor of this stuntdouble
735 * @param trq new inertia tensor
736 * @see #getI
737 */
738 virtual void setI(Mat3x3d& I) = 0;
739
740 /**
741 * Returns the gradient of this stuntdouble
742 * @return the gradient of this stuntdouble
743 */
744 virtual std::vector<double> getGrad() = 0;
745
746 /**
747 * Tests the if this stuntdouble is a linear rigidbody
748 *
749 * @return true if this stuntdouble is a linear rigidbody, otherwise return false
750 * @note atom and directional atom will always return false
751 *
752 * @see #linearAxis
753 */
754 bool isLinear() {
755 return linear_;
756 }
757
758 /**
759 * Returns the linear axis of the rigidbody, atom and directional atom will always return -1
760 *
761 * @return the linear axis of the rigidbody
762 *
763 * @see #isLinear
764 */
765 int linearAxis() {
766 return linearAxis_;
767 }
768
769 /** Returns the mass of this stuntdouble */
770 double getMass() {
771 return mass_;
772 }
773
774 /**
775 * Sets the mass of this stuntdoulbe
776 * @param mass the mass to be set
777 */
778 void setMass(double mass) {
779 mass_ = mass;
780 }
781
782 /** Returns the name of this stuntdouble */
783 std::string getType();
784
785 /** Sets the name of this stuntdouble*/
786 void setType(const std::string& name);
787
788 /**
789 * Converts a lab fixed vector to a body fixed vector
790 * @v lab fixed vector. On return, it will store body fixed vector
791 */
792 void lab2Body(Vector3d& v);
793
794 /**
795 * Converts a body fixed vector to a lab fixed vector
796 * @v body fixed vector. On return, it will store lab fixed vector
797 */
798 void body2Lab(Vector3d& v);
799 /**
800 * <p>
801 * The purpose of the Visitor Pattern is to encapsulate an operation that you want to perform on
802 * the elements of a data structure. In this way, you can change the operation being performed
803 * on a structure without the need of changing the classes of the elements that you are operating
804 * on. Using a Visitor pattern allows you to decouple the classes for the data structure and the
805 * algorithms used upon them
806 * </p>
807 * @param v visitor
808 */
809 virtual void accept(BaseVisitor* v) = 0;
810
811 //below functions are just forward functions
812 /**
813 * Adds property into property map
814 * @param genData GenericData to be added into PropertyMap
815 */
816 void addProperty(GenericData* genData);
817
818 /**
819 * Removes property from PropertyMap by name
820 * @param propName the name of property to be removed
821 */
822 void removeProperty(std::string& propName);
823
824 /**
825 * clear all of the properties
826 */
827 void clearProperties();
828
829 /**
830 * Returns all names of properties
831 * @return all names of properties
832 */
833 std::vector<std::string> getPropertyNames();
834
835 /**
836 * Returns all of the properties in PropertyMap
837 * @return all of the properties in PropertyMap
838 */
839 std::vector<GenericData*> getProperties();
840
841 /**
842 * Returns property
843 * @param propName name of property
844 * @return a pointer point to property with propName. If no property named propName
845 * exists, return NULL
846 */
847 GenericData* getPropertyByName(std:string& propName);
848
849 protected:
850
851 StuntDouble();
852
853 StuntDouble(const StuntDouble& sd);
854 StuntDouble& operator=(const StuntDouble& sd);
855
856 ObjectType objType_;
857
858 bool linear_;
859 int linearAxis_;
860
861 DataStoragePointer storage_;
862 SnapshotManager* snapshotMan_;
863
864 private:
865
866 int globalIndex_;
867 int localIndex_;
868
869 std::string name_;
870
871 double mass_;
872
873 PropertyMap properties_;
874 };
875
876 }//end namespace oopse
877 #endif //ifndef _STUNTDOUBLE_HPP_

Properties

Name Value
svn:executable *