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

📄 paintbak.cpp

📁 用Visual C++实现的绘制函数图像的程序。给定任意函数表达式
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			if(flag_modify==0)
				line_count++;
		}
	}
END:
	if(m_a>=m_b)
		MessageBox("下限必须小于上限!","错误",MB_OK);
	else		
	if(line_count>9)
		MessageBox("图像已满,请先清空再画","错误",MB_OK);
	else
	if(error==1)
	{
		MessageBox("请输入完整的表达式","错误",MB_OK);
	}
	else
	if(error==2)
	{
		MessageBox("函数名不合法","错误",MB_OK);
	}
	else
	if(error==3)
	{
		MessageBox("运算符格式错误","错误",MB_OK);
	}
	else
	if(error==4)
	{
		MessageBox("表达式语法错误","错误",MB_OK);		
	}
	else
	if(error==5)
	{
		MessageBox("表达式内有非法字符","错误",MB_OK);
	}
	else
	if(error==6)
	{
		MessageBox("系统内存不足,绘图失败!","错误",MB_OK);
	}
	if(notice==1)
	{
		mainwnd->m_wndStatusBar.SetPaneText(0,"函数在某区间无定义或运算数据过大,图像经过了忽略处理",TRUE);
	}
	else	
	{
		mainwnd->m_wndStatusBar.SetPaneText(0,"绘图完成,一切正常!",TRUE);
	}
}


void CPaint::OnPaintHide() 
{
	// TODO: Add your control notification handler code here
	ShowWindow(SW_HIDE);
}

void CPaint::OnExit()
{
	// TODO: Add your control notification handler code here
	extern CMainFrame *mainwnd;
	mainwnd->OnClose();
}


void CPaint::OnChangeExpres() 
{
	UpdateData();
	flag=1;//表示一般方程的输入框在使用中
	OnPaint();
}
void CPaint::OnChangeXExpres() 
{
	UpdateData();
	flag=2;//表示参数方程x的输入框在使用中
	OnPaint();
}
void CPaint::OnChangeYExpres() 
{
	UpdateData();
	flag=3;//表示参数方程y的输入框在使用中
	OnPaint();
}
void CPaint::OnChangeExpres2() 
{
	UpdateData();
	flag=4;//表示极坐标方程的输入框在使用中
	OnPaint();
}

void CPaint::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	// 调用父类处理函数完成基本操作	
	CDialog::OnLButtonDown(nFlags, point);  
	if(point.x>78&&point.x<135&&point.y>126&&point.y<139)
	{
		CColorDialog choose(color,0,this);
		if(choose.DoModal()==IDOK)
		{		
			color=choose.GetColor();
			CPaint::OnPaint();
		}
	}
	else
		PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y)); 
	CDialog::OnLButtonDown(nFlags, point);
}


void CPaint::OnButton2() 
{
	// TODO: Add your control notification handler code here
	extern CMyPaintView* dcpoint;
	MY_LINE *del_line,*p_line;
	del_line=p_line=head;
	while(p_line!=NULL)
	{
		del_line=p_line;
		p_line=p_line->next;
		delete del_line;
	}
	head=NULL;
	line_count=0;
	dcpoint->OnUpdate(NULL,NULL,NULL);
}

