📄 romberdlg.cpp
字号:
{
MessageBox( " 函数为空!\n 返回 ","Error!",MB_OK);
m_strFunction = strFunction;
m_fLowerLimit = fLowerLimit;
m_fUpperLimit =fUpperLimit ;
m_fRange_X = fRange_X;
m_fRange_Y = fRange_Y;
m_nScaleNum_X = nScaleNum_X;
m_nScaleNum_Y = nScaleNum_Y;
m_dRombergError = dRombergError;
// m_dRombergValue = dRombergValue;
m_bFillRect = bFillRect;
UpdateData( FALSE );
return;
}
//2坐标检查
if ( m_fRange_X<=0||m_fRange_Y<=0 )
{
MessageBox( " 坐标值不可小于0!\n 返回 ","Error!",MB_OK);
m_strFunction = strFunction;
m_fLowerLimit = fLowerLimit;
m_fUpperLimit =fUpperLimit ;
m_fRange_X = fRange_X;
m_fRange_Y = fRange_Y;
m_nScaleNum_X = nScaleNum_X;
m_nScaleNum_Y = nScaleNum_Y;
m_dRombergError = dRombergError;
// m_dRombergValue = dRombergValue;
m_bFillRect = bFillRect;
UpdateData( FALSE );
return;
}
if ( m_nScaleNum_X<=1||m_nScaleNum_Y<=1 )
{
MessageBox( " 标尺数至少为2!\n 返回 ","Error!",MB_OK);
m_strFunction = strFunction;
m_fLowerLimit = fLowerLimit;
m_fUpperLimit =fUpperLimit ;
m_fRange_X = fRange_X;
m_fRange_Y = fRange_Y;
m_nScaleNum_X = nScaleNum_X;
m_nScaleNum_Y = nScaleNum_Y;
m_dRombergError = dRombergError;
// m_dRombergValue = dRombergValue;
m_bFillRect = bFillRect;
UpdateData( FALSE );
return;
}
//积分区间检查
if ( m_fLowerLimit>m_fRange_X||m_fLowerLimit<(m_fRange_X*(-1)) )
{
MessageBox( " 积分下限越界!\n 返回 ","Error!",MB_OK);
m_strFunction = strFunction;
m_fLowerLimit = fLowerLimit;
m_fUpperLimit =fUpperLimit ;
m_fRange_X = fRange_X;
m_fRange_Y = fRange_Y;
m_nScaleNum_X = nScaleNum_X;
m_nScaleNum_Y = nScaleNum_Y;
m_dRombergError = dRombergError;
// m_dRombergValue = dRombergValue;
m_bFillRect = bFillRect;
UpdateData( FALSE );
return;
}
if ( m_fUpperLimit>m_fRange_X||m_fUpperLimit<(m_fRange_X*(-1)) )
{
MessageBox( " 积分上限越界!\n 返回 ","Error!",MB_OK);
m_strFunction = strFunction;
m_fLowerLimit = fLowerLimit;
m_fUpperLimit =fUpperLimit ;
m_fRange_X = fRange_X;
m_fRange_Y = fRange_Y;
m_nScaleNum_X = nScaleNum_X;
m_nScaleNum_Y = nScaleNum_Y;
m_dRombergError = dRombergError;
// m_dRombergValue = dRombergValue;
m_bFillRect = bFillRect;
UpdateData( FALSE );
return;
}
Romberg( m_dRombergError,m_fUpperLimit,m_fLowerLimit, m_dRombergValue);
CString str;
str.Format("%.15lf",m_dRombergValue);
CEdit *pDual=(CEdit *)GetDlgItem(IDC_EDIT_RombergValue);
pDual->SetWindowText(str);
//绘图
CRect rect;
//获取绘制坐标的文本框
CWnd* pWnd = GetDlgItem(IDC_COORD);
pWnd->GetClientRect(&rect);
// 指针
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->Rectangle(&rect);
//内存绘图
CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
DrawWave(&memDC);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();
}
void CRomberDlg::DrawWave(CDC *pDC)
{
CRect rect;
CString str;
int i;
int m_left,m_top,m_right,m_bottom;
CSize origin;
// 获取绘制坐标的文本框
CWnd* pWnd = GetDlgItem(IDC_COORD);
pWnd->GetClientRect(&rect);
pDC->Rectangle(&rect);
// 创建画笔对象
CPen* pPenRed = new CPen;
// 红色画笔
pPenRed->CreatePen(PS_SOLID,0,RGB(255,0,0));
// 创建画笔对象
CPen* pPenBlue = new CPen;
// 蓝色画笔
pPenBlue->CreatePen(PS_SOLID,0,RGB(0,0, 255));
// 创建画笔对象
CPen* pPenGreen = new CPen;
// 绿色画笔
pPenGreen->CreatePen(PS_SOLID,0,RGB(0,255,0));
// 选中当前红色画笔,并保存以前的画笔
CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
m_left = rect.left+10;
m_top = rect.top+10;
m_right = rect.right-10;
m_bottom = rect.bottom-10;
origin.cx = m_left +( m_right - m_left)/2;
origin.cy = m_top + ( m_bottom - m_top)/2;
double multiple_x = (m_right-m_left)/(m_fRange_X*2);
double multiple_y = (m_bottom-m_top)/(m_fRange_Y*2);
float scale_range_X = m_fRange_X/m_nScaleNum_X;
float scale_range_Y = m_fRange_Y/m_nScaleNum_Y;
//画边框
pDC->MoveTo( m_left,m_top );
pDC->LineTo( m_left,m_bottom );
pDC->LineTo( m_right,m_bottom );
pDC->LineTo( m_right,m_top );
pDC->LineTo( m_left,m_top );
//画x和Y坐标线
pDC->SelectObject( pPenBlue );
pDC->MoveTo( m_left,origin.cy);
pDC->LineTo( m_right,origin.cy);
pDC->MoveTo( origin.cx,m_top);
pDC->LineTo( origin.cx,m_bottom);
pDC->SetTextAlign(TA_CENTER);
pDC->SelectObject(&FontScale);
//原点
pDC->TextOut( origin.cx,origin.cy,"0");
//x轴
float temp;
for ( i=1;i<=m_nScaleNum_X;i++ )
{
//X+
pDC->MoveTo( origin.cx+i*scale_range_X*multiple_x, origin.cy );
pDC->LineTo( origin.cx+i*scale_range_X*multiple_x, origin.cy-5 );
//X-
pDC->MoveTo(origin.cx-i*scale_range_X*multiple_x,origin.cy);
pDC->LineTo(origin.cx-i*scale_range_X*multiple_x,origin.cy-5);
//
temp = i*scale_range_X;
if ( temp == int(temp) )
{
str.Format( "%d",int(i*scale_range_X) );
pDC->TextOut( origin.cx+i*scale_range_X*multiple_x,origin.cy,str);
str.Format( "-%d",int(i*scale_range_X) );
pDC->TextOut( origin.cx-i*scale_range_X*multiple_x,origin.cy,str);
}
else
{
str.Format( "%.1f",i*scale_range_X );
pDC->TextOut( origin.cx+i*scale_range_X*multiple_x,origin.cy,str);
str.Format( "-%.1f",i*scale_range_X );
pDC->TextOut( origin.cx-i*scale_range_X*multiple_x,origin.cy,str);
}
}
//y轴
pDC->SetTextAlign(TA_RIGHT|TA_TOP);
for ( i=1;i<=m_nScaleNum_Y;i++ )
{
//Y+
pDC->MoveTo( origin.cx,origin.cy-i*scale_range_Y*multiple_y );
pDC->LineTo( origin.cx+5,origin.cy-i*scale_range_Y*multiple_y );
//Y-
pDC->MoveTo( origin.cx , origin.cy+i*scale_range_Y*multiple_y );
pDC->LineTo( origin.cx+5, origin.cy+i*scale_range_Y*multiple_y );
//
temp = i*scale_range_Y;
if ( temp == int(temp) )
{
//Y+
str.Format( "%d",int(i*scale_range_Y) );
pDC->TextOut( origin.cx,origin.cy-i*scale_range_Y*multiple_y,str );
//Y-
str.Format( "-%d",int(i*scale_range_Y) );
pDC->TextOut( origin.cx,origin.cy+i*scale_range_Y*multiple_y,str );
}
else
{
str.Format( "%.1f",i*scale_range_Y );
pDC->TextOut( origin.cx,origin.cy-i*scale_range_Y*multiple_y,str );
str.Format( "-%.1f",i*scale_range_Y );
pDC->TextOut( origin.cx,origin.cy+i*scale_range_Y*multiple_y,str );
}
}
//画函数图像
float x_start,x_end; //X坐标的起始点和终止点
x_start = m_fLowerLimit;
x_end = m_fUpperLimit;
//计算每个象素点所代表的数值大小
double x_PerDot = 1.0/multiple_x;
double y_PerDot = 1.0/multiple_y;
//画函数图像
BOOL bFlag = TRUE ;
double x_value;
double y_value;
for (i=0 ;bFlag == TRUE;i++ )
{
x_value = x_start+i*x_PerDot;
y_value = fun(x_value);
if ( x_value>x_end )
{
bFlag = FALSE;
}
else
{
pDC->SetPixel(origin.cx+x_value*multiple_x,origin.cy-y_value*multiple_y,RGB(255,0,0));
}
}
/*
//连接函数头尾两点
double x_value_start;
double y_value_start;
double x_value_end;
double y_value_end;
x_value_start = x_start;
y_value_start = fun( x_value_start );
x_value_end = x_end;
y_value_end = fun( x_value_end );
*/
if ( m_bFillRect == TRUE )
{
//进行面积的绘制
bFlag = TRUE ;
for (i=0 ;bFlag == TRUE;i++ )
{
x_value = x_start+i*x_PerDot;
y_value = fun( x_value );
if ( x_value>x_end)
{
bFlag = FALSE;
}
else
{
pDC->MoveTo( origin.cx+x_value*multiple_x,origin.cy);
pDC->LineTo( origin.cx+x_value*multiple_x,origin.cy-y_value*multiple_y);
}
}
}
pDC->SelectObject(pOldPen);
delete pPenRed;
delete pPenBlue;
delete pPenGreen;
return;
}
void CRomberDlg::OnDefaultSet()
{
// TODO: Add your control notification handler code here
m_strFunction.Format( " sin(x)/x ");
m_fLowerLimit = 1;
m_fUpperLimit = 5.0;
m_dRombergError = 0.5e-7;
m_dRombergValue = 0;
Romberg( m_dRombergError,m_fUpperLimit,m_fLowerLimit, m_dRombergValue);
m_fRange_X = 10.0;
m_nScaleNum_X = 5;
m_fRange_Y = 10.0;
m_nScaleNum_Y = 5;
m_bFillRect = TRUE;
UpdateData( FALSE );
OnDrawmap();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -