📄 mypaintview.cpp
字号:
// 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 + -