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

📄 mypaintviewbak1.cpp

📁 用Visual C++实现的绘制函数图像的程序。给定任意函数表达式
💻 CPP
字号:
// MyPaintView.cpp : implementation of the CMyPaintView class
//

#include "stdafx.h"
#include "MyPaint.h"
#include "math.h"
#include "MyPaintDoc.h"
#include "MyPaintView.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define PI 3.1415926
/////////////////////////////////////////////////////////////////////////////
// CMyPaintView
CMyPaintView* dcpoint=0;  //定义全局视类指针变量dcpoint

IMPLEMENT_DYNCREATE(CMyPaintView, CView)

BEGIN_MESSAGE_MAP(CMyPaintView, CView)
	//{{AFX_MSG_MAP(CMyPaintView)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyPaintView construction/destruction

CMyPaintView::CMyPaintView()
{
	extern CMainFrame* mainwnd;
	// TODO: add construction code here
	paint.Create(IDD_DIALOG1,mainwnd);


}

CMyPaintView::~CMyPaintView()
{
}

BOOL CMyPaintView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyPaintView drawing

void CMyPaintView::OnDraw(CDC* pDC)
{
	CMyPaintDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    

	
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMyPaintView printing

BOOL CMyPaintView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyPaintView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}



/////////////////////////////////////////////////////////////////////////////
// CMyPaintView diagnostics

#ifdef _DEBUG
void CMyPaintView::AssertValid() const
{
	CView::AssertValid();
}

