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

📄 mypaintview.cpp

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMyPaintView
CMyPaintView* dcpoint;  //定义全局视类指针变量dcpoint
extern BYTE line_count,fov,focus;
extern short xs,ys;
extern CMainFrame *mainwnd;
BOOL net_show=1,net_style=0;
extern MY_LINE *head;
extern BOOL flag_xy,flag_z,flag_FOV;
BOOL flag_drag=0,flag_zoom=0,flag_del=0,flag_texdrag=0,flag_rotexy=0,flag_rotez=0,flag_focus=1;
char select_line=-1;
CPoint mouse_down,tmp_point;
short bufferx=GetSystemMetrics(SM_CXSCREEN)/2,
      buffery=GetSystemMetrics(SM_CYSCREEN)/2,
	  x,y;
double zoom=1.0;
const short x_screen=GetSystemMetrics(SM_CXSCREEN),
            y_screen=GetSystemMetrics(SM_CYSCREEN);
BYTE m_statu=0;
short x_tex=0,y_tex=0;
//////////////////////////////
double a1=0.0,
       a2=0.0,
	   a3=0.0;
CMpoint e1[6],eye;
short 	LENS;
COLORREF color_net=RGB(192,192,192),
         color_cordn=RGB(0,0,0),
		 color_bk=RGB(255,255,255),
		 color_text=RGB(0,0,0);
/////////////////////////////////
IMPLEMENT_DYNCREATE(CMyPaintView, CView)
BEGIN_MESSAGE_MAP(CMyPaintView, CView)
	//{{AFX_MSG_MAP(CMyPaintView)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_COMMAND(ID_SHOW_HIDE, OnShowHide)
	ON_COMMAND(ID_N_NET, OnNNet)
	ON_COMMAND(ID_P_NET, OnPNet)
	ON_COMMAND(ID_POP_HELP, OnPopHelp)
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_DELETE_LINE, OnDeleteLine)
	ON_WM_LBUTTONDBLCLK()
	ON_COMMAND(ID_SET, OnSet)
	ON_COMMAND(ID_ABOUT_ME, OnAboutMe)
	ON_WM_PAINT()
	ON_COMMAND(ID_SAVE_BMP, OnSaveBmp)
	ON_COMMAND(AFX_ID_PAINT, OnIdPaint)
	//}}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;
	paint.Create(IDD_DIALOG1,mainwnd);
	e1[0].x=e1[1].y=e1[2].z=16;
	e1[3].x=e1[4].y=e1[5].z=-16;
	e1[0].y=e1[0].z=e1[1].x=e1[1].z=e1[2].y=e1[2].x=0;
	e1[3].y=e1[3].z=e1[4].x=e1[4].z=e1[5].y=e1[5].x=0;
}

