📄 fl_cartesian.cpp
字号:
}
/////////////////////////////// Ca_Canvas ////////////////////////////////////////////
Ca_Canvas *Ca_Canvas::current_=0;
void Ca_Canvas::draw(){
uchar damage_= damage();
// int _b=border_/2;
// int _x=x()+_b;
// int _y=y()+_b;
// int _w=w()-2*_b;
// int _h=h()-2*_b;
int replot=0;
Ca_Axis_ *axis = last_axis_;
/// something similar will go in the future into the lauout layer...
while (axis){
replot |= axis->update();
axis=axis->previous_axis_;
}
///
if(damage_!=CA_DAMAGE_ADD)
draw_box();
fl_clip(x()+Fl::box_dx(box()),y()+Fl::box_dy(box()),w()-Fl::box_dw(box()),h()-Fl::box_dh(box()));
if((damage_!=CA_DAMAGE_ADD)||replot){
last_plotted_=0;
axis=last_axis_;
while(axis){
if(!(axis->grid_visible()&CA_FRONT)&&(axis->visible()||(axis->grid_visible()&CA_ALWAYS_VISIBLE)))
axis->draw_grid();
axis=axis->previous_axis_;
}
}
if (last_plotted_)
last_plotted_=last_plotted_->next;
else
last_plotted_=first_object_;
while(last_plotted_){
last_plotted_->object->draw();
last_plotted_=last_plotted_->next;
}
last_plotted_=last_object_;
axis=last_axis_;
while(axis){
if((axis->grid_visible()&CA_FRONT)&&(axis->visible()||(axis->grid_visible()&CA_ALWAYS_VISIBLE)))
axis->draw_grid();
axis=axis->previous_axis_;
}
fl_pop_clip();
if (damage_&FL_DAMAGE_ALL)
draw_label();
};
void Ca_Canvas::add_object(Ca_Object_ * object){
last_object_=last_object_->next=new Ca_ObjectChain();
last_object_->object=object;
};
void Ca_Canvas::clear(){
while(first_object_)
delete first_object_->object;
damage(CA_DAMAGE_ALL);
};
Ca_Canvas::Ca_Canvas(int x, int y, int w, int h, const char *label)
:Fl_Box(x,y,w,h,label),
last_axis_(0),border_(CANVAS_BORDER), current_x_(0), current_y_(0),
first_object_(0),last_object_(0),last_plotted_(0)
{
current(this);
};
void Ca_Canvas::border(int border){
border_=border;
damage(CA_DAMAGE_ALL);
Ca_Axis_ *axis=last_axis_;
while(axis){
axis->damage(CA_DAMAGE_ALL);
axis=axis->previous_axis_;
}
};
Ca_Canvas::~Ca_Canvas(){
clear();
Ca_Axis_ *axis=last_axis_;
while(axis){
last_axis_=axis->previous_axis_;
axis->canvas_=0;
axis = last_axis_;
}
};
//////////////////////// Ca_Object //////////////////////
Ca_Object_::Ca_Object_(Ca_Canvas * canvas)
:canvas_(canvas)
{
if(!canvas_)
canvas_=Ca_Canvas::current();
Ca_ObjectChain *objectchain=new(Ca_ObjectChain);
objectchain->object=this;
objectchain->next=0;
if(canvas_->last_object_)
canvas_->last_object_=canvas_->last_object_->next=objectchain;
else
canvas_->last_object_=canvas_->first_object_=objectchain;
x_axis_=canvas_->current_x();
y_axis_=canvas_->current_y();
canvas_->damage(CA_DAMAGE_ADD);
};
Ca_Object_::~Ca_Object_(){
Ca_ObjectChain * objectchain=canvas_->first_object_;
Ca_ObjectChain * previouschain=0;
while(objectchain->object!=this){
previouschain=objectchain;
objectchain=objectchain->next;
}
if(previouschain)
previouschain->next=objectchain->next;
else
canvas_->first_object_=objectchain->next;
if(canvas_->last_object_==objectchain)
canvas_->last_object_=previouschain;
delete objectchain;
canvas_->last_plotted_=0;
canvas_->damage(CA_DAMAGE_ALL);
};
///////////////////////// Ca_Point //////////////////////////////////////////////////////
void Ca_Point::draw(){
fl_color(color);
double s,t;
double _x=x_axis_->position(x);
double _y=y_axis_->position(y);
switch(style & CA_POINT_STYLE){
case CA_NO_POINT:
break;
case CA_SIMPLE:
ca_point(_x,_y);
break;
case CA_ROUND:
ca_filled_circle(_x,_y,size);
//ca_pie(_x-size,_y-size,2*size,2*size,0,360);
if (style & CA_BORDER){
fl_color(border_color);
fl_line_style(0,border_width);
fl_begin_loop();
fl_circle(_x,_y,size);
fl_end_loop();
fl_line_style(0,0);
}
break;
case CA_SQUARE:
ca_rectf(_x-size,_y-size,2*size,2*size);
if (style & CA_BORDER){
fl_color(border_color);
fl_line_style(0,border_width);
ca_rect(_x-size,_y-size,2*size,2*size);
fl_line_style(0,0);
}
break;
case CA_UP_TRIANGLE:
s=(int)(1.12*size+0.5);
t=_y+size/3;
ca_polygon(_x,t-2*size,_x-s,t,_x+s,t);
if (style & CA_BORDER){
fl_color(border_color);
fl_line_style(0,border_width);
ca_loop(_x,t-2*size,_x-s,t,_x+s,t);
fl_line_style(0,0);
}
break;
case CA_DOWN_TRIANGLE:
s=(int)(1.12*size+0.5);
t=_y-size/3;
ca_polygon(_x,t+2*size,_x-s,t,_x+s,t);
if (style & CA_BORDER){
fl_color(border_color);
fl_line_style(0,border_width);
ca_loop(_x,t+2*size,_x-s,t,_x+s,t);
fl_line_style(0,0);
}
break;
case CA_DIAMOND:
s=(int)(1.3*size+0.5);
ca_polygon(_x,_y-s,_x-s,_y,_x,_y+s,_x+s,_y);
if (style & CA_BORDER){
fl_color(border_color);
fl_line_style(0,border_width);
ca_loop(_x,_y-s,_x-s,_y,_x,_y+s,_x+s,_y);
fl_line_style(0,0);
}
break;
}
};
Ca_Point::Ca_Point(double _x, double _y, Fl_Color _color, int _style, int _size, Fl_Color _border_color, int _border_width)
:Ca_Object_(0),
x(_x),
y(_y),
style(_style),
size(_size),
color(_color),
border_color(_border_color),
border_width(_border_width)
{
};
//////////////////////////// Ca_LinePoint ////////////////////////////////////////////////////////
void Ca_LinePoint::draw(){
Ca_Point::draw();
if(previous){
fl_color(color);
fl_line_style(0,line_width);
fl_begin_line();
fl_vertex(previous->x_axis_->position(previous->x),previous->y_axis_->position(previous->y));
fl_vertex(x_axis_->position(x),y_axis_->position(y));
fl_end_line();
fl_line_style(0,0);
}
};
Ca_LinePoint::Ca_LinePoint( Ca_LinePoint *_previous, double _x, double _y,int _line_width, Fl_Color color, int style, int size, Fl_Color border_color, int _border_width):Ca_Point(_x, _y, color, style, size, border_color, _border_width){
previous=_previous;
line_width=_line_width;
};
Ca_LinePoint::Ca_LinePoint(Ca_LinePoint *_previous, double _x, double _y)
:Ca_Point(_x, _y, previous->color, previous->style, previous->size,previous->border_color, previous->border_width),
previous(_previous)
{
if(_previous)
line_width=_previous->line_width;
else
line_width=0;
};
//////////////////////////// Ca_PolyLine ////////////////////////////////////////////////////////
Ca_PolyLine::Ca_PolyLine(Ca_PolyLine *_previous, double _x, double _y,int _line_style, int _line_width, Fl_Color color, int style, int size, Fl_Color border_color,int _border_width)
:Ca_LinePoint(_previous, _x, _y, _line_width, color, style, size, border_color, _border_width),
line_style(_line_style)
{
next=0;
if(_previous) _previous->next=this;
canvas_->damage(CA_DAMAGE_ALL);
};
Ca_PolyLine::Ca_PolyLine(Ca_PolyLine *_previous, double _x, double _y):Ca_LinePoint(_previous,x,y){
next=0;
if(_previous){
line_style=_previous->line_style;
_previous->next=this;
}
canvas_->damage(CA_DAMAGE_ALL);
};
void Ca_PolyLine::draw(){
Ca_Point::draw();
if(next) return;
Ca_PolyLine * temp;
int c=color;
int style=line_style;
int size=line_width;
fl_color(c);
fl_line_style(style,size);
fl_begin_line();
fl_vertex(x_axis_->position(x),y_axis_->position(y));
temp=(Ca_PolyLine *)previous;
while(temp){
fl_vertex(temp->x_axis_->position(temp->x),temp->y_axis_->position(temp->y));
if((temp->line_style != style)||(temp->color!=c)||(temp->line_width!=size)){
fl_end_line();
c=temp->color;
style=temp->line_style;
size=temp->line_width;
fl_color(c);
fl_line_style(style,size);
fl_begin_line();
fl_vertex(temp->x_axis_->position(x),temp->y_axis_->position(y));
}
temp=(Ca_PolyLine *)(temp->previous);
}
fl_end_line();
fl_line_style(0,0);
};
Ca_Line::Ca_Line(int _n, double *_data, double *_data_2, int _line_style, int _line_width, Fl_Color color, int style, int size, Fl_Color border_color, int border_width)
:Ca_Point(0, 0, color, style, size, border_color, border_width),
line_style(_line_style),
line_width(_line_width),
n(_n),
data(_data),
data_2(_data_2)
{
};
Ca_Line::Ca_Line(int _n, double *_data, int _line_style, int _line_width, Fl_Color color, int style, int size, Fl_Color border_color, int border_width)
:Ca_Point(0, 0, color, style, size, border_color, border_width),
line_style(_line_style),
line_width(_line_width),
n(_n),
data(_data),
data_2(0)
{
};
void Ca_Line::draw(){
fl_color(color);
fl_line_style(line_style,line_width);
fl_begin_line();
int i;
if(data_2){
for(i=0;i<n;i++)
fl_vertex(x_axis_->position(data[i]),y_axis_->position(data_2[i]));
fl_end_line();
fl_line_style(0,0);
for(i=0;i<n;i++){
x=data[i];
y=data_2[i];
Ca_Point::draw();
}
}else{
for(i=0;i<n;i++)
fl_vertex(x_axis_->position(data[2*i]),y_axis_->position(data[2*i+1]));
fl_end_line();
for(i=0;i<n;i++){
x=data[2*i];
y=data[2*i+1];
Ca_Point::draw();
}
fl_line_style(0,0);
}
};
void Ca_Text::draw(){
uchar align_=align;
double X,Y,W,H;
double X1,Y1;
X = x_axis_->position(x1);
X1 = x_axis_->position(x2);
if(X1>X)
W=X1-X;
else{
W=X-X1;
X=X1;
}
Y = y_axis_->position(y1);
Y1 = y_axis_->position(y2);
if(Y1>Y)
H = Y1-Y;
else{
H = Y-Y1;
Y = Y1;
}
fl_color(label_color);
fl_font(label_font,label_size);
ca_text(label,X,Y,W,H,(Fl_Align)align_);
};
Ca_Text::Ca_Text(double _x1, double _x2, double _y1, double _y2, char *_label, uchar _align, Fl_Font _label_font, int _label_size, Fl_Color _label_color)
:Ca_Object_(0),
x1(_x1), x2(_x2), y1(_y1), y2(_y2),
label(_label),
align(_align),
label_color(_label_color),
label_font(_label_font),
label_size(_label_size)
{};
Ca_Text::Ca_Text(double x, double y,char *_label, uchar _align, Fl_Font _label_font, int _label_size, Fl_Color _label_color)
:Ca_Object_(0),
x1(x), x2(x), y1(y), y2(y),
label(_label),
align(_align),
label_color(_label_color),
label_font(_label_font),
label_size(_label_size)
{};
void Ca_Bar::draw(){
uchar align_=align;
double X,Y,W,H;
double X1,Y1;
X = x_axis_->position(x1);
X1 = x_axis_->position(x2);
if(X1>X)
W=X1-X;
else{
W=X-X1;
X=X1;
}
Y = y_axis_->position(y1);
Y1 = y_axis_->position(y2);
if(Y1>Y)
H = Y1-Y;
else{
H = Y-Y1;
Y = Y1;
}
fl_color(color);
ca_rectf(X,Y,W,H);
if(border_width>=0){
fl_color(border_color);
fl_line_style(FL_SOLID|FL_CAP_SQUARE, border_width);
ca_rect(X,Y,W,H);
}
fl_line_style(0,0);
if(!(align_&15)||(align_&FL_ALIGN_INSIDE)){
X += border_width/2;
W -= border_width;
Y += border_width/2;
H -= border_width;
}else{
X -= border_width/2;
W += border_width;
Y -= border_width/2;
H += border_width;
if (align_ & FL_ALIGN_TOP){
align_ ^= (FL_ALIGN_BOTTOM|FL_ALIGN_TOP);
H=Y;
Y=canvas_->y()+Fl::box_dy(canvas_->box());
H-=Y;
}else if(align_ & FL_ALIGN_BOTTOM){
align_^=(FL_ALIGN_BOTTOM|FL_ALIGN_TOP);
Y=Y+H;
H=canvas_->y()+canvas_->h()+Fl::box_dy(canvas_->box())-Fl::box_dh(canvas_->box())-Y;
}else if(align_ & FL_ALIGN_LEFT){
align_^=(FL_ALIGN_LEFT|FL_ALIGN_RIGHT);
W=X;
X=canvas_->x()+Fl::box_dx(canvas_->box());
W=W-X-3;
}else if(align_ & FL_ALIGN_RIGHT){
align_ ^=(FL_ALIGN_LEFT|FL_ALIGN_RIGHT);
X=X+W+3;
W=canvas_->x()+Fl::box_dx(canvas_->box())+canvas_->w()-Fl::box_dw(canvas_->box())-X;
}
}
fl_color(label_color);
fl_font(label_font,label_size);
ca_text(label,X,Y,W,H,(Fl_Align)align_);
};
Ca_Bar::Ca_Bar(double _x1, double _x2, double _y1, double _y2, Fl_Color _color, Fl_Color _border_color, int _border_width, char *_label, uchar _align, Fl_Font _label_font, int _label_size, Fl_Color _label_color)
:Ca_Text(_x1, _x2, _y1, _y2, _label, _align, _label_font, _label_size, _label_color),
color(_color),
border_color(_border_color),
border_width(_border_width)
{
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -