⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 romberdlg.cpp

📁 采用Romberg积分方法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		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 + -