void CMyPaintView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyPaintDoc* CMyPaintView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyPaintDoc)));
	return (CMyPaintDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
double powerchge(char part[],double x)
	{
		char data[50][32],operat[50];
		int j,m,swich=0,n;
		short a[50],aa=0,open=0;
		for(j=0;j<50;a[j++]=1);
		for(j=0,m=0,n=0;part[j]!='\0';j++,m++)//把part里每个数的正负性保存下来
		{
			if(part[j]=='-') 
			{
				a[aa]=-a[aa];
				open=0;
			}
			else 
			{
				if(open==0) aa++;
				open=1;
			}
		}		
		for(j=0,m=0,n=0;part[j]!='\0';j++,m++)
		{
			if((part[j]<48||part[j]>57)&&part[j]!='x'&&part[j]!='.')
			{
				if(swich==1) 
				{
					if(part[j]=='-')//如果运算符是-的话就变+,因为上面a[]已经存放了每个数的正负性,所以大胆地变,以方便下面的+运算						part[j]='+';
					operat[n]=part[j];
					n++;
					swich=0;
				}
				m=-1;
			}
			else
			{				
				data[n][m]=part[j];
				swich=1;
			}
		}//--------------------------------把一维数组PART分离成数字字符数组DATA,和运算符字符数组OPERAT;并把字符X取代为X的数值;
		CString datanum[50];
		double num[50];
		for(int i=0;i<n+1;i++)
		{
			if(data[i][0]=='x') num[i]=a[i]*x;//把数字与它前面的符号相乘
			else
			{		
				datanum[i]=data[i];
				num[i]=a[i]*atof(datanum[i]);//把数字与它前面的符号相乘
			}		
		}		//-------------------------------把DATA转化成double型数组num,使用中间数组datanum
		for(i=0;i<n;i++)
		{
			if(operat[i]=='*')			
				num[i+1]=num[i]*num[i+1];		
			else
			{
				if(operat[i]=='/')
					num[i+1]=num[i]/num[i+1];					
			}
		}
		for(i=0;i<n;i++)
		{
			if(operat[i]=='+')
			{
				for(j=i+1;operat[j]!='+'&&operat[j]!='-'&&j!=n;j++);
				num[j]=num[i]+num[j];
	       	}
			
		}	//由于part里已经没有‘-’号运算符,所以只算+法就行了		
		return num[n];
	
}

			
////////////////////////////////////////////////////////////////////////
double superchge(char expres[100],double xl)
{
	char expresbak[100],part[100],partsumch[32];	
	CString partsumcs;
	short length=0;
	for(int k=0;k<100;expresbak[k++]='\0');
	strcpy(expresbak,expres);  //把expres备分到expresbak[]里
	for(k=0;k<100;expres[k++]='\0',part[k++]='\0'); //初始化数组
	for(k=0;k<32;partsumch[k++]='\0');
	strcpy(expres,expresbak);//用expresbak还原expres
	for(int i=0,j=0;expres[i]!='\0';i++)
	{    
		if(expres[i]==')')
		{
			for(j=i-1;j>=0;j--) 
			{												
				if(expres[j]=='(')	
				{								
					for(int m=0,n=j+1;n<i;part[m++]=expres[n++]);//构建最底层的( )内的PART--------				
					//-----------------------判断'('左边是不是有函数符号,并进行相应的处理                  
					if(expres[j-1]<97||expres[j-1]>122)//----------------------------------如果没有函数字符时的处理
					{
						partsumcs.Format("%f",powerchge(part,xl));
						length=0;
					}
					else
					{
					if (expres[j-2]=='l'&&expres[j-1]=='n')  //-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						if(log(powerchge(part,xl))!=-1)
							partsumcs.Format("%f",log(powerchge(part,xl)));						
						else						
							partsumcs.Format("%f",0.0);					
						length=2;					
					}
					
					if (expres[j-3]=='c'&&expres[j-2]=='o'&&expres[j-1]=='s')//-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						partsumcs.Format("%f",cos(powerchge(part,xl)));
						length=3;
					}

                    if (expres[j-3]=='s'&&expres[j-2]=='i'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理								{
					{
						partsumcs.Format("%f",sin(powerchge(part,xl)));
						length=3;
					}

                    if (expres[j-3]=='t'&&expres[j-2]=='a'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						partsumcs.Format("%f",tan(powerchge(part,xl)));
						length=3;
					}

					if (expres[j-3]=='c'&&expres[j-2]=='t'&&expres[j-1]=='g')//-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						partsumcs.Format("%f",1/tan(powerchge(part,xl)));
						length=3;
					}

                    if (expres[j-4]=='f'&&expres[j-3]=='a'&&expres[j-2]=='b'&&expres[j-1]=='s')//-------------判断'('左边是不是有函数符号,并进行相应的处理							{
					{
						partsumcs.Format("%f",fabs(powerchge(part,xl)));
						length=4;
					}

                    if (expres[j-4]=='a'&&expres[j-3]=='s'&&expres[j-2]=='i'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						if(asin(powerchge(part,xl))!=-1)
							partsumcs.Format("%f",asin(powerchge(part,xl)));						
						else
							partsumcs.Format("%f",0.0);
						length=4;
					}

                    if (expres[j-4]=='a'&&expres[j-3]=='c'&&expres[j-2]=='o'&&expres[j-1]=='s')//-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						if(acos(powerchge(part,xl))!=-1)
							partsumcs.Format("%f",acos(powerchge(part,xl)));						
						else
							partsumcs.Format("%f",0.0);
						length=4;
					}

                    if (expres[j-4]=='a'&&expres[j-3]=='t'&&expres[j-2]=='a'&&expres[j-1]=='n')//-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						partsumcs.Format("%f",atan(powerchge(part,xl)));
						length=4;
					}

                    if (expres[j-4]=='a'&&expres[j-3]=='c'&&expres[j-2]=='t'&&expres[j-1]=='g')//-------------判断'('左边是不是有函数符号,并进行相应的处理
					{
						partsumcs.Format("%f",PI/2-atan(powerchge(part,xl)));
						length=4;
					}
					}
					//-------------------------------------------把所得的CString类型的partsumcs复制给char类型的数组partsumch
					strncpy(partsumch,(LPCTSTR)partsumcs,32);
					//-----------------------------                       
					/////////////////////////////////-----------------关键!重新构造expres数组																
					for(int rb1=j-length,k=0;partsumch[k]!='\0';expres[rb1++]=partsumch[k++]);//构造新的expres数组的前半部分
					for(int rb2=i+1;expresbak[rb2]!='\0';expres[rb1++]=expresbak[rb2++]);//构造新的expres数组的后半部分
					strcpy(expresbak,expres);					
					i=j-length+k-1;
					for(k=0;k<100;part[k]='\0',k++); //part数组重新清0
					break;							
				}					
			}
		}
	}
	return powerchge(expres,xl);
}

		

