www.pudn.com > Genecircus20070919.rar > Staticdraw.cpp
#include "Staticdraw.h"
#include "ResultDialog.h"
IMPLEMENT_DYNAMIC_CLASS(CStaticdraw, wxStaticBox)
BEGIN_EVENT_TABLE(CStaticdraw,wxStaticBox)
EVT_PAINT(CStaticdraw::OnPaint)
END_EVENT_TABLE()
CStaticdraw::CStaticdraw(void)
{
}
CStaticdraw::CStaticdraw(wxWindow* parent, wxWindowID id, const wxString& label, const wxPoint& pos, const wxSize& size)
: wxStaticBox( parent, id,wxString(_T("")), pos, size )
{
bl = ((ResultDialog*)parent)->bl;
}
CStaticdraw::~CStaticdraw(void)
{
hi1.clear();
hi2.clear();
}
void CStaticdraw::OnPaint(wxPaintEvent &event)
{
wxClientDC dc(this);
PrepareDC(dc);
dc.Clear();
wxSize sz = this->GetClientSize();
wxPoint point = this->GetPosition();
dc.SetBrush(wxBrush(*wxBLACK, wxSOLID));
wxRect rectToDraw(0,0,sz.GetWidth(),sz.GetHeight());
dc.DrawRectangle(rectToDraw);
double scale = 1.0;
if(hi1.size() != 0 || hi2.size() != 0){
draw(hi1,hi2,scale,dc,sz.GetWidth(),sz.GetHeight());
}
if(bl->ave.size() != 0 && hi1.size() == 0 && hi2.size() == 0){
drawhistogram(dc,sz.GetWidth(),sz.GetHeight());
}
wxStaticBox::OnPaint(event);
}
void CStaticdraw::drawhistogram(wxDC &dc,int wid,int high)
{
double scalex = 1.0;double scaley = 1.0;
scalex = ((maxl[focus_index]-minl[focus_index])/maxl[focus_index])*wid/40;
int max = 0;int min = 0;
for(int i = 0;i<=39;i++){
if(max < numb[i])
max = numb[i];
}
for(int i = 0;i<=39;i++){
if(min > numb[i])
min = numb[i];
}
int j = 1;
for(int i = 39;i >= 0;i--){//开始画柱状图
dc.SetPen( *wxGREEN_PEN );
dc.SetBrush(wxBrush(*wxRED, wxSOLID));
int x = 0;
if(scalex >1)
x = wid - scalex*j;
else
x = wid - j;
int y = (numb[i]*(high/(max+max*0.1)));
if(scalex > 1)
dc.DrawRectangle(x,high-y,scalex+1,y);
else
dc.DrawRectangle(x,high-y,scalex+2,y);
j++;
}
wxColour colour;
colour.Set(0,255,0);
dc.SetTextForeground(colour);
string maxtext = boost::lexical_cast((int)max);
dc.DrawText(maxtext.c_str(),0,high*0.1);
maxtext = boost::lexical_cast((int)max/2);
dc.DrawText(maxtext.c_str(),0,high*0.6);
maxtext = boost::lexical_cast((int)min);
dc.DrawText(maxtext.c_str(),0,high*0.96);
maxtext = boost::lexical_cast((int)maxl[focus_index]);
dc.DrawText(maxtext.c_str(),wid*0.96,high*0.96);
maxtext = boost::lexical_cast((int)maxl[focus_index]/2);
dc.DrawText(maxtext.c_str(),wid*0.96/2,high*0.96);
}
void CStaticdraw::draw(history hi1,history hi2,double scale,wxDC &dc,int wid,int high)
{
maxmin mm;wxPoint pt,pt1;
double max = 0.0;double min = 0.0;double scale_t = 0.0;double scale_y = 0.0;
int size = 0;
mm = findmaxmin(hi1,hi2);
max = mm.max;min = mm.min;
/*
string tr = boost::lexical_cast(max);
wxMessageBox(tr.c_str());
tr = boost::lexical_cast(min);
wxMessageBox(tr.c_str());
tr = boost::lexical_cast(hi1.size());
wxMessageBox(tr.c_str());
*/
if(max > 0){
max = max + max*0.1;
if(scale_t >= 1){
scale_t = findscale_t(hi1,wid);//水平方向的比例系数
scale_y = findscale_y(hi1,high,max,min);//垂直方向的比例系数
for(int i = 0;i< hi1.size();i++){
pt.x = (int)((1/scale_t)*i);
pt.y = (int)((1/scale_y)*(hi1[i]-min));
pt.y = high - pt.y;
dc.SetPen( *wxRED_PEN );
dc.SetBrush(wxBrush(*wxRED, wxSOLID));
dc.DrawPoint(pt.x,pt.y);
}
scale_t = findscale_t(hi2,wid);//水平方向的比例系数
scale_y = findscale_y(hi2,high,max,min);//垂直方向的比例系数
for(int i = 0;i< hi2.size();i++){
pt.x = (int)((1/scale_t)*i);
pt.y = (int)((1/scale_y)*(hi2[i]-min));
pt.y = high - pt.y;
dc.SetPen( *wxGREEN_PEN );
dc.SetBrush(wxBrush(*wxGREEN, wxSOLID));
dc.DrawPoint(pt.x,pt.y);
}
wxColour colour;
colour.Set(255,255,0);
dc.SetTextForeground(colour);
string maxtext = boost::lexical_cast((int)max);
dc.DrawText(maxtext.c_str(),0,high*0.1);
maxtext = boost::lexical_cast((int)max/2);
dc.DrawText(maxtext.c_str(),0,high*0.6);
maxtext = boost::lexical_cast((int)min);
dc.DrawText(maxtext.c_str(),0,high*0.96);
}
else{
pt.x = 0;pt.y = 0;
scale_t = findscale_t(hi1,wid);//水平方向的比例系数
scale_y = findscale_y(hi1,high,max,min);//垂直方向的比例系数
for(int i = 0;i< hi1.size();i++){
pt1.x = (int)((1/scale_t)*i);
pt1.y = (int)((1/scale_y)*(hi1[i]-min));
pt1.y = high - pt1.y;
dc.SetPen( *wxRED_PEN );
dc.SetBrush(wxBrush(*wxRED, wxSOLID));
dc.DrawLine(pt.x,pt.y,pt1.x,pt1.y);
pt.x = pt1.x;pt.y = pt1.y;
}
pt.x = 0;pt.y = 0;
scale_t = findscale_t(hi2,wid);//水平方向的比例系数
scale_y = findscale_y(hi2,high,max,min);//垂直方向的比例系数
for(int i = 0;i< hi2.size();i++){
pt1.x = (int)((1/scale_t)*i);
pt1.y = (int)((1/scale_y)*(hi2[i]-min));
pt1.y = high - pt1.y;
dc.SetPen( *wxGREEN_PEN );
dc.SetBrush(wxBrush(*wxGREEN, wxSOLID));
dc.DrawLine(pt.x,pt.y,pt1.x,pt1.y);
pt.x = pt1.x;pt.y = pt1.y;
}
wxColour colour;
colour.Set(255,255,0);
dc.SetTextForeground(colour);
string maxtext = boost::lexical_cast((int)max);
dc.DrawText(maxtext.c_str(),0,high*0.1);
maxtext = boost::lexical_cast((int)max/2);
dc.DrawText(maxtext.c_str(),0,high*0.6);
maxtext = boost::lexical_cast((int)min);
dc.DrawText(maxtext.c_str(),0,high*0.96);
}
}
//show_noise_strength(dc,wid,high);
//wxPaintEvent event4;
//event4.SetEventObject(this);
// this->OnPaint(event4);
}
void CStaticdraw::show_noise_strength(wxDC &dc,int wid,int high)
{
if(hi1.size()!=0){
double ave,adev,sdev,var,skew,curt;
this->bl->rd.moment(hi1,hi1.size(),ave,adev,sdev,var,skew,curt);
double noise_strength = sdev*sdev/ave;
string maxtext = boost::lexical_cast(noise_strength);
int index = maxtext.find('.');
index = index+3;
maxtext = maxtext.substr(0,index);
wxColour colour;
colour.Set(255,0,0);
dc.SetTextForeground(colour);
dc.DrawText(maxtext.c_str(),0,high*0.01);
}
if(hi2.size() != 0){
double ave,adev,sdev,var,skew,curt;
this->bl->rd.moment(hi2,hi2.size(),ave,adev,sdev,var,skew,curt);
double noise_strength = sdev*sdev/ave;
string maxtext = boost::lexical_cast(noise_strength);
int index = maxtext.find('.');
index = index+3;
maxtext = maxtext.substr(0,index);
wxColour colour;
colour.Set(0,255,0);
dc.SetTextForeground(colour);
dc.DrawText(maxtext.c_str(),wid/2,high*0.01);
}
}
double CStaticdraw::findscale_y(history hi1,int high,double max,double min)
{
double scale_y = 1.0;
scale_y = (max-min)/(high);
return scale_y;
}
double CStaticdraw::findscale_t(history hi1,int wid)
{
long int size = hi1.size();
double scale_t = 1.0;
scale_t = (long double)size/(double)wid;
return scale_t;
}
maxmin CStaticdraw::findmaxmin(history hi1,history hi2)
{
maxmin mm;
if(hi1.size() != 0 && hi2.size() != 0){
history hi_temp = hi1;
sort(hi_temp.begin(),hi_temp.end(),greater());
history hi_temp1 = hi2;
sort(hi_temp1.begin(),hi_temp1.end(),greater());
if(hi_temp[0] >= hi_temp1[0]){
if(hi_temp1[hi_temp1.size()-1] < hi_temp[hi_temp.size()-1]){
mm.max = hi_temp[0];
mm.min = hi_temp1[hi_temp1.size()-1];
return mm;
}
else{
mm.max = hi_temp[0];
mm.min = hi_temp[hi_temp.size()-1];
return mm;
}
}
else{
if(hi_temp1[hi_temp1.size()-1] < hi_temp[hi_temp.size()-1]){
mm.max = hi_temp1[0];
mm.min = hi_temp1[hi_temp1.size()-1];
return mm;
}
else{
mm.max = hi_temp1[0];
mm.min = hi_temp[hi_temp.size()-1];
return mm;
}
}
}
if(hi1.size() == 0 && hi2.size() == 0){
//wxMessageBox("Error!");
maxmin mm;
mm.max = -0.1;
return mm;
}
if(hi1.size() == 0 || hi2.size() == 0){
if(hi1.size()!= 0){
history hi_temp = hi1;
sort(hi_temp.begin(),hi_temp.end(),greater());
maxmin mm;
mm.max = hi_temp[0];
mm.min = hi_temp[hi_temp.size()-1];
//wxMessageBox(boost::lexical_cast(mm.max).c_str());
//wxMessageBox(boost::lexical_cast(mm.min).c_str());
return mm;
}
else{
history hi_temp = hi2;
sort(hi_temp.begin(),hi_temp.end(),greater());
maxmin mm;
mm.max = hi_temp[0];
mm.min = hi_temp[hi_temp.size()-1];
return mm;
}
}
}