CMyPaintView::~CMyPaintView()
{
	DestroyWindow();
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// 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
////////////////////////////////

//================================================================/////////////////////////////////////////
// CMyPaintView message handlers
double multi=1.0;
void CMyPaintView::OnPaint() 
{
	CPaintDC dcpaint(this); // device context for painting
    OnDraw(&dcpaint); //调用了OnDraw	
}
void CMyPaintView::OnDraw(CDC* pDC) 
{	
	dcpoint=this;
	extern BYTE line_count;
	x=bufferx+xs;
	y=buffery+ys;
	short i;
	CString num;
	CPen pen;
	double perspect[3];//////////摄像机的方向,单位向量
	perspect[0]=sin(a2)*cos(a1);
	perspect[1]=-sin(a1);
	perspect[2]=cos(a1)*cos(a2);
	double r[2][3];
	r[0][0]=cos(a3)*cos(a2)-sin(a1)*sin(a2)*sin(a3);
	r[0][1]=-sin(a3)*cos(a1);
	r[0][2]=-cos(a3)*sin(a2)-sin(a1)*cos(a2)*sin(a3);
	r[1][0]=sin(a3)*cos(a2)+sin(a1)*sin(a2)*cos(a3);
	r[1][1]=cos(a1)*cos(a3);
	r[1][2]=sin(a1)*cos(a2)*cos(a3)-sin(a2)*sin(a3);
	double pk1,pk2,pk3,pk4;
	CMpoint net1,net2,net3,net4,r1,r2,r3,r4;
	CPoint nl1,nl2,nl3,nl4;
	/////////////////////在内存DC中画图
	CDC dc;//内存DC
	CRect m_rectClient;
	dc.CreateCompatibleDC(pDC);
	GetClientRect(&m_rectClient);
	CBitmap bitmap;
	CBitmap* pOldBitmap;
	m_rectClient.left-=1;
	m_rectClient.top-=1;
	m_rectClient.right+=1;
	m_rectClient.bottom +=1;
	bitmap.CreateCompatibleBitmap(pDC,m_rectClient.Width(),m_rectClient.Height());	
	pOldBitmap = dc.SelectObject(&bitmap);
	CBrush		br(color_bk);
	CBrush*		pOldBrush = dc.SelectObject(&br);
	dc.Rectangle(0,0,m_rectClient.Width(),m_rectClient.Height());
	////////////////////////////////////////
	dc.SelectStockObject(DEFAULT_GUI_FONT);
	dc.SetBkMode(TRANSPARENT);	
	dc.SetTextColor(color_text);
	dc.TextOut(x+8,y+2,"0");
	//////////////////////////旋转摄像机(eye),焦距20
	LENS=focus*fov;
	eye.x=perspect[0]*LENS;
	eye.y=perspect[1]*LENS;
	eye.z=perspect[2]*LENS;
	double temp=fov*zoom*multi;
	if(temp<35)
		multi*=2.0;
	else
	if(temp>70)
		multi/=2.0;
	if(net_show==1)
	{				
		pen.CreatePen(0,1,color_net);
		dc.SelectObject(&pen);
		if(net_style==1&&a1||a2||a3)
			net_style=0;
		if(net_style==0&&fabs(cos(a1))>0.1&&fabs(cos(a2))>0.1)
			for(i=-15;i<=15;i++)//方形网格
			{
				if(i==0)
					continue;
				if(flag_focus)
				{
					pk1=(i*perspect[0]  -  15*perspect[1])*temp;
					pk2=(i*perspect[0]  +  15*perspect[1])*temp;
					pk3=(-15*perspect[0]  +  i*perspect[1])*temp;
					pk4=(15*perspect[0]  +  i*perspect[1])*temp;
					if(LENS-pk1<2||LENS-pk2<2||LENS-pk3<2||LENS-pk4<2)
						continue;////////////对溢出的处理
					pk1=pk1/(pk1-LENS);
					pk2=pk2/(pk2-LENS);
					pk3=pk3/(pk3-LENS);
					pk4=pk4/(pk4-LENS);
					net1.x=(eye.x-i*temp)*pk1;
					net1.y=(eye.y+15*temp)*pk1;
					net1.z=eye.z*pk1;
					net2.x=(eye.x-i*temp)*pk2;
					net2.y=(eye.y-15*temp)*pk2;
					net2.z=eye.z*pk2;
					net3.x=(eye.x+15*temp)*pk3;
					net3.y=(eye.y-i*temp)*pk3;
					net3.z=eye.z*pk3;
					net4.x=(eye.x-15*temp)*pk4;
					net4.y=(eye.y-i*temp)*pk4;
					net4.z=eye.z*pk4;
					
					r1.x=r[0][0]*net1.x+r[0][1]*net1.y+r[0][2]*net1.z;
					r1.y=r[1][0]*net1.x+r[1][1]*net1.y+r[1][2]*net1.z;
					r2.x=r[0][0]*net2.x+r[0][1]*net2.y+r[0][2]*net2.z;
					r2.y=r[1][0]*net2.x+r[1][1]*net2.y+r[1][2]*net2.z;
					r3.x=r[0][0]*net3.x+r[0][1]*net3.y+r[0][2]*net3.z;
					r3.y=r[1][0]*net3.x+r[1][1]*net3.y+r[1][2]*net3.z;
					r4.x=r[0][0]*net4.x+r[0][1]*net4.y+r[0][2]*net4.z;
					r4.y=r[1][0]*net4.x+r[1][1]*net4.y+r[1][2]*net4.z;
				}
				else			
					r1.x=r1.y=r2.x=r2.y=r3.x=r3.y=r4.x=r4.y=0;					
					
				nl1.x=(r[0][0]*i-r[0][1]*15)*temp+r1.x;
				nl1.y=(r[1][0]*i-r[1][1]*15)*temp+r1.y;
				nl2.x=(r[0][0]*i+r[0][1]*15)*temp+r2.x;
				nl2.y=(r[1][0]*i+r[1][1]*15)*temp+r2.y;
				nl3.x=(-r[0][0]*15+r[0][1]*i)*temp+r3.x;
				nl3.y=(-r[1][0]*15+r[1][1]*i)*temp+r3.y;
				nl4.x=(r[0][0]*15+r[0][1]*i)*temp+r4.x;
				nl4.y=(r[1][0]*15+r[1][1]*i)*temp+r4.y;
				dc.MoveTo(nl1.x+x,-nl1.y+y);
				dc.LineTo(nl2.x+x,-nl2.y+y);
				dc.MoveTo(nl3.x+x,-nl3.y+y);
				dc.LineTo(nl4.x+x,-nl4.y+y);				
			}
		else
		if(net_style==1)
		{
			CRect rect;
			for(i=15;i>0;i--)//极坐标网格
			{			
				rect.left=-i*temp+x;
				rect.right=i*temp+x;
				rect.top=-i*temp+y;
				rect.bottom=i*temp+y;
				dc.Ellipse(rect);
			}
			for(i=0;i<360;i+=15)//极坐标网格
			{
				dc.MoveTo(x,y);
				dc.LineTo(x+15*temp*cos(i/K),y+15*temp*sin(i/K));
			}		
		}
		pen.DeleteObject();
	}	
	pen.CreatePen(0,1,color_cordn);
	dc.SelectObject(&pen);	
	for(i=-15;i<=15;i++)
	{
		if(i==0)
			continue;
		if(flag_focus)
		{
			pk1=perspect[0]*i*temp;
			pk2=perspect[1]*i*temp;
			pk3=perspect[2]*i*temp;
			if(LENS-pk1<0||LENS-pk2<0||LENS-pk3<0)
				continue;////////////对溢出的处理
			pk1=pk1/(pk1-LENS);
			pk2=pk2/(pk2-LENS);
			pk3=pk3/(pk3-LENS);
			
			net1.x=(eye.x-i*temp)*pk1;
			net1.y=eye.y*pk1;
			net1.z=eye.z*pk1;
			net2.x=eye.x*pk2;
			net2.y=(eye.y-i*temp)*pk2;
			net2.z=eye.z*pk2;
			net3.x=eye.x*pk3;
			net3.y=eye.y*pk3;
			net3.z=(eye.z-i*temp)*pk3;

			r1.x=r[0][0]*net1.x+r[0][1]*net1.y+r[0][2]*net1.z;
			r1.y=r[1][0]*net1.x+r[1][1]*net1.y+r[1][2]*net1.z;
			r2.x=r[0][0]*net2.x+r[0][1]*net2.y+r[0][2]*net2.z;
			r2.y=r[1][0]*net2.x+r[1][1]*net2.y+r[1][2]*net2.z;
			r3.x=r[0][0]*net3.x+r[0][1]*net3.y+r[0][2]*net3.z;
			r3.y=r[1][0]*net3.x+r[1][1]*net3.y+r[1][2]*net3.z;
		}
		else
			r1.x=r1.y=r2.x=r2.y=r3.x=r3.y=0;		

		nl1.x=r[0][0]*i*temp+r1.x;
		nl1.y=r[1][0]*i*temp+r1.y;
		nl2.x=r[0][1]*i*temp+r2.x;
		nl2.y=r[1][1]*i*temp+r2.y;	
		nl3.x=r[0][2]*i*temp+r3.x;
		nl3.y=r[1][2]*i*temp+r3.y;
		num.Format("%.2f",(double)i*multi);	
		if(fabs(cos(a2))>0.1)
		{
			dc.TextOut(x+nl1.x-5,y-nl1.y+1,num);       //画X轴坐标上的数字
			dc.MoveTo(x+nl1.x,-nl1.y+y);       //画X轴坐标上的分隔线,长度为5
			dc.LineTo(x+nl1.x,-nl1.y+y-5);
		}
		if(fabs(cos(a1))>0.1)
		{
			dc.TextOut(x+nl2.x-35,y-nl2.y-5,num);       //画Y轴坐标上的数字
			dc.MoveTo(x+nl2.x,-nl2.y+y);       //画Y轴坐标上的分隔线,长度为5
			dc.LineTo(x+nl2.x+5,-nl2.y+y);
		}
		if(fabs(sin(a1))>0.1||fabs(sin(a2))>0.1)
		{
			dc.TextOut(x+nl3.x-8,-nl3.y+y+5,num);       //画Z轴坐标上的数字	
			dc.MoveTo(x+nl3.x,-nl3.y+y);       //画Z轴坐标上的分隔线,长度为5
			dc.LineTo(x+nl3.x,-nl3.y+y-5);	
		}					
	}
	dc.SetTextColor(RGB(230,20,20));
	for(i=0;i<6;i++)////////////////////////画坐标轴
	{
		if(flag_focus)
		{
			pk1=e1[i].x*temp*perspect[0]  +  e1[i].y*temp*perspect[1]  +  e1[i].z*temp*perspect[2];
			if(LENS-pk1<0)
				continue;////////////对溢出的处理
			pk1=pk1/(pk1-LENS);

			net1.x=(eye.x-e1[i].x*temp)*pk1;
			net1.y=(eye.y-e1[i].y*temp)*pk1;
			net1.z=(eye.z-e1[i].z*temp)*pk1;

			r1.x=r[0][0]*net1.x+r[0][1]*net1.y+r[0][2]*net1.z;
			r1.y=r[1][0]*net1.x+r[1][1]*net1.y+r[1][2]*net1.z;
		}
		else
			r1.x=r1.y=0;

		nl1.x=(r[0][0]*e1[i].x+r[0][1]*e1[i].y+r[0][2]*e1[i].z)*temp+r1.x;
		nl1.y=(r[1][0]*e1[i].x+r[1][1]*e1[i].y+r[1][2]*e1[i].z)*temp+r1.y;
		dc.MoveTo(x,y);		
		if(i==0)
			dc.TextOut(nl1.x+x,-nl1.y+y,"X");
		else
		if(i==1)
			dc.TextOut(nl1.x+x+5,-nl1.y+y,"Y");
		else
		if(i==2)
		dc.TextOut(nl1.x+x,-nl1.y+y,"Z");
		dc.LineTo(nl1.x+x,-nl1.y+y);
	}	
	pen.DeleteObject();
	////////////////////
	unsigned short n;
	MY_LINE *p_line=head;
	i=0;
	short length;
	x_tex=x-x_screen/2;
	y_tex=y-y_screen/2;	
	CRect rect_expres;
	while(p_line!=NULL)/////////画表达式和框
	{
		pen.CreatePen(0,1,p_line->color);
		dc.SelectObject(&pen);
		dc.SetTextColor(p_line->color);
		length=26+6*strlen(p_line->expres);//得到表达式的长度
		num.Format("%d",i+1);
		rect_expres.left=16+p_line->tem_xs+p_line->tex_xs+x_tex;
		rect_expres.right=length+p_line->tem_xs+p_line->tex_xs+x_tex;
		rect_expres.bottom=33+i*20+p_line->tem_ys+p_line->tex_ys+y_tex;
		rect_expres.top=18+20*i+p_line->tem_ys+p_line->tex_ys+y_tex;
		dc.Rectangle(&rect_expres);
		dc.TextOut(20+p_line->tem_xs+p_line->tex_xs+x_tex,20+20*i+p_line->tem_ys+p_line->tex_ys+y_tex,num);
		num.Format("%s",p_line->expres);
		dc.TextOut(28+p_line->tem_xs+p_line->tex_xs+x_tex,20+20*i+p_line->tem_ys+p_line->tex_ys+y_tex,num);
		i++;
		p_line=p_line->next;
		pen.DeleteObject();
	}
	p_line=head;
	while(p_line!=NULL)//////////////画线
	{				
		pen.CreatePen(0,p_line->weight,p_line->color);
		dc.SelectObject(&pen);
		if(p_line->style==0)
		{
			for(n=0;n<p_line->n;n++)
			{
				if(flag_focus)
				{
					pk1=(p_line->point[n].x*perspect[0]+p_line->point[n].y*perspect[1]+p_line->point[n].z*perspect[2])*fov*zoom;
					if(LENS-pk1<2)
						continue;////////////对溢出的处理
					pk1=pk1/(pk1-LENS);
					net1.x=(eye.x-p_line->point[n].x*fov*zoom)*pk1;
					net1.y=(eye.y-p_line->point[n].y*fov*zoom)*pk1;
					net1.z=(eye.z-p_line->point[n].z*fov*zoom)*pk1;
					r1.x=r[0][0]*net1.x+r[0][1]*net1.y+r[0][2]*net1.z;
					r1.y=r[1][0]*net1.x+r[1][1]*net1.y+r[1][2]*net1.z;
				}
				else
					r1.x=r1.y=0;

				nl1.x=(r[0][0]*p_line->point[n].x+r[0][1]*p_line->point[n].y+r[0][2]*p_line->point[n].z)*fov*zoom+r1.x;
				nl1.y=(r[1][0]*p_line->point[n].x+r[1][1]*p_line->point[n].y+r[1][2]*p_line->point[n].z)*fov*zoom+r1.y;
				if(n==0)
					dc.MoveTo(nl1.x+x,-nl1.y+y);
				else
				{
					dc.LineTo(nl1.x+x,-nl1.y+y);
					dc.MoveTo(nl1.x+x,-nl1.y+y);
				}
			}
		}
		else
			for(n=0;n<p_line->n;n++)
			{
				if(flag_focus)
				{
					pk1=(p_line->point[n].x*perspect[0]+p_line->point[n].y*perspect[1]+p_line->point[n].z*perspect[2])*fov*zoom;
					if(LENS-pk1<2)
						continue;////////////对溢出的处理

⌨️ 快捷键说明

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