求大神帮忙!!!!为什么画曲线总是画到横坐标63之后就没有了,用VC画的!!
自己在网上找了一个画图的类,个人感觉还不错,但是不知为何曲线画到大约63之后就画不动了,但是设计的数据不止这些啊!!!求大神帮忙,小弟在此先行谢过!!!!!!
代码
DispChart.cpp
VC 画曲线
这是二分法查找的代码
long CChart::FindDataInX(double x)
{
if( m_pvCurvesData.empty())
return -1;
long size = GetNumDataInCurve(0);
// 没有找到的情况
if( size == 0)
return -1;
if( x < GetDataAt(0,0))
return -1;
if( x > GetDataAt(0,size - 1))
return -1;
// 二分法查找
long start = 0 ; // 起始下标
long end = size - 1 ; //
long middle;
// 是两个端点
if( x == GetDataAt(0, 0))
return 0;
if( x == GetDataAt(0, size - 1))
return size - 1;
while(1)
{
middle = start + (end - start)/2;
double data = GetDataAt(0, middle);
if( x < data )
end = middle;
if( x > data )
start = middle;
if( start == end - 1)
return start;
}
}
这是我的真正的画图函数
void CChart::ShowCurves()
{
// 获得屏幕设备句柄
HDC hdc = GetDC( m_hWnd );
// 创建ChartWindow内存设备
m_memDCWindow = CreateCompatibleDC( hdc );
m_bmpInDCWindow= CreateCompatibleBitmap( hdc, GetChartWindowWidth(), GetChartWindowHeight() );
SelectObject( m_memDCWindow, m_bmpInDCWindow ) ;
// 创建一个与背景色相同的画刷
//HBRUSH hBrush = CreateSolidBrush(GetPixel(hdc, m_rtWindow.right/2 - 5,m_rtWindow.top + 5));
HBRUSH hBrush = CreateSolidBrush(GetClrChartBg());
HBRUSH hOldBrush = (HBRUSH)SelectObject(m_memDCWindow, hBrush); //SelectObject()将传回设备内容中上一次选择的画笔句柄;
// 保存原始值,设定新值
HDC dcOld = GetChartDC();
RECT rtOld = GetChartWindowPosition(); // 保存原始chart window位置值
RECT rtNew = { 0 , 0 , GetChartWindowWidth(), GetChartWindowHeight() };
SetChartDC( m_memDCWindow );
SetChartAndWindowPosition( rtNew ) ;
Rectangle( m_memDCWindow, -1, -1, GetChartWindowWidth() + 1, GetChartWindowHeight() + 1 );
Show();
SelectObject( m_memDCWindow, hOldBrush ) ;
DeleteObject( hBrush);
// 恢复原始chart window位置属性
SetChartDC( dcOld );
SetChartAndWindowPosition( rtOld ) ;
// 创建Chart内存设备
m_memDCChart = CreateCompatibleDC( hdc );
m_bmpInDCChart= CreateCompatibleBitmap( hdc, GetChartWidth(), GetChartHeight() );
SelectObject( m_memDCChart, m_bmpInDCChart ) ;
BitBlt( m_memDCChart, 0 , 0, GetChartWidth(), GetChartHeight() ,
m_memDCWindow, m_rtChart.left, m_rtChart.top ,SRCCOPY);
// 保存原始值,设定新值
dcOld = GetChartDC();
rtOld = GetChartPosition(); // 保存原始chart位置值
RECT rtNew2 = { 0 , 0 , GetChartWidth(), GetChartHeight() };
SetChartDC( m_memDCChart );
SetChartPosition( rtNew2 ) ;
// 获得曲线数
int numCurves = GetNumCurves( );
// 获得数据长度
int nDataLength = GetNumDataInCurve( 0 ); // 取最小的,不然会溢出,所以比较安全
for ( int i = 1; i<numCurves ; i++ )
{
int num = GetNumDataInCurve( i ) ;
if( nDataLength > num )
nDataLength = num ;
}
// m=0 是x轴数据,m=1,2,3...为第1,2,3..条曲线
for (int m = 1; m< numCurves ; m++)
{
if( GetCurveStatus( m ) && !m_pvCurvesData.at(m)->empty() ) // 判断是否需要显示
{
HPEN pen = CreatePen(PS_SOLID, GetCurveLineWidth( m ), GetCurveColor( m ) );
HPEN oldpen = (HPEN) SelectObject( m_memDCChart, pen ) ;
// int nDataLength = GetNumDataInCurve( m );
////////// 绘制曲线,0 -- 1 1 -- 2 n-1 -- n/
int i =0 ;
int indexEnd = nDataLength - 1;
double x0 = GetDataAt( 0, 0 ) ;
double xn = GetDataAt( 0, indexEnd ) ;
if( x0 < m_xStart && xn > m_xStart)
{
i = FindDataInX( m_xStart );
indexEnd = indexEnd ;//????????????????????????????
}
else if( xn > m_xEnd && x0 < m_xEnd )
{
i = 0;
indexEnd = FindDataInX( m_xEnd );
}else if ( m_xStart > xn || m_xEnd < x0)
{
i = 0 ;
indexEnd =0 ;
}
for(i=0; i < indexEnd - 1; i+=1 )
{
if( GetDataAt( 0, i) >= GetXStart() &&
GetDataAt( 0, i) <= GetXEnd() ) // 限定x轴范围
{
int sx = rx2sx( GetDataAt( 0, i ) ) ;
int sy = ry2sy( GetDataAt( m, i ) ) ;
int sxdx = rx2sx( GetDataAt( 0, i + 1 ) ) ;
int sydy = ry2sy( GetDataAt( m, i + 1 ) ) ;
MoveToEx( m_memDCChart, sx, sy, NULL );
LineTo ( m_memDCChart, sxdx, sydy );
}
}
SelectObject( m_memDCWindow, oldpen ) ;
DeleteObject( pen ) ;
}
}
// 恢复原始chart 位置属性
SetChartDC( dcOld );
SetChartPosition( rtOld ) ;
BitBlt( m_memDCWindow,m_rtChart.left, m_rtChart.top, GetChartWidth(), GetChartHeight(),
m_memDCChart, 0, 0, SRCCOPY);
// 将内存设备中显示的内容显示在窗口中
BitBlt( hdc, m_rtWindow.left, m_rtWindow.top,
GetChartWindowWidth(), GetChartWindowHeight() ,
m_memDCWindow, 0 ,0 ,SRCCOPY );
// 释放资源
DeleteObject( m_bmpInDCChart ) ;
DeleteDC( m_memDCChart ) ;
DeleteObject( m_bmpInDCWindow ) ;
DeleteDC( m_memDCWindow ) ;
ReleaseDC( m_hWnd, hdc ) ;
}
这是我在WINAPI中试验的代码
case WM_CREATE:
{ chart.SetYRange(-10,10);
chart.SetGriddy(2);
chart.SetGriddx(1);
int length = 1000;
double amp = 5;
for(int i=0;i<length;i++)
{
double t = (20 * 3.1415926 / length) * i;
double y1 = amp*sin(t);
double y2 = (amp/2)*cos(t);
data[0].push_back(t);
data[1].push_back(y1);
data[2].push_back(y2);
}
chart.AddMCurves(data,3);
chart.SetCurveColor(0,RGB(0,0,0));
}
chart.SetXLabel(ptr);
[解决办法]
double t = (20 * 3.1415926 / length) * i;这的问题!不是控件的问题