1 |
tim |
1232 |
#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 |
|
|
|
66 |
|
|
virtual void getOldPos(double pos[3])=0; |
67 |
|
|
virtual void getOldVel(double vel[3])=0; |
68 |
|
|
virtual void getOldJ(double j[3])=0; |
69 |
|
|
virtual void getOldA(double a[3][3])=0; |
70 |
|
|
virtual void getOldQ(double q[4])=0; |
71 |
|
|
|
72 |
|
|
bool getMoved() {return movedData->getData();} |
73 |
|
|
void setMoved(bool status) {movedData->setData(status);} |
74 |
|
|
|
75 |
|
|
bool getMoving() {return movingData->getData();} |
76 |
|
|
void setMoving(bool status) {movingData->setData(status);} |
77 |
|
|
|
78 |
|
|
virtual void saveOldState() = 0; |
79 |
|
|
|
80 |
|
|
protected: |
81 |
|
|
ConstraintElement(StuntDouble* rhs); |
82 |
|
|
|
83 |
|
|
StuntDouble* refSd; |
84 |
|
|
|
85 |
|
|
private: |
86 |
|
|
BoolData* movedData; |
87 |
|
|
BoolData* movingData; |
88 |
|
|
|
89 |
|
|
}; |
90 |
|
|
|
91 |
|
|
|
92 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
93 |
|
|
//Declaration of ConsAtomData |
94 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
95 |
|
|
struct ConsAtomInfo{ |
96 |
|
|
double pos[3]; |
97 |
|
|
double vel[3]; |
98 |
|
|
double a[3][3]; |
99 |
|
|
double j[3]; |
100 |
|
|
double q[4]; |
101 |
|
|
}; |
102 |
|
|
|
103 |
|
|
class ConsAtomData : public GenericData{ |
104 |
|
|
public: |
105 |
|
|
ConsAtomData() : data(NULL){} |
106 |
|
|
~ConsAtomData(){ |
107 |
|
|
if(data != NULL) |
108 |
|
|
delete data; |
109 |
|
|
} |
110 |
|
|
|
111 |
|
|
ConsAtomInfo* getData() {return data;} |
112 |
|
|
void setData(ConsAtomInfo* info) { |
113 |
|
|
if (data != NULL) |
114 |
|
|
delete data; |
115 |
|
|
|
116 |
|
|
data = info; |
117 |
|
|
} |
118 |
|
|
|
119 |
|
|
private: |
120 |
|
|
ConsAtomInfo* data; |
121 |
|
|
}; |
122 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
123 |
|
|
//Declaration of ConstraintElement |
124 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
125 |
|
|
class ConstraintAtom : public ConstraintElement{ |
126 |
|
|
public: |
127 |
|
|
ConstraintAtom(Atom* rhs); |
128 |
|
|
|
129 |
|
|
void getOldPos(double pos[3]); |
130 |
|
|
void getOldVel(double vel[3]); |
131 |
|
|
void getOldJ(double j[3]); |
132 |
|
|
void getOldA(double a[3][3]); |
133 |
|
|
void getOldQ(double q[4]); |
134 |
|
|
|
135 |
|
|
Atom* getAtom() {return dynamic_cast<Atom*>(refSd);} |
136 |
|
|
|
137 |
|
|
virtual void saveOldState(); |
138 |
|
|
|
139 |
|
|
protected: |
140 |
|
|
ConsAtomInfo* oldConsAtomInfo; |
141 |
|
|
|
142 |
|
|
}; |
143 |
|
|
|
144 |
|
|
|
145 |
|
|
|
146 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
147 |
|
|
//Declaration of ConsRbData |
148 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
149 |
|
|
class ConsRbData : public GenericData{ |
150 |
|
|
public: |
151 |
|
|
ConsRbData() : rb(NULL){} |
152 |
|
|
~ConsRbData(){ |
153 |
|
|
if (rb != NULL) |
154 |
|
|
delete rb; |
155 |
|
|
} |
156 |
|
|
|
157 |
|
|
RigidBody* getData() {return rb;} |
158 |
|
|
void setData(RigidBody* rhs) { |
159 |
|
|
if (rb != NULL) |
160 |
|
|
delete rb; |
161 |
|
|
rb = rhs; |
162 |
|
|
} |
163 |
|
|
|
164 |
|
|
private: |
165 |
|
|
RigidBody* rb; |
166 |
|
|
}; |
167 |
|
|
|
168 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
169 |
|
|
//Declaration of ConstraintElement |
170 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
171 |
|
|
class ConstraintRigidBody : public ConstraintElement{ |
172 |
|
|
public: |
173 |
|
|
ConstraintRigidBody(RigidBody*rhs, int index); |
174 |
|
|
|
175 |
|
|
void getOldPos(double pos[3]) {oldRb->getPos(pos);} |
176 |
|
|
void getOldVel(double vel[3]) {oldRb->getVel(vel);} |
177 |
|
|
void getOldJ(double j[3]) {oldRb->getJ(j);} |
178 |
|
|
void getOldA(double a[3][3]) {oldRb->getA(a);} |
179 |
|
|
void getOldQ(double q[4]) {oldRb->getQ(q);} |
180 |
|
|
|
181 |
|
|
void getOldAtomPos(double pos[3]) {oldRb->getAtomPos(pos, consAtomIndex);} |
182 |
|
|
void getCurAtomPos(double pos[3]) {((RigidBody*)refSd)->getAtomPos(pos, consAtomIndex);} |
183 |
|
|
|
184 |
|
|
RigidBody* getRigidBody() { return dynamic_cast<RigidBody*>(refSd);} |
185 |
|
|
|
186 |
|
|
virtual void saveOldState(); |
187 |
|
|
|
188 |
|
|
private: |
189 |
|
|
int consAtomIndex; |
190 |
|
|
RigidBody* oldRb; |
191 |
|
|
}; |
192 |
|
|
#endif // endif _CONSTRAINTELEMENT_H_ |