2011-06-26 08:30:44 +00:00
|
|
|
/********************************************************************
|
|
|
|
gYAxis Implementation
|
|
|
|
Copyright (c)2011 Mark Watkins <jedimark@users.sourceforge.net>
|
|
|
|
License: GPL
|
|
|
|
*********************************************************************/
|
|
|
|
|
|
|
|
#include <math.h>
|
2011-07-19 15:31:51 +00:00
|
|
|
#include <QDebug>
|
2011-06-26 08:30:44 +00:00
|
|
|
#include "gYAxis.h"
|
|
|
|
|
|
|
|
gYAxis::gYAxis(QColor col)
|
2011-07-31 20:24:43 +00:00
|
|
|
:gLayer(EmptyChannel)
|
2011-06-26 08:30:44 +00:00
|
|
|
{
|
2011-08-02 04:20:26 +00:00
|
|
|
m_line_color=col;
|
|
|
|
m_text_color=col;
|
|
|
|
m_major_color=Qt::darkGray;
|
|
|
|
m_minor_color=Qt::lightGray;
|
2011-06-26 08:30:44 +00:00
|
|
|
|
|
|
|
m_show_major_lines=true;
|
|
|
|
m_show_minor_lines=true;
|
2011-07-11 01:58:51 +00:00
|
|
|
m_yaxis_scale=1;
|
2011-06-26 08:30:44 +00:00
|
|
|
}
|
|
|
|
gYAxis::~gYAxis()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
void gYAxis::Plot(gGraphWindow &w,float scrx,float scry)
|
|
|
|
{
|
|
|
|
float x,y;
|
|
|
|
int labelW=0;
|
|
|
|
|
|
|
|
double miny=w.min_y;
|
|
|
|
double maxy=w.max_y;
|
2011-07-27 09:21:53 +00:00
|
|
|
|
|
|
|
double dy=maxy-miny;
|
|
|
|
if (dy<=0)
|
2011-06-26 08:30:44 +00:00
|
|
|
return;
|
2011-07-27 09:21:53 +00:00
|
|
|
|
|
|
|
int m;
|
|
|
|
if (maxy>500) {
|
|
|
|
m=ceil(maxy/100.0);
|
|
|
|
maxy=m*100;
|
|
|
|
m=floor(miny/100.0);
|
|
|
|
miny=m*100;
|
|
|
|
} else if (maxy>150) {
|
|
|
|
m=ceil(maxy/50.0);
|
|
|
|
maxy=m*50;
|
|
|
|
m=floor(miny/50.0);
|
|
|
|
miny=m*50;
|
|
|
|
} else if (maxy>80) {
|
|
|
|
m=ceil(maxy/20.0);
|
|
|
|
maxy=m*20;
|
|
|
|
m=floor(miny/20.0);
|
|
|
|
miny=m*20;
|
|
|
|
} else if (maxy>30) {
|
|
|
|
m=ceil(maxy/10.0);
|
|
|
|
maxy=m*10;
|
|
|
|
m=floor(miny/10.0);
|
|
|
|
miny=m*10;
|
|
|
|
} else if (maxy>5) {
|
|
|
|
m=ceil(maxy/5.0);
|
|
|
|
maxy=m*5;
|
|
|
|
m=floor(miny/5.0);
|
|
|
|
miny=m*5;
|
|
|
|
} else {
|
|
|
|
maxy=ceil(maxy);
|
|
|
|
if (maxy<1) maxy=1;
|
|
|
|
miny=floor(miny);
|
2011-08-01 08:27:03 +00:00
|
|
|
//if (miny<1) miny=0;
|
2011-07-27 09:21:53 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-07-18 02:33:25 +00:00
|
|
|
//if ((w.max_x-w.min_x)==0)
|
|
|
|
// return;
|
2011-06-26 08:30:44 +00:00
|
|
|
|
|
|
|
int start_px=w.GetLeftMargin();
|
|
|
|
int start_py=w.GetBottomMargin();
|
|
|
|
int width=scrx-(w.GetRightMargin()+start_px);
|
|
|
|
int topm=w.GetTopMargin();
|
|
|
|
int height=scry-(topm+start_py);
|
|
|
|
if (height<0) return;
|
|
|
|
|
|
|
|
QString fd="0";
|
|
|
|
GetTextExtent(fd,x,y);
|
|
|
|
|
|
|
|
double max_yticks=round(height / (y+15.0)); // plus spacing between lines
|
|
|
|
double yt=1/max_yticks;
|
|
|
|
|
|
|
|
|
|
|
|
double mxy=MAX(maxy,fabs(miny));
|
|
|
|
double mny=MIN(maxy,fabs(miny));
|
|
|
|
if (miny<0) mny=-mny;
|
|
|
|
if (maxy<0) mxy=-mxy;
|
|
|
|
|
|
|
|
double rxy=mxy-mny;
|
|
|
|
double ymult=height/rxy;
|
|
|
|
|
|
|
|
double min_ytick=rxy*yt;
|
|
|
|
|
|
|
|
float ty,h;
|
|
|
|
|
2011-06-28 01:51:21 +00:00
|
|
|
qint32 vertcnt=0;
|
2011-08-02 04:20:26 +00:00
|
|
|
GLshort * vertarray=(GLshort *)vertex_array[0];
|
|
|
|
qint32 minorvertcnt=0;
|
|
|
|
GLshort * minorvertarray=(GLshort *)vertex_array[1];
|
|
|
|
qint32 majorvertcnt=0;
|
|
|
|
GLshort * majorvertarray=(GLshort *)vertex_array[2];
|
|
|
|
|
|
|
|
if ((vertarray==NULL) || (minorvertarray==NULL) || (majorvertarray==NULL)) {
|
|
|
|
qWarning() << "gYAxis::Plot() VertArray==NULL";
|
2011-07-24 16:34:53 +00:00
|
|
|
return;
|
|
|
|
}
|
2011-06-26 08:30:44 +00:00
|
|
|
|
2011-07-23 03:50:30 +00:00
|
|
|
if (min_ytick<=0) {
|
|
|
|
qDebug() << "min_ytick error in gYAxis::Plot()";
|
|
|
|
return;
|
|
|
|
}
|
2011-07-02 16:07:38 +00:00
|
|
|
if (min_ytick>=1000000) {
|
|
|
|
min_ytick=100;
|
|
|
|
}
|
2011-06-26 08:30:44 +00:00
|
|
|
|
2011-07-23 03:50:30 +00:00
|
|
|
|
2011-06-26 08:30:44 +00:00
|
|
|
for (double i=miny+(min_ytick/2.0); i<maxy; i+=min_ytick) {
|
|
|
|
ty=(i - miny) * ymult;
|
|
|
|
h=(start_py+height)-ty;
|
|
|
|
vertarray[vertcnt++]=start_px-4;
|
|
|
|
vertarray[vertcnt++]=h;
|
|
|
|
vertarray[vertcnt++]=start_px;
|
|
|
|
vertarray[vertcnt++]=h;
|
|
|
|
if (m_show_minor_lines && (i > miny)) {
|
2011-08-02 04:20:26 +00:00
|
|
|
minorvertarray[minorvertcnt++]=start_px+1;
|
|
|
|
minorvertarray[minorvertcnt++]=h;
|
|
|
|
minorvertarray[minorvertcnt++]=start_px+width;
|
|
|
|
minorvertarray[minorvertcnt++]=h;
|
2011-06-26 08:30:44 +00:00
|
|
|
}
|
2011-07-24 16:34:53 +00:00
|
|
|
if (vertcnt>maxverts) {
|
|
|
|
qWarning() << "vertarray bounds exceeded in gYAxis for " << w.Title() << "graph" << "MinY =" <<miny << "MaxY =" << maxy << "min_ytick=" <<min_ytick;
|
2011-08-02 04:20:26 +00:00
|
|
|
break;
|
2011-07-24 16:34:53 +00:00
|
|
|
}
|
2011-06-26 08:30:44 +00:00
|
|
|
}
|
|
|
|
|
2011-06-30 09:37:24 +00:00
|
|
|
for (double i=miny; i<=maxy+min_ytick-0.00001; i+=min_ytick) {
|
2011-06-26 08:30:44 +00:00
|
|
|
ty=(i - miny) * ymult;
|
2011-07-11 01:58:51 +00:00
|
|
|
fd=Format(i*m_yaxis_scale); // Override this as a function.
|
2011-06-26 08:30:44 +00:00
|
|
|
GetTextExtent(fd,x,y);
|
|
|
|
if (x>labelW) labelW=x;
|
|
|
|
h=start_py+ty;
|
2011-08-02 04:20:26 +00:00
|
|
|
DrawText(w,fd,start_px-12-x,scry-(h-(y/2.0)),0,m_text_color);
|
2011-06-26 08:30:44 +00:00
|
|
|
|
|
|
|
vertarray[vertcnt++]=start_px-4;
|
|
|
|
vertarray[vertcnt++]=h;
|
|
|
|
vertarray[vertcnt++]=start_px;
|
|
|
|
vertarray[vertcnt++]=h;
|
2011-07-24 16:34:53 +00:00
|
|
|
if (vertcnt>maxverts) {
|
|
|
|
qWarning() << "vertarray bounds exceeded in gYAxis for " << w.Title() << "graph" << "MinY =" <<miny << "MaxY =" << maxy << "min_ytick=" <<min_ytick;
|
|
|
|
return;
|
|
|
|
}
|
2011-06-26 08:30:44 +00:00
|
|
|
|
|
|
|
if (m_show_major_lines && (i > miny)) {
|
2011-08-02 04:20:26 +00:00
|
|
|
majorvertarray[majorvertcnt++]=start_px+1;
|
|
|
|
majorvertarray[majorvertcnt++]=h;
|
|
|
|
majorvertarray[majorvertcnt++]=start_px+width;
|
|
|
|
majorvertarray[majorvertcnt++]=h;
|
2011-06-26 08:30:44 +00:00
|
|
|
}
|
|
|
|
}
|
2011-07-19 15:31:51 +00:00
|
|
|
if (vertcnt>=maxverts) {
|
2011-07-24 16:34:53 +00:00
|
|
|
qWarning() << "vertarray bounds exceeded in gYAxis for " << w.Title() << "graph";
|
2011-07-19 15:31:51 +00:00
|
|
|
return;
|
|
|
|
}
|
2011-06-26 08:30:44 +00:00
|
|
|
|
2011-08-02 04:20:26 +00:00
|
|
|
// Draw the lines & ticks
|
|
|
|
// Turn on blending??
|
2011-06-26 08:30:44 +00:00
|
|
|
glLineWidth(1);
|
2011-08-02 04:20:26 +00:00
|
|
|
w.qglColor(m_line_color);
|
2011-06-26 08:30:44 +00:00
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glVertexPointer(2, GL_SHORT, 0, vertarray);
|
|
|
|
glDrawArrays(GL_LINES, 0, vertcnt>>1);
|
2011-08-02 04:20:26 +00:00
|
|
|
w.qglColor(m_minor_color);
|
|
|
|
glVertexPointer(2, GL_SHORT, 0, minorvertarray);
|
|
|
|
glDrawArrays(GL_LINES, 0, minorvertcnt>>1);
|
|
|
|
w.qglColor(m_major_color);
|
|
|
|
glVertexPointer(2, GL_SHORT, 0, majorvertarray);
|
|
|
|
glDrawArrays(GL_LINES, 0, majorvertcnt>>1);
|
2011-06-26 08:30:44 +00:00
|
|
|
glDisableClientState(GL_VERTEX_ARRAY); // deactivate vertex arrays after drawing
|
|
|
|
}
|
|
|
|
|