-
Notifications
You must be signed in to change notification settings - Fork 1
/
drag.h
318 lines (284 loc) · 8.55 KB
/
drag.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
#ifndef DRAG_H
#define DRAG_H
#include <algorithm>
#include <cmath>
#include "spring_solver.h"
class SpringVertex;
class Drag {
void operator=(const Drag&);
Drag(const Drag&);
static double m_thickness;
static double m_tol;
public:
double m_t;
//set point type and register points
virtual void preprocess(std::vector<SpringVertex*>&){};
//update parameters for next step
virtual void postprocess(std::vector<SpringVertex*>&){};
//set velocity for each spring vertex
//according to point type
virtual void setVel(SpringVertex*) = 0;
virtual void updateVel(std::vector<SpringVertex*>& pts, double t) {}
//set acceleration for each spring vertex
//according to point type
virtual void setAccel(SpringVertex*) = 0;
//return number of parameters needed
virtual int getParameterNumber() {return 0;}
void setTimeStepSize(double dt) {m_dt = dt;}
double getTimeStepSize() {return m_dt;}
void spinToAxis(double*, double*, double, double*);
static void setThickness(double t){m_thickness = t;}
static double getThickness() {return m_thickness;}
static void setTolerance(double t){m_tol = t;}
static double getTolerance() {return m_tol;}
//prototype pattern
//the drag will be created using
//dragFactory() by providing appropriate
//data, should not call constructor directly
friend class DragProtoInit;
class Info {
std::string _id;
std::vector<double> _data;
public:
Info(std::string ident, std::vector<double> &dat):
_id(ident), _data(dat) {}
Info() {}
std::string &id() {return _id;}
const std::string& id() const {return _id;}
std::vector<double>& data() {return _data;}
const std::vector<double>& data() const {return _data;}
void clear() {_id.clear(); _data.clear(); }
bool empty() { return _id.empty(); }
};
virtual std::string id() = 0;
static std::vector<Drag*> prototypes;
static Drag* dragFactory(const Info &);
virtual Drag* clone(const Info &) = 0;
virtual size_t dataSize() { return 0; }
protected:
bool validateData(const Drag::Info&);
enum {FREE_POINT,ROTATE_POINT, STATIC_POINT, TRANS_DPOINT,
TRANS_CPOINT1, TRANS_CPOINT2};
double m_dt;
bool first = true;
Drag(double t) : m_t(t) {}
Drag(){}
};
class PLANE
{
public:
double center[3];
double dir[3];
double nor[3];
bool isFront(double* p);
bool isBack(double* p);
double distance(double* p);
PLANE(const double*, const double*);
};
class LINE
{
public:
double pOnLine1[3];
double pOnLine2[3];
LINE(const double*, const double*);
double distance(double* p);
};
class PointDrag : public Drag {
public:
double cent[3];
double rad;
double m_v[3];
double m_a[3];
virtual void preprocess(std::vector<SpringVertex*>&);
virtual void setVel(SpringVertex*);
virtual void setAccel(SpringVertex*);
virtual Drag* clone(const Drag::Info&);
std::string id() {return "PointDrag";}
virtual size_t dataSize() {return 11;}
PointDrag(const double c[], double r, const double v[], const double a[], double t);
PointDrag(){};
};
class GravityDrag : public PointDrag {
public:
void setAccel(SpringVertex*);
virtual Drag* clone(const Drag::Info&);
std::string id() {return "GravityDrag";}
virtual size_t dataSize() {return 8;}
GravityDrag(const double c[], const double r, const double a[], double t);
GravityDrag(){}
};
class LineDrag : public Drag {
protected :
LINE* dragLine;
LINE* controlLine1;
LINE* controlLine2;
double veld[3];
double velc1[3];
double accelc1[3];
double velc2[3];
double accelc2[3];
double accelStartTime1; // time for starting accelating motion
double accelStartTime2; // time for starting accelating motion
double m_ct; // current total time for this folding plan
public :
LineDrag() { m_ct = 0.0; }
virtual void preprocess(std::vector<SpringVertex*>&);
virtual void postprocess(std::vector<SpringVertex*>&);
virtual void setVel(SpringVertex*);
virtual void setAccel(SpringVertex*);
virtual Drag* clone(const Drag::Info&);
virtual size_t dataSize() {return 36;}
virtual std::string id() { return "LineDrag"; }
void accumCurTime() { m_ct += m_dt; }
};
class GravityBoxDrag : public Drag
{
public:
double L[3];
double U[3];
double g[3];
void preprocess(std::vector<SpringVertex*>&);
void setVel(SpringVertex*) {};
void setAccel(SpringVertex*);
Drag* clone(const Drag::Info&);
std::string id() {return "GravityBoxDrag";}
virtual size_t dataSize() {return 10;}
GravityBoxDrag(double t);
GravityBoxDrag(){}
};
class MultiplePointDrag : public Drag {
public:
struct DragPoint {
double cent[3];
double rad;
double m_v[3];
double m_a[3];
DragPoint(double[],double,double[],double[]);
};
std::vector<DragPoint*> dragPoints;
void preprocess(std::vector<SpringVertex*>&);
void setVel(SpringVertex*);
void setAccel(SpringVertex*);
int getDragPointNumber(double []);
void addDragPoint(DragPoint*);
virtual Drag* clone(const Drag::Info&);
std::string id() {return "MultiplePointDrag";}
MultiplePointDrag(double t);
MultiplePointDrag(){}
};
class FoldDrag : public Drag {
public:
PLANE* static_plane;
double angVel;
double spinOrig[3];
double spinDir[3];
void preprocess(std::vector<SpringVertex*>&);
void setVel(SpringVertex*);
void setAccel(SpringVertex*);
std::string id() {return "FoldDrag";}
virtual Drag* clone(const Drag::Info&);
virtual size_t dataSize() { return 14; }
FoldDrag() {}
};
class ZFoldDrag: public Drag {
private :
PLANE* static_plane1;
PLANE* static_plane2;
double angVel;
double spinOrig[3];
double spinDir[3];
public :
virtual void preprocess(std::vector<SpringVertex*>&);
virtual void setVel(SpringVertex*);
virtual void setAccel(SpringVertex*);
virtual std::string id() { return "ZFoldDrag"; }
virtual Drag* clone(const Drag::Info&);
virtual size_t dataSize() { return 20; }
ZFoldDrag() {}
};
class CloseUmbrellaDrag : public Drag {
int num_tuck_line;
double spinOrig[3];
double spinDir[3];
double angVel;
public:
void preprocess(std::vector<SpringVertex*>&);
std::string id() {return "CloseUmbrellaDrag";}
Drag* clone(const Drag::Info&);
void setVel(SpringVertex*);
void setAccel(SpringVertex*);
virtual size_t dataSize() { return 9; }
CloseUmbrellaDrag() {}
};
class RelaxDrag : public Drag {
public:
std::string id() {return "RelaxDrag";}
Drag* clone (const Drag::Info&);
void preprocess(std::vector<SpringVertex*>&);
void setVel(SpringVertex* sv) {}
void setAccel(SpringVertex* sv) {}
};
class CompressDrag: public Drag {
protected:
double center[3];
double accel[3];
double thickness;
public:
void preprocess(std::vector<SpringVertex*>&);
std::string id() {return "CompressDrag";}
Drag* clone(const Drag::Info&);
void setVel(SpringVertex* sv) {}
void setAccel(SpringVertex* sv);
virtual size_t dataSize() { return 8; }
};
class SeparateDrag: public Drag {
double spin_center[3];
double spin_dir[3];
double nor[3];
double angVel;
double radius;
double old_body_center[3];
public:
void preprocess(std::vector<SpringVertex*>&);
void postprocess(std::vector<SpringVertex*>&);
std::string id() {return "SeparateDrag";}
Drag* clone(const Drag::Info&);
void setVel(SpringVertex* sv);
void setAccel(SpringVertex* sv){}
virtual size_t dataSize() { return 11; }
};
class RollDrag: public Drag {
double spin_center[3];
double spin_dir[3];
double mov_center[3];
double mov_dir[3];
int num_layers;
double ang_vel;
double spacing;
public:
void preprocess(std::vector<SpringVertex*>&);
std::string id() {return "RollDrag";}
Drag* clone(const Drag::Info&);
virtual size_t dataSize() {return 14;}
void setVel(SpringVertex* sv);
void setAccel(SpringVertex* sv){}
};
class AlignDrag: public Drag {
double rotate_center[3];
double rotate_axis[3];
double gravity_center[3];
double dir[3];
double rotate_angle = 0;
double R[3][3];
AlignDrag(const double[], const double[]);
public:
AlignDrag(){};
void preprocess(std::vector<SpringVertex*>&);
void postprocess(std::vector<SpringVertex*>&);
std::string id() {return "AlignDrag";}
Drag* clone(const Drag::Info&);
virtual size_t dataSize() {return 6;}
void setVel(SpringVertex* sv){}
void setAccel(SpringVertex* sv){}
};
#endif