2 * psychlops_figure_standard.cpp
3 * Psychlops Standard Library (Universal)
5 * Last Modified 2005/10/05 by Kenchi HOSOKAWA
6 * (C) 2005 Kenchi HOSOKAWA, Kazushi MARUYA, Takao SATO
9 #include "psychlops_figure_standard.h"
18 //////// Arrow ////////
19 Polygon Arrow::default_head;
21 void Arrow::createDefaultHead() {
22 default_head.append(Point(0,0));
23 default_head.append(Point( 5,20));
24 default_head.append(Point(-5,20));
26 void Arrow::setDefaultHead() {
27 if(default_head.empty()) createDefaultHead();
28 if(head==0) head = &default_head;
32 Arrow::Arrow() : Line(), head(0) {
35 Arrow::Arrow(const double x1, const double y1, const double x2, const double y2) : Line(x1, y1, x2, y2), head(0) {
38 Arrow::Arrow(const Point &dbegin, const Point &dvec) : Line(dbegin, dvec), head(0) {
41 Arrow& Arrow::set(const double x1, const double y1, const double x2, const double y2) {
42 Point b(x1, y1), e(x2, y2);
45 Arrow& Arrow::set(const Point &dbegin, const Point &dend) {
46 datum = dbegin, end = dend;
51 Arrow& Arrow::draw(Drawable& target) {
52 Shape::draw_base(target);
55 Arrow& Arrow::draw(const Color &col, Drawable& target) {
56 target.line(*this, col);
57 gr.centering(this->end);
58 Point vec = this->end-this->datum;
59 gr.rotation = 180-atan2(vec.x, vec.y)/2.0/PI*360;
61 head->stroke = Stroke::null_line;
65 Arrow& Arrow::draw(const Stroke &strk, Drawable& target) {
66 target.line(*this, strk);
67 gr.centering(this->end);
68 Point vec = this->end-this->datum;
69 gr.rotation = 180-atan2(vec.x, vec.y)/2.0/PI*360;
70 head->fill = strk.color;
71 head->stroke = Stroke::null_line;
78 //////// Cross ////////
79 Cross::Cross() { stroke = Stroke::hair_line; }
80 Cross::Cross(const Rectangle& rect, Stroke dstrk) {
83 Cross::Cross(double wid, double hei, Stroke dstrk) {
87 Cross& Cross::set(const Rectangle& rect, Stroke dstrk) {
88 width = rect.getWidth();
89 height = rect.getHeight();
93 Cross& Cross::set(double wid, double hei, Stroke dstrk) {
99 Cross& Cross::centering() {
100 if(Drawable::prime!=0) {
\r
101 centering(Drawable::prime->getCenter());
\r
105 Cross& Cross::centering(const Point &p) {
109 Cross& Cross::draw(Drawable &target) {
110 draw(stroke, target);
113 Cross& Cross::draw(const Color &col, Drawable &target) {
114 Line lx(datum.x - width/2, datum.y, datum.x + width/2, datum.y);
115 Line ly(datum.x, datum.y - height/2, datum.x, datum.y + height/2);
116 target.line(lx, col);
117 target.line(ly, col);
120 Cross& Cross::draw(const Stroke &strk, Drawable &target) {
121 Line lx(datum.x - width/2, datum.y, datum.x + width/2, datum.y);
122 Line ly(datum.x, datum.y - height/2, datum.x, datum.y + height/2);
123 target.line(lx, strk);
124 target.line(ly, strk);
133 current_frame_index = 0;
140 Movie & Movie::clear()
142 for(int i=0; i<frames.size(); i++)
148 Movie & Movie::reserveFrames(int frame_num)
151 frames.resize(frame_num);
152 for(int i=0; i<frames.size(); i++)
154 frames[i] = new Image();
158 Movie & Movie::set(Image* input_frames, int frame_num)
160 reserveFrames(frame_num);
161 for(int i=0; i<frame_num; i++)
163 frames[i]->from(input_frames[i]);
168 Image& Movie::operator[](int frame_num)
170 return *frames[frame_num];
172 int Movie::getCurrentIndex()
174 return current_frame_index;
176 int Movie::setCurrentIndex(int new_current)
178 return current_frame_index = new_current;
182 Movie& Movie::nextFrame()
\r
184 if(current_frame_index<frames.size())
\r
186 current_frame_index++;
\r
190 Movie& Movie::draw(Drawable& target)
192 current_frame_index %= frames.size();
193 //frame[current_frame_index]->move_to(this->getDatum().x, this->getDatum().y);
194 frames[current_frame_index]->draw(target);
195 current_frame_index++;
199 Movie& Movie::captureOnce()
201 captureOnce(source_area);
204 Movie& Movie::captureOnce(const Rectangle &source_area_)
206 Image *img = new Image();
207 frames.push_back(img);
208 if(Drawable::prime_is_a_canvas())
\r
210 Canvas *a = dynamic_cast<Canvas *>(Drawable::prime);
\r
211 a->to(*img, source_area_);
\r
215 Movie& Movie::captureOnce(int target_frame)
217 captureOnce(source_area, target_frame);
220 Movie& Movie::captureOnce(const Rectangle &source_area_, int target_frame)
222 if(Drawable::prime_is_a_canvas())
224 dynamic_cast<Canvas *>(Drawable::prime)->to(*(frames[target_frame]), source_area_);
228 Movie& Movie::saveEachFrames(const std::string filePrefix)
231 for(int i=0; i<frames.size(); i++) {
233 sprintf(buf, "%u", i);
234 frames[i]->save(filePrefix+"_"+buf+".png");
241 } /* <- namespace Psycholops */