Choreonoid  1.5
MultiSeq.h
Go to the documentation of this file.
1 
6 #ifndef CNOID_UTIL_MULTI_SEQ_H
7 #define CNOID_UTIL_MULTI_SEQ_H
8 
9 #include "AbstractSeq.h"
10 #include "Deque2D.h"
11 #include <Eigen/StdVector>
12 #include <boost/make_shared.hpp>
13 #include <algorithm>
14 
15 
16 namespace cnoid {
17 
18 template <typename ElementType, typename Allocator = std::allocator<ElementType> >
19 class MultiSeq : public Deque2D<ElementType, Allocator>, public AbstractMultiSeq
20 {
22 
23 public:
25 
26  typedef typename Container::Element Element;
27  typedef boost::shared_ptr< MultiSeqType > Ptr;
28  typedef typename Container::Row Frame;
29  typedef typename Container::Column Part;
30 
31  MultiSeq(const char* seqType)
32  : AbstractMultiSeq(seqType),
33  Container(0, 1) {
35  offsetTimeFrame_ = 0;
36  }
37 
38  MultiSeq(const char* seqType, int numFrames, int numParts)
39  : AbstractMultiSeq(seqType),
40  Container(numFrames, numParts) {
42  offsetTimeFrame_ = 0;
43  }
44 
45  MultiSeq(const MultiSeqType& org)
46  : AbstractMultiSeq(org),
47  Container(org) {
48  frameRate_ = org.frameRate_;
50  }
51 
52  virtual ~MultiSeq() { }
53 
54  MultiSeqType& operator=(const MultiSeqType& rhs) {
55  if(this != &rhs){
58  frameRate_ = rhs.frameRate_;
59  }
60  return *this;
61  }
62 
63  virtual AbstractSeq& operator=(const AbstractSeq& rhs) {
64  const MultiSeqType* rhsSeq = dynamic_cast<const MultiSeqType*>(&rhs);
65  if(rhsSeq){
66  return operator=(*rhsSeq);
67  } else {
68  return AbstractSeq::operator=(rhs);
69  }
70  }
71 
72  virtual AbstractSeqPtr cloneSeq() const {
73  return boost::make_shared<MultiSeqType>(*this);
74  }
75 
76  void copySeqProperties(const MultiSeqType& source) {
78  frameRate_ = source.frameRate_;
79  setNumParts(source.numParts());
80  }
81 
82  virtual void setDimension(int newNumFrames, int newNumParts, bool clearNewElements = false) {
83 
84  const int prevNumParts = numParts();
85  const int prevNumFrames = numFrames();
86 
87  Container::resize(newNumFrames, newNumParts);
88 
89  if(clearNewElements){
90  if(newNumParts == prevNumParts){
91  if(newNumFrames > prevNumFrames){
92  std::fill(Container::begin() + prevNumFrames * newNumParts,
94  defaultValue());
95  }
96  } else {
97  std::fill(Container::begin(), Container::end(), defaultValue());
98  }
99  }
100 
101  offsetTimeFrame_ = 0;
102  }
103 
104  virtual double getFrameRate() const {
105  return frameRate_;
106  }
107 
108  double frameRate() const {
109  return frameRate_;
110  }
111 
112  virtual void setFrameRate(double frameRate) {
114  }
115 
116  const double timeStep() const {
117  return 1.0 / frameRate_;
118  }
119 
120  virtual void setNumParts(int newNumParts, bool clearNewElements = false) {
121  setDimension(numFrames(), newNumParts, clearNewElements);
122  }
123 
124  virtual int getNumFrames() const {
125  return Container::rowSize();
126  }
127 
128  int numFrames() const {
129  return Container::rowSize();
130  }
131 
132  virtual void setNumFrames(int newNumFrames, bool clearNewElements = false) {
133  setDimension(newNumFrames, numParts(), clearNewElements);
134  }
135 
136  void clearFrames(){
137  setNumFrames(0);
138  offsetTimeFrame_ = 0;
139  }
140 
141  virtual int getNumParts() const {
142  return Container::colSize();
143  }
144 
145  int numParts() const {
146  return Container::colSize();
147  }
148 
149  double timeLength() const {
150  return numFrames() / frameRate();
151  }
152 
153  void setOffsetTimeFrame(int frameOffset) {
154  offsetTimeFrame_ = frameOffset;
155  }
156 
157  int offsetTimeFrame() const {
158  return offsetTimeFrame_;
159  }
160 
161  virtual int getOffsetTimeFrame() const {
162  return offsetTimeFrame_;
163  }
164 
165  int frameOfTime(double time) const {
166  return (int)(time * frameRate_) - offsetTimeFrame_;
167  }
168 
169  double timeOfFrame(int frame) const {
170  return ((frame + offsetTimeFrame_) / frameRate_);
171  }
172 
173  const Part part(int index) const {
174  return Container::column(index);
175  }
176 
177  Part part(int index) {
178  return Container::column(index);
179  }
180 
181  Frame frame(int index) {
182  return Container::row(index);
183  }
184 
185  const Frame frame(int index) const {
186  return Container::row(index);
187  }
188 
189  void popFrontFrame() {
191  offsetTimeFrame_ += 1;
192  }
193 
194  Frame appendFrame() {
195  return Container::append();
196  }
197 
198  int clampFrameIndex(int frameIndex){
199  if(frameIndex < 0){
200  return 0;
201  } else if(frameIndex >= numFrames()){
202  return numFrames() - 1;
203  }
204  return frameIndex;
205  }
206 
207 protected:
208 
209  double frameRate_;
211 
212  virtual ElementType defaultValue() const { return ElementType(); }
213 };
214 
215 }
216 
217 #endif
double frameRate() const
Definition: MultiSeq.h:108
virtual AbstractSeq & operator=(const AbstractSeq &rhs)
Definition: MultiSeq.h:63
const std::string & seqType() const
Definition: AbstractSeq.h:38
double timeOfFrame(int frame) const
Definition: MultiSeq.h:169
virtual ~MultiSeq()
Definition: MultiSeq.h:52
Container::Element Element
Definition: MultiSeq.h:26
MultiSeq(const char *seqType, int numFrames, int numParts)
Definition: MultiSeq.h:38
int numParts() const
Definition: MultiSeq.h:145
MultiSeq(const MultiSeqType &org)
Definition: MultiSeq.h:45
MultiSeqType & operator=(const MultiSeqType &rhs)
Definition: MultiSeq.h:54
virtual void setNumFrames(int newNumFrames, bool clearNewElements=false)
Definition: MultiSeq.h:132
AbstractMultiSeq & operator=(const AbstractMultiSeq &rhs)
Definition: AbstractSeq.cpp:156
virtual AbstractSeqPtr cloneSeq() const
Definition: MultiSeq.h:72
static const double defaultFrameRate()
Definition: AbstractSeq.h:96
void pop_front()
Definition: Deque2D.h:635
int clampFrameIndex(int frameIndex)
Definition: MultiSeq.h:198
virtual ElementType defaultValue() const
Definition: MultiSeq.h:212
Definition: AbstractSeq.h:118
iterator end()
Definition: Deque2D.h:143
void copySeqProperties(const MultiSeqType &source)
Definition: MultiSeq.h:76
void copySeqProperties(const AbstractMultiSeq &source)
Definition: AbstractSeq.cpp:163
boost::shared_ptr< AbstractSeq > AbstractSeqPtr
Definition: AbstractSeq.h:19
virtual int getNumFrames() const
Definition: MultiSeq.h:124
virtual void setNumParts(int newNumParts, bool clearNewElements=false)
Definition: MultiSeq.h:120
Container::Row Frame
Definition: MultiSeq.h:28
void clearFrames()
Definition: MultiSeq.h:136
virtual double getFrameRate() const
Definition: MultiSeq.h:104
virtual int getOffsetTimeFrame() const
Definition: MultiSeq.h:161
double frameRate_
Definition: MultiSeq.h:209
int numFrames() const
Definition: MultiSeq.h:128
MultiSeq(const char *seqType)
Definition: MultiSeq.h:31
virtual int getNumParts() const
Definition: MultiSeq.h:141
int offsetTimeFrame() const
Definition: MultiSeq.h:157
Part part(int index)
Definition: MultiSeq.h:177
void resize(int newRowSize, int newColSize)
Definition: Deque2D.h:522
Definition: Deque2D.h:16
Definition: AbstractSeq.h:23
Frame appendFrame()
Definition: MultiSeq.h:194
Defines the minimum processing for performing pasing file for STL.
Definition: AbstractSceneLoader.h:9
void setOffsetTimeFrame(int frameOffset)
Definition: MultiSeq.h:153
double timeLength() const
Definition: MultiSeq.h:149
Definition: MultiSeq.h:19
Row row(int rowIndex)
Definition: Deque2D.h:573
Container::Column Part
Definition: MultiSeq.h:29
int offsetTimeFrame_
Definition: MultiSeq.h:210
virtual void setFrameRate(double frameRate)
Definition: MultiSeq.h:112
int colSize() const
Definition: Deque2D.h:541
iterator begin()
Definition: Deque2D.h:135
int rowSize() const
Definition: Deque2D.h:530
const Frame frame(int index) const
Definition: MultiSeq.h:185
virtual void setDimension(int newNumFrames, int newNumParts, bool clearNewElements=false)
Definition: MultiSeq.h:82
const double timeStep() const
Definition: MultiSeq.h:116
Column column(int colIndex)
Definition: Deque2D.h:589
const Part part(int index) const
Definition: MultiSeq.h:173
Frame frame(int index)
Definition: MultiSeq.h:181
virtual AbstractSeq & operator=(const AbstractSeq &rhs)
Definition: AbstractSeq.cpp:30
Deque2DType & operator=(const Deque2DType &rhs)
Definition: Deque2D.h:339
int frameOfTime(double time) const
Definition: MultiSeq.h:165
void popFrontFrame()
Definition: MultiSeq.h:189
boost::shared_ptr< MultiSeqType > Ptr
Definition: MultiSeq.h:27
Deque2D< ElementType, Allocator > Container
Definition: MultiSeq.h:24
Row append()
Definition: Deque2D.h:597