void CPaint::OnSelchangeTab() //NMHDR* pNMHDR, LRESULT* pResult
{
	CWnd  *m_x=GetDlgItem(IDC_X_ST),
		  *m_y=GetDlgItem(IDC_Y_ST),
		  *m_f=GetDlgItem(IDC_F_ST),
		  *m_p=GetDlgItem(IDC_P_ST),
		  *m_xexpres=GetDlgItem(IDC_X_EXPRES),
		  *m_yexpres=GetDlgItem(IDC_Y_EXPRES),
		  *m_pexpres=GetDlgItem(IDC_EXPRES2),
		  *m_nexpres=GetDlgItem(IDC_EXPRES),
		  *m_paintok=GetDlgItem(ID_PAINT_OK),		  
		  *m_modify=GetDlgItem(ID_MODIFY);///////////
	if(flag_modify)
	{
		m_modify->ShowWindow(SW_SHOW);
		m_modify->EnableWindow(TRUE);
		m_paintok->ShowWindow(SW_HIDE);
		m_paintok->EnableWindow(FALSE);
	}
	else
	{
		m_paintok->ShowWindow(SW_SHOW);
		m_paintok->EnableWindow(TRUE);
		m_modify->ShowWindow(SW_HIDE);
		m_modify->EnableWindow(FALSE);
	}
	if(m_choices.GetCurSel()==0)
	{
			m_x->ShowWindow(SW_HIDE);
			m_y->ShowWindow(SW_HIDE);
			m_f->ShowWindow(SW_SHOW);
			m_p->ShowWindow(SW_HIDE);
			m_xexpres->ShowWindow(SW_HIDE);
			m_yexpres->ShowWindow(SW_HIDE);
			m_nexpres->ShowWindow(SW_SHOW);
			m_pexpres->ShowWindow(SW_HIDE);			
	}
	else
	if(m_choices.GetCurSel()==1)
	{
			m_x->ShowWindow(SW_SHOW);
			m_y->ShowWindow(SW_SHOW);
			m_f->ShowWindow(SW_HIDE);
			m_p->ShowWindow(SW_HIDE);
			m_xexpres->ShowWindow(SW_SHOW);
			m_yexpres->ShowWindow(SW_SHOW);
			m_nexpres->ShowWindow(SW_HIDE);
			m_pexpres->ShowWindow(SW_HIDE);
	}
	else
	if(m_choices.GetCurSel()==2)
	{
			m_x->ShowWindow(SW_HIDE);
			m_y->ShowWindow(SW_HIDE);
			m_f->ShowWindow(SW_HIDE);
			m_p->ShowWindow(SW_SHOW);
			m_xexpres->ShowWindow(SW_HIDE);
			m_yexpres->ShowWindow(SW_HIDE);
			m_nexpres->ShowWindow(SW_HIDE);
			m_pexpres->ShowWindow(SW_SHOW);
	}
//	*pResult = 0;
}
void CPaint::OnPaintOk2() 
{
	double xc,yc;
	double t;
	unsigned short n=0;
	for(t=m_a;t<=m_b;t+=0.05)
	{		  
		strncpy(expres,(LPCTSTR)m_yexpres,M);
		yc=-superchge(expres,t,'t');
		if(error!=0)
		{
			BYTE reset=line_count;
			p2=head;
			while(reset>1)
			{
				p2=p2->next;
				reset--;
			}
			if(line_count==0)
				p2=head=NULL;
			else
				p2->next=NULL;
			if(flag_modify==0)
				delete(p1);					
			break;
		}
		strncpy(expres,(LPCTSTR)m_xexpres,M);
		xc=superchge(expres,t,'t');
		if(error!=0)
		{
			BYTE reset=line_count;
			p2=head;
			while(reset>1)
			{
				p2=p2->next;
				reset--;
			}
			if(line_count==0)
				p2=head=NULL;
			else
				p2->next=NULL;
			if(flag_modify==0)
				delete(p1);					
			break;
		}
		if(outrange==1)
		{
			outrange=0;
			notice=1;
			continue;
		}

		if(fabs(yc-(short)yc)>=0.5)//对舍入误差的处理,使图像平滑
		{
			if(yc>0)
				yc=(short)yc+1;
			else
				yc=(short)yc-1;
		}
		else
			yc=(short)yc;
		if(fabs(xc-(short)xc)>=0.5)//对舍入误差的处理,使图像平滑
		{
			if(xc>0)
    			xc=(short)xc+1;
            else
    			xc=(short)xc-1;
		}
		else
			xc=(short)xc;	
		if(flag_modify==1)
			while(select_line!=0)
			{
				temp=temp->next;
				select_line--;
			}
		else				
			temp=p1;			
		temp->point[n].x=(int)xc;
		temp->point[n].y=(int)yc;
		temp->point[n].z=0;
		if(n>1)///////////////去处多余的点
		{
			CMpoint k1,k2;
			k1.x=temp->point[n].x-temp->point[n-1].x;
			k1.y=temp->point[n].y-temp->point[n-1].y;
			k1.z=temp->point[n].z-temp->point[n-1].z;
			k2.x=temp->point[n-1].x-temp->point[n-2].x;
			k2.y=temp->point[n-1].y-temp->point[n-2].y;
			k2.z=temp->point[n-1].z-temp->point[n-2].z;
			if(fabs((k1.x*k2.x+k1.y*k2.y+k1.z*k2.z)/sqrt( (k1.x*k1.x+k1.y*k1.y+k1.z*k1.z)*(k2.x*k2.x+k2.y*k2.y+k2.z*k2.z) )-1.0)<1e-6)
			{
				temp->point[n-1].x=temp->point[n].x;
				temp->point[n-1].y=temp->point[n].y;
				temp->point[n-1].z=0;
				n=n-1;
				n++;
			}
			else
				n++;
		}
		else
			n++;
	}
	if(error==0)
	{
		temp->n=n;
		temp->tag=1;
		temp->real_expres[0]=m_xexpres;
		temp->real_expres[1]=m_yexpres;
    	temp->expres.Format("%s%s , %s%s   定义域  【%.2f,%.2f】",".X(t)=",m_xexpres,"Y(t)=",m_yexpres,m_a,m_b);
	}
}
void CPaint::OnPaintOk3() 
{
	double xc,yc;
	double angle;
	unsigned short n=0;
	for(angle=m_a;angle<=m_b;angle+=0.05)
	{
		strncpy(expres,(LPCTSTR)m_pexpres,M);
		yc=superchge(expres,angle,'r');
		xc=cos(angle)*yc;
		yc=-sin(angle)*yc;		
		if(error!=0)
		{
			BYTE reset=line_count;
			p2=head;
			while(reset>1)
			{
				p2=p2->next;
				reset--;
			}
			if(line_count==0)
				p2=head=NULL;
			else
				p2->next=NULL;
			if(flag_modify==0)
				delete(p1);					
			break;
		}
		if(outrange==1)
		{
			outrange=0;
			notice=1;
			continue;
		}
		if(fabs(yc-(short)yc)>=0.5)//对舍入误差的处理,使图像平滑
		{
			if(yc>0)
				yc=(short)yc+1;
			else
				yc=(short)yc-1;
		}
		else
			yc=(short)yc;
		if(fabs(xc-(short)xc)>=0.5)//对舍入误差的处理,使图像平滑
		{
			if(xc>0)
    			xc=(short)xc+1;
			else
    			xc=(short)xc-1;
		}
		else
			xc=(short)xc;
		if(flag_modify==1)
			while(select_line!=0)
			{
				temp=temp->next;
				select_line--;
			}
		else				
			temp=p1;			
		temp->point[n].x=(int)xc;
		temp->point[n].y=(int)yc;
		temp->point[n].z=0;
		if(n>1)///////////////去处多余的点
		{
			CMpoint k1,k2;
			k1.x=temp->point[n].x-temp->point[n-1].x;
			k1.y=temp->point[n].y-temp->point[n-1].y;
			k1.z=temp->point[n].z-temp->point[n-1].z;
			k2.x=temp->point[n-1].x-temp->point[n-2].x;
			k2.y=temp->point[n-1].y-temp->point[n-2].y;
			k2.z=temp->point[n-1].z-temp->point[n-2].z;
			if(fabs((k1.x*k2.x+k1.y*k2.y+k1.z*k2.z)/sqrt( (k1.x*k1.x+k1.y*k1.y+k1.z*k1.z)*(k2.x*k2.x+k2.y*k2.y+k2.z*k2.z) )-1.0)<1e-6)
			{
				temp->point[n-1].x=temp->point[n].x;
				temp->point[n-1].y=temp->point[n].y;
				temp->point[n-1].z=0;
				n=n-1;
				n++;
			}
			else
				n++;
		}
		else
			n++;
	}
	if(error==0)
	{
		temp->n=n;
		temp->tag=2;
		temp->real_expres[0]=m_pexpres;
		temp->expres.Format("%s%s   定义域  【%.2f,%.2f】",".P(r)=",m_pexpres,m_a,m_b);
	}
}
void CPaint::OnModify() 
{
	OnPaintOk();
	select_line=-1;
	CWnd *m_paintok=GetDlgItem(ID_PAINT_OK),		  
		 *m_modify=GetDlgItem(ID_MODIFY);///////////
	m_paintok->EnableWindow(TRUE);
	m_paintok->ShowWindow(SW_SHOW);	
	m_modify->ShowWindow(SW_HIDE);
	flag_modify=0;
}

⌨️ 快捷键说明

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