1 |
#ifndef _CONSTRAINTELEMENT_H_ |
2 |
#define _CONSTRAINTELEMENT_H_ |
3 |
|
4 |
#include "RigidBody.hpp" |
5 |
#include "Atom.hpp" |
6 |
|
7 |
|
8 |
//class ConstraintElement is designed to not only provide the interface of StuntDouble, but also |
9 |
//neccessary functionality to retrieve old position, old velocity and etc. |
10 |
//First of all, those old data should be stored inside StuntDouble. We decide to store it on StuntDouble's |
11 |
//generic property. |
12 |
//////////////////////////////////////////////////////////////////////////////// |
13 |
//Declaration of ConstraintElement |
14 |
//////////////////////////////////////////////////////////////////////////////// |
15 |
class ConstraintElement{ |
16 |
public: |
17 |
|
18 |
virtual ~ConstraintElement() {} |
19 |
|
20 |
//Interface of stunt double |
21 |
bool isAtom() {return refSd->isAtom();} |
22 |
bool isDirectionalAtom() {return refSd->isDirectional();} |
23 |
bool isRigidBody() {return refSd->isRigidBody();} |
24 |
|
25 |
double getMass(void) {return refSd->getMass();} |
26 |
|
27 |
void getPos(double pos[3]) {refSd->getPos(pos);} |
28 |
void setPos(double pos[3]) {refSd->setPos(pos);} |
29 |
|
30 |
void getVel(double vel[3]) {refSd->getVel(vel);} |
31 |
void setVel(double vel[3]) {refSd->setVel(vel);} |
32 |
|
33 |
void getFrc(double frc[3]) {refSd->getFrc(frc);} |
34 |
void addFrc(double frc[3]) {refSd->addFrc(frc);} |
35 |
|
36 |
void getA(double A[3][3]) {refSd->getA(A);} |
37 |
void setA(double A[3][3]) {refSd->setA(A);} |
38 |
|
39 |
void getJ(double j[3]) {refSd->getJ(j);} |
40 |
void setJ(double j[3]) {refSd->setJ(j);} |
41 |
|
42 |
void getQ( double q[4] ) {refSd->getQ(q);} |
43 |
void setQ( double q[4] ) {refSd->setQ(q);} |
44 |
|
45 |
void setType(char* type){refSd->setType(type);} |
46 |
char* getType() {return refSd->getType();} |
47 |
|
48 |
void getTrq(double trq[3]) {refSd->getTrq(trq);} |
49 |
void addTrq(double trq[3]) {refSd->addTrq(trq);} |
50 |
|
51 |
void getI(double I[3][3]) {refSd->getI(I);} |
52 |
void lab2Body(double vec[3]) {refSd->lab2Body(vec);} |
53 |
|
54 |
void getGrad(double grad[6]) {refSd->getGrad(grad);} |
55 |
void setEuler(double phi, double theta, double psi) {refSd->setEuler(phi, theta, psi);} |
56 |
void getEulerAngles(double eulers[3]) {refSd->getEulerAngles(eulers);} |
57 |
|
58 |
bool isLinear() {return refSd->isLinear();} |
59 |
int linearAxis() {return refSd->linearAxis();} |
60 |
|
61 |
double getZangle() {return refSd->getZangle();} |
62 |
void setZangle(double zAngle) {refSd->setZangle(zAngle);} |
63 |
void addZangle(double zAngle) {refSd->addZangle(zAngle);} |
64 |
|
65 |
StuntDouble* getStuntDouble() {return refSd;} |
66 |
|
67 |
virtual void getOldPos(double pos[3])=0; |
68 |
virtual void getOldVel(double vel[3])=0; |
69 |
virtual void getOldJ(double j[3])=0; |
70 |
virtual void getOldA(double a[3][3])=0; |
71 |
virtual void getOldQ(double q[4])=0; |
72 |
|
73 |
bool getMoved() {return movedData->getData();} |
74 |
void setMoved(bool status) {movedData->setData(status);} |
75 |
|
76 |
bool getMoving() {return movingData->getData();} |
77 |
void setMoving(bool status) {movingData->setData(status);} |
78 |
|
79 |
virtual void saveOldState() = 0; |
80 |
|
81 |
protected: |
82 |
ConstraintElement(StuntDouble* rhs); |
83 |
|
84 |
StuntDouble* refSd; |
85 |
|
86 |
private: |
87 |
BoolData* movedData; |
88 |
BoolData* movingData; |
89 |
|
90 |
}; |
91 |
|
92 |
|
93 |
//////////////////////////////////////////////////////////////////////////////// |
94 |
//Declaration of ConsAtomData |
95 |
//////////////////////////////////////////////////////////////////////////////// |
96 |
struct ConsAtomInfo{ |
97 |
double pos[3]; |
98 |
double vel[3]; |
99 |
double a[3][3]; |
100 |
double j[3]; |
101 |
double q[4]; |
102 |
}; |
103 |
|
104 |
class ConsAtomData : public GenericData{ |
105 |
public: |
106 |
ConsAtomData() : data(NULL){} |
107 |
~ConsAtomData(){ |
108 |
if(data != NULL) |
109 |
delete data; |
110 |
} |
111 |
|
112 |
ConsAtomInfo* getData() {return data;} |
113 |
void setData(ConsAtomInfo* info) { |
114 |
if (data != NULL) |
115 |
delete data; |
116 |
|
117 |
data = info; |
118 |
} |
119 |
|
120 |
private: |
121 |
ConsAtomInfo* data; |
122 |
}; |
123 |
//////////////////////////////////////////////////////////////////////////////// |
124 |
//Declaration of ConstraintElement |
125 |
//////////////////////////////////////////////////////////////////////////////// |
126 |
class ConstraintAtom : public ConstraintElement{ |
127 |
public: |
128 |
ConstraintAtom(Atom* rhs); |
129 |
|
130 |
void getOldPos(double pos[3]); |
131 |
void getOldVel(double vel[3]); |
132 |
void getOldJ(double j[3]); |
133 |
void getOldA(double a[3][3]); |
134 |
void getOldQ(double q[4]); |
135 |
|
136 |
Atom* getAtom() {return dynamic_cast<Atom*>(refSd);} |
137 |
|
138 |
virtual void saveOldState(); |
139 |
|
140 |
protected: |
141 |
ConsAtomInfo* oldConsAtomInfo; |
142 |
|
143 |
}; |
144 |
|
145 |
|
146 |
|
147 |
//////////////////////////////////////////////////////////////////////////////// |
148 |
//Declaration of ConsRbData |
149 |
//////////////////////////////////////////////////////////////////////////////// |
150 |
class ConsRbData : public GenericData{ |
151 |
public: |
152 |
ConsRbData() : rb(NULL){} |
153 |
~ConsRbData(){ |
154 |
if (rb != NULL) |
155 |
delete rb; |
156 |
} |
157 |
|
158 |
RigidBody* getData() {return rb;} |
159 |
void setData(RigidBody* rhs) { |
160 |
if (rb != NULL) |
161 |
delete rb; |
162 |
rb = rhs; |
163 |
} |
164 |
|
165 |
private: |
166 |
RigidBody* rb; |
167 |
}; |
168 |
|
169 |
//////////////////////////////////////////////////////////////////////////////// |
170 |
//Declaration of ConstraintElement |
171 |
//////////////////////////////////////////////////////////////////////////////// |
172 |
class ConstraintRigidBody : public ConstraintElement{ |
173 |
public: |
174 |
ConstraintRigidBody(RigidBody*rhs, int index); |
175 |
|
176 |
void getOldPos(double pos[3]) {oldRb->getPos(pos);} |
177 |
void getOldVel(double vel[3]) {oldRb->getVel(vel);} |
178 |
void getOldJ(double j[3]) {oldRb->getJ(j);} |
179 |
void getOldA(double a[3][3]) {oldRb->getA(a);} |
180 |
void getOldQ(double q[4]) {oldRb->getQ(q);} |
181 |
|
182 |
void getOldAtomPos(double pos[3]) {oldRb->getAtomPos(pos, consAtomIndex);} |
183 |
void getCurAtomPos(double pos[3]) {((RigidBody*)refSd)->getAtomPos(pos, consAtomIndex);} |
184 |
|
185 |
void getOldAtomVel(double vel[3]) {oldRb->getAtomVel(vel, consAtomIndex);}; |
186 |
void getCurAtomVel(double vel[3]) {((RigidBody*)refSd)->getAtomVel(vel, consAtomIndex);}; |
187 |
|
188 |
void getRefCoor(double pos[3]) {return ((RigidBody*)refSd)->getAtomRefCoor(pos, consAtomIndex);} |
189 |
RigidBody* getRigidBody() { return dynamic_cast<RigidBody*>(refSd);} |
190 |
|
191 |
virtual void saveOldState(); |
192 |
|
193 |
private: |
194 |
int consAtomIndex; |
195 |
RigidBody* oldRb; |
196 |
}; |
197 |
#endif // endif _CONSTRAINTELEMENT_H_ |