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; 
		} 
	} 
}