#include "arrow.h" #include "pad.h" #include "frame.h" #include "container.h" #include "exc.H" namespace blop { arrow::arrow() { head_length_ = 4*MM; headangle(30); } arrow &arrow::headangle(double d) { head_angle_ = d; head_width_ = tan(head_angle_/2*3.1415/180) * ! head_length_; return *this; } void arrow::prepare_for_draw() { if(print_me_ == 0) return; from_x_.register_me(); from_y_.register_me(); to_x_.register_me(); to_y_.register_me(); linewidth_.register_me(); head_length_.register_me(); head_width_.register_me(); } void arrow::print(terminal *t) { if(print_me_ != 2) return; t->comment("arrow::print"); t->set_linestyle(solid); t->set_linewidth(linewidth_.termspecific_id()); t->set_color(color_); vector<terminal::id> xx,yy; xx.push_back(from_x_.termspecific_id()); yy.push_back(from_y_.termspecific_id()); xx.push_back(to_x_.termspecific_id()); yy.push_back(to_y_.termspecific_id()); t->draw_lines(xx,yy); int dx_id = t->lincombi(1,from_x_.termspecific_id(), -1,to_x_.termspecific_id()); int dy_id = t->lincombi(1,from_y_.termspecific_id(), -1,to_y_.termspecific_id()); int atan_id = t->atan(dx_id,dy_id); int sin_id = t->sin_dbl(atan_id); int cos_id = t->cos_dbl(atan_id); int min_sin_id = t->neg_dbl(sin_id); int min_cos_id = t->neg_dbl(cos_id); t->comment("hello"); int xx1 = t->lincombi(terminal::double_id(0,sin_id), head_width_.termspecific_id(), terminal::double_id(0,cos_id), head_length_.termspecific_id()); int yy1 = t->lincombi(terminal::double_id(0,min_cos_id), head_width_.termspecific_id(), terminal::double_id(0,sin_id), head_length_.termspecific_id()); int xx2 = t->lincombi(terminal::double_id(0,min_sin_id), head_width_.termspecific_id(), terminal::double_id(0,cos_id), head_length_.termspecific_id()); int yy2 = t->lincombi(terminal::double_id(0,cos_id), head_width_.termspecific_id(), terminal::double_id(0,sin_id), head_length_.termspecific_id()); t->move_origin(to_x_.termspecific_id(), to_y_.termspecific_id()); xx.clear(); yy.clear(); xx.push_back(xx1); yy.push_back(yy1); xx.push_back(0); yy.push_back(0); xx.push_back(xx2); yy.push_back(yy2); t->draw_lines(xx,yy); t->move_origin(0,0); } arrow& arrow::draw(container *parent, const length &x1, const length &y1, const length &x2, const length &y2) { if(parent == 0) err("arrow::draw ==> parent == 0"); arrow *a = new arrow; a->from(x1,y1).to(x2,y2); a->autodel = true; parent->add(a); return *a; } arrow& arrow::fdraw(const length &x1, const length &y1, const length &x2, const length &y2) { return arrow::draw(frame::current(), x1, y1, x2, y2); } arrow& arrow::pdraw(const length &x1, const length &y1, const length &x2, const length &y2) { return arrow::draw(pad::current(), x1, y1, x2, y2); } arrow& arrow::cdraw(const length &x1, const length &y1, const length &x2, const length &y2) { return arrow::draw(canvas::current(), x1, y1, x2, y2); } }