//================================================================/////////////////////////////////////////
// CMyPaintView message handlers
void CMyPaintView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting    
	dcpoint=this;
	int x=GetSystemMetrics(SM_CXSCREEN)/2,
		y=GetSystemMetrics(SM_CYSCREEN)/2,
		style=0,xc;
	double xl,yl;
    char expres[100];//把CString变量COPY到expres[]里	
	CString num[]={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};    
	dc.MoveTo(x,0);
	dc.LineTo(x,y*2);
	dc.MoveTo(0,y);
	dc.LineTo(x*2,y);
	dc.TextOut(x+5,y+1,'0');
	for(int i=0;i<15;i++)
	{
		dc.TextOut(x+35,y+1,num[i]);       //画X+轴坐标上的数字
		dc.TextOut(x-525,y+1,num[14-i]);     //画X-轴坐标上的数字
		dc.TextOut(x-530,y+1,'-');       //画X-轴坐标上的‘-’号
		dc.MoveTo(x-525,y-5);       //画X-轴坐标上的分隔线,长度为5
		dc.LineTo(x-525,y);
		dc.MoveTo(x+35,y-5);       //画X+轴坐标上的分隔线,长度为5
		dc.LineTo(x+35,y);
	   	x+=35;
	}

	x=GetSystemMetrics(SM_CXSCREEN)/2;
	y=GetSystemMetrics(SM_CYSCREEN)/2;
	for(i=0;i<15;i++)
	{
		dc.TextOut(x+10,y-525,num[14-i]);
		dc.TextOut(x-10,y+35,num[i]);
		dc.TextOut(x-15,y+35,'-');
	    dc.MoveTo(x+5,y-525);
		dc.LineTo(x,y-525);
		dc.MoveTo(x+5,y+35);
		dc.LineTo(x,y+35);
		y+=35;
	}
    
	CPen pen;
	pen.CreatePen(0,paint.m_line,paint.color);
	dc.SelectObject(&pen);
	style=paint.m_pattern.GetCurSel();
	x=GetSystemMetrics(SM_CXSCREEN)/2;
	y=GetSystemMetrics(SM_CYSCREEN)/2;
	if(style==0)
	{
	    for(xc=-x,xl=-x-100,yl=0;xc<x;xc++)
		{
			strncpy(expres,(LPCTSTR)paint.m_expres,100);
			strcat(expres,"+0");//奇怪,不加会有大错,加了也还是有点小错,费解~~
			dc.MoveTo((int)(xl+x),(int)(yl+y));
	    	xl=(xc+1)/35.0;		    
			//dc.TextOut(20,20,expres);
			yl=-1*((           superchge(expres,xl)          )*35.0);//函数表达式
			//检查用
			//CString aa=""; 
			//aa.Format("%f",asin(2));
			//dc.TextOut(20,20,aa);
			xl=xc+1.0;
			dc.LineTo((int)(xl+x),(int)(yl+y));
		}
	}
	else//进行点线计算,基本同上,免看
	{
      for(xc=-x;xc<x;xc+=3)
	  {
		  strncpy(expres,(LPCTSTR)paint.m_expres,100); 
		  xl=(xc+1)/35.0;	
		  yl=-1*((          superchge(expres,xl)                 )*35.0);//函数表达式
		  xl=xc+1.0;
		  dc.SetPixel((int)(xl+x),(int)(yl+y),paint.color);
		  //dc.MoveTo((int)(xl+x-2),yl+y-2);
		  //dc.LineTo((int)(xl+x),yl+y);
	  }
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -