📄 graphexpdoc.cpp
字号:
// GraphExpDoc.cpp : implementation of the CGraphExpDoc class
//
#include "stdafx.h"
#include "GraphExp.h"
#include "GraphExpDoc.h"
#include "GraphicDisp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGraphExpDoc
IMPLEMENT_DYNCREATE(CGraphExpDoc, CDocument)
BEGIN_MESSAGE_MAP(CGraphExpDoc, CDocument)
//{{AFX_MSG_MAP(CGraphExpDoc)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGraphExpDoc construction/destruction
CGraphExpDoc::CGraphExpDoc()
{
// TODO: add one-time construction code here
}
CGraphExpDoc::~CGraphExpDoc()
{
}
BOOL CGraphExpDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CGraphExpDoc serialization
void CGraphExpDoc::Serialize(CArchive& ar)
{
long i;
if (ar.IsStoring())
{
// TODO: add storing code here
ar<<m_vLines.size();
for(i=0;i<m_vLines.size();i++)
{
ar<<m_vLines[i].m_pntStart.x<<m_vLines[i].m_pntStart.y;
ar<<m_vLines[i].m_pntEnd.x<<m_vLines[i].m_pntEnd.y;
}
ar<<m_pStart<<m_pEnd<<m_color;
ar<<m_pStartB<<m_pEndB<<m_colorB;
ar<<m_pCircle<<m_mCircleR<<m_colorM;
ar<<m_vPoints.size();
for(i=0;i<m_vPoints.size();i++)
{
ar<<m_vPoints[i];
}
ar<<m_nPloy;
for(i=0;i<m_nPloy;i++)
{
ar<<m_Ploygon[i];
}
ar<<m_vRect3.size();
for(i=0;i<m_vRect3.size();i++)
{
ar<<m_vRect3[i].c_color<<m_vRect3[i].pLeft.x<<m_vRect3[i].pLeft.y;
ar<<m_vRect3[i].pRdown.x<<m_vRect3[i].pRdown.y;
}
}
else
{
// TODO: add loading code here
int nNum;
ar>>nNum;
m_vLines.resize(nNum);
for(i=0;i<nNum;i++)
{
ar>>m_vLines[i].m_pntStart.x>>m_vLines[i].m_pntStart.y;
ar>>m_vLines[i].m_pntEnd.x>>m_vLines[i].m_pntEnd.y;
}
ar>>m_pStart>>m_pEnd>>m_color;
ar>>m_pStartB>>m_pEndB>>m_colorB;
ar>>m_pCircle>>m_mCircleR>>m_colorM;
int pNum;
ar>>pNum;
for(i=0;i<pNum;i++)
{
ar>>m_vPoints[i];
}
ar>>m_nPloy;
for(i=0;i<m_nPloy;i++)
{
ar>>m_Ploygon[i];
}
ar>>nNum;
m_vRect3.resize(nNum);
for(i=0;i<nNum;i++)
{
ar>>m_vRect3[i].c_color>>m_vRect3[i].pLeft.x>>m_vRect3[i].pLeft.y;
ar>>m_vRect3[i].pRdown.x>>m_vRect3[i].pRdown.y;
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CGraphExpDoc diagnostics
#ifdef _DEBUG
void CGraphExpDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CGraphExpDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGraphExpDoc commands
void CGraphExpDoc::AddLine(CPoint pntStart, CPoint pntEnd)
{
m_vLines.push_back(CLine(pntStart,pntEnd));
}
CLine CGraphExpDoc::GetLine(int index)
{
return m_vLines.at(index);
}
int CGraphExpDoc::GetLineNumber()
{
return m_vLines.size();
}
void CGraphExpDoc::DeleteContents()
{
m_vLines.clear();
}
void CGraphExpDoc::OnEditUndo()
{
// TODO: Add your command handler code here
int index;
index=m_vLines.size()-1;
if(index>=0)
{
m_vLines.pop_back();
}
UpdateAllViews(NULL);
SetModifiedFlag(); //设置修改标志
//只有在添加直线或执行UNDO命令时才会更改文档数据
}
void CGraphExpDoc::OnUpdateEditUndo(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_vLines.size()); //仅当至少有一条真线时Undo命令才有效
}
void CGraphExpDoc::AddLineDDA(CDC *pDC,int x1, int y1, int x2, int y2, COLORREF crColor)
{
m_pStart.x=x1;
m_pStart.y=y1;
m_pEnd.x=x2;
m_pEnd.y=y2;
m_color=crColor;
CGraphicDisp mydisp(pDC);
mydisp.lineDDA(x1,y1,x2,y2,crColor);
}
void CGraphExpDoc::AddLineBresenham(int x1, int y1, int x2, int y2, COLORREF crColor)
{
m_pStartB.x=x1;
m_pStartB.y=y1;
m_pEndB.x=x2;
m_pEndB.y=y2;
m_colorB=crColor;
}
void CGraphExpDoc::AddLineDDA(int x1, int y1, int x2, int y2, COLORREF crColor)
{
m_pStart.x=x1;
m_pStart.y=y1;
m_pEnd.x=x2;
m_pEnd.y=y2;
m_color=crColor;
}
void CGraphExpDoc::DrawLineDDA(CDC *pDC)
{
CGraphicDisp mydisp(pDC);
mydisp.lineDDA(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,m_color);
}
void CGraphExpDoc::DrawLineBresenham(CDC *pDC)
{
CGraphicDisp mydisp(pDC);
mydisp.lineBresenham(m_pStartB.x,m_pStartB.y,m_pEndB.x,m_pEndB.y,m_colorB);
}
void CGraphExpDoc::AddMidpointCircle(int x0, int y0, int r, COLORREF crColor)
{
m_pCircle.x=x0;
m_pCircle.y=y0;
m_mCircleR=r;
m_colorM=crColor;
}
void CGraphExpDoc::DrawMidpointCircle(CDC *pDC)
{
CGraphicDisp mydisp(pDC);
// mydisp.lineBresenham(m_pStartB.x,m_pStartB.y,m_pEndB.x,m_pEndB.y,m_colorB);
mydisp.MidpointCircle(m_pCircle.x,m_pCircle.y,m_mCircleR,m_colorM);
}
void CGraphExpDoc::AddPnarc(int x0, int y0, int r, COLORREF crColor)
{
m_pCircleP.x=x0;
m_pCircleP.y=y0;
m_pCircleR=r;
m_colorP=crColor;
}
void CGraphExpDoc::DrawPnarc(CDC *pDC)
{
CGraphicDisp mydisp(pDC);
mydisp.Pnarc(m_pCircleP.x,m_pCircleP.y,m_pCircleR,m_colorP);
}
void CGraphExpDoc::AddPoint(CPoint m_pnt)
{
m_vPoints.push_back(m_pnt);
}
CPoint CGraphExpDoc::GetPoint(int index)
{
return m_vPoints.at(index);
}
int CGraphExpDoc::GetPointNumber()
{
return m_vPoints.size();
}
void CGraphExpDoc::DrawPoint(CDC *pDC)
{
int i;
for(i=0;i<m_vPoints.size();i++)
{
pDC->SetPixel(m_vPoints[i],RGB(255,0,0));
}
}
void CGraphExpDoc::SlipPoint(CPoint m_RctLU,CPoint m_RctRD)
{
vector<CPoint>::iterator l_Iter;
// vector<CPoint>::iterator l_Iter1;
for(l_Iter=m_vPoints.begin();l_Iter!=m_vPoints.end();l_Iter++)
{
if(l_Iter->x>m_RctLU.x&&l_Iter->x<m_RctRD.x
&&l_Iter->y>m_RctLU.y&&l_Iter->y<m_RctRD.y)
{
if(l_Iter!=m_vPoints.end())
m_vPoints.erase(l_Iter);
l_Iter--;
}
}
}
CPoint CGraphExpDoc::LineSetL(CPoint m_RctLU, CPoint m_RctRD)
{
CPoint m_pSet;
m_pSet.x=m_RctLU.x;
m_pSet.y=(m_RctLU.x-m_pStart.x)*(m_pStart.y-m_pEnd.y)/(m_pStart.x-m_pEnd.x)+m_pStart.y;
return m_pSet;
}
CPoint CGraphExpDoc::LineSetR(CPoint m_RctLU, CPoint m_RctRD)
{
CPoint m_pSet;
m_pSet.x=m_RctRD.x;
m_pSet.y=(m_RctRD.x-m_pStart.x)*(m_pStart.y-m_pEnd.y)/(m_pStart.x-m_pEnd.x)+m_pStart.y;
return m_pSet;
}
CPoint CGraphExpDoc::LineSetU(CPoint m_RctLU, CPoint m_RctRD)
{
CPoint m_pSet;
m_pSet.y=m_RctLU.y;
m_pSet.x=(m_RctLU.y-m_pStart.y)*(m_pStart.x-m_pEnd.x)/(m_pStart.y-m_pEnd.y)+m_pStart.x;
return m_pSet;
}
CPoint CGraphExpDoc::LineSetD(CPoint m_RctLU, CPoint m_RctRD)
{
CPoint m_pSet;
m_pSet.y=m_RctRD.y;
m_pSet.x=(m_RctRD.y-m_pStart.y)*(m_pStart.x-m_pEnd.x)/(m_pStart.y-m_pEnd.y)+m_pStart.x;
return m_pSet;
}
void CGraphExpDoc::Code(CPoint m_pnt, CPoint m_RctLU, CPoint m_RctRD, int &c)
{
c=0;
if(m_pnt.y>m_RctRD.y)
c=c|0X08;
else if(m_pnt.y<m_RctLU.y)
c=c|0x04;
if(m_pnt.x>m_RctRD.x)
c=c|0X02;
else if(m_pnt.x<m_RctLU.x)
c=c|0x01;
}
void CGraphExpDoc::ClipCohen(CPoint m_RctLU, CPoint m_RctRD)
{
int m_code;
int m_code1;
int m_code2;
BOOL visible=0;
BOOL done=1;
Code(m_pStart,m_RctLU,m_RctRD,m_code1);
Code(m_pEnd,m_RctLU,m_RctRD,m_code2);
CPoint m_Set;
do{
if(m_code1==0&&m_code2==0)
{
visible=1;
done=0;
}
else if((m_code1&m_code2)==0)
{
if(m_code1!=0)
m_code=m_code1;
else
m_code=m_code2;
//求交点
if((m_code&0001)==0)
{
if((m_code&2)==0)
{
if((m_code&4)==0)
m_Set=LineSetU(m_RctLU,m_RctRD);
else
m_Set=LineSetD(m_RctLU,m_RctRD);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -