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

📄 graphexpdoc.cpp

📁 实现了区域填充已经其他画线功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -