www.pudn.com > VC++-develop-GIS.rar > drawDoc.cpp


// DrawDoc.cpp : implementation of the CDrawDoc class 
// 
#include  
#include "stdafx.h" 
#include "Draw.h" 
#include  
#include  
#include "DrawDoc.h" 
#include "Drawview.h" 
#include "CntrItem.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
CGraphPara *p_GraphPara;	//³õÊÔ»¯Ò»¸ö¹«ÓõĹØÓÚͼÐβÎÊýµÄʵÀý 
extern CDrawView *p_View; 
extern CMemFile pFile; 
float xMinScreen,yMinScreen,xMaxScreen,yMaxScreen; 
int RunTimes=0; 
extern BOOL b_Draw; 
void DPtoVP(float x,float y,int *X,int *Y); 
void VPtoDP(int x,int y,float *X,float *Y); 
int DLtoVL(float l); 
float VLtoDL(int l); 
 
BOOL IsRectCross(float minx,float miny,float maxx,float maxy); 
BOOL IsRectCross(float minx,float miny,float maxx,float maxy) 
{ 
	if(minx>xMaxScreen||maxxyMaxScreen||maxyDPtoVP(x,y,X,Y); 
} 
 
void VPtoDP(int x,int y,float *X,float *Y) 
{ 
	p_View->VPtoDP(x,y,X,Y); 
} 
				  
int DLtoVL(float l) 
{ 
	return p_View->DLtoVL(l); 
} 
 
float VLtoDL(int l) 
{ 
	return p_View->VLtoDL(l); 
} 
 
	///////////////////////////////////////////////////////////////////////////// 
// CDrawDoc 
 
IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument) 
 
BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument) 
	//{{AFX_MSG_MAP(CDrawDoc) 
	ON_UPDATE_COMMAND_UI(ID_SELECT_CLEAR, OnUpdateSelectClear) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) 
	ON_UPDATE_COMMAND_UI(ID_SELECT_DELETE, OnUpdateSelectClear) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateSelectClear) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateSelectClear) 
	ON_COMMAND(IDC_TEST, OnTest) 
	//}}AFX_MSG_MAP 
	// Enable default OLE container implementation 
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu) 
	ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, COleDocument::OnUpdateObjectVerbMenu) 
	ON_COMMAND(ID_OLE_EDIT_CONVERT, COleDocument::OnEditConvert) 
	ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu) 
	ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks) 
	ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, COleDocument::OnUpdateObjectVerbMenu) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawDoc construction/destruction 
 
CDrawDoc::CDrawDoc() 
{ 
 
b_IsOleSelect=0; 
	p_GraphPara=&m_GraphPara;	//½«¹«ÓõÄGraphParaÀàµÄÖ¸ÕëÖ¸Ïòµ±Ç°ÎĵµµÄGraphPara¶ÔÏó 
	n_GraphSelect=0; 
	GraphSelect=new GraphSelectStruct[2000];	//×î¶à¿ÉÑ¡ÖÐ2000¸öͼÐÎÔªËØ 
	n_MaxUnIndex=10000;	//¹æ¶¨¿ÉÒÔ½øÐÐ1Íò²½µÄÄæ²Ù×÷ 
	m_UndoList=new UndoStruct[n_MaxUnIndex];	 
	m_UndoList[0].l_Start=0; 
	char p1[4]; 
	sprintf(p1,"%d",RunTimes); 
	FileName="c:\\draw"; 
	FileName+=p1; 
	FileName+=".tmp"; 
	Fundo.Open(FileName,CFile::modeCreate|CFile::modeReadWrite|CFile::typeBinary); 
	RunTimes++; 
	n_CurUnIndex=0;		//µ±Ç°µÄÄæ²Ù×÷ÐòºÅΪ0 
	EnableCompoundFile(); 
	m_Index=new int[20000]; 
	m_MaxScreen=1000;		//×î¶àÄܹ»¼Ç¼ÔÚ100¸öÀúÊ·ÆÁÄ» 
	m_Screen=new ScreenStruct[m_MaxScreen];//¸ø¼Ç¼ÀúÊ·ÆÁÄ»µÄÊý×é·ÖÅä¿Õ¼ä 
	//ÒÔÏÂÉèÖÃÊׯÁµÄ²ÎÊý²¢½«Ä¿Ç°ÆÁÄ»ÉèÖÃΪÊׯÁ 
	m_CurrentScreen=0; 
	m_Screen[0].sx=0; 
	m_Screen[0].sy=0; 
	m_Screen[0].blc=1; 
	 
	strcpy(DataInfo[0].Name,"³ÇÊÐÐÅÏ¢"); 
	DataInfo[0].only_ID=1; 
	strcpy(DataInfo[1].Name,"Á¬½ÓÐÅÏ¢"); 
	DataInfo[1].only_ID=2; 
	m_NumbData=2;	 
} 
 
CDrawDoc::~CDrawDoc() 
{ 
	delete GraphSelect; 
	delete m_UndoList; 
	delete m_Index; 
	delete m_Screen; 
	Fundo.Close(); 
	remove(FileName); 
} 
 
//»æÖÆÑ¡ÖеÄͼÐÎÔªËØ 
//Lb-ͼÐÎÀà±ð Index-»æÖÆÍ¼ÐεÄÐòÁкŠMode-»æÖƸ²¸Çģʽ Mode1-»æÖÆ·½Ê½ 
void CDrawDoc::DrawGraph(CDC* pDC,int Lb,int Index,int Mode,int Mode1,short BackColor) 
{ 
	if(Lb==1)		//Èç¹ûÊÇÖ±Ïß 
		GetLine(Index)->Draw(pDC,Mode,Mode1,BackColor); 
	else if(Lb==2)	//Èç¹ûÊÇÁ¬ÐøÖ±Ïß 
		GetPLine(Index)->Draw(pDC,Mode,Mode1,BackColor); 
	else if(Lb==3)	//Èç¹ûÔ² 
		GetCircle(Index)->Draw(pDC,Mode,Mode1,BackColor); 
	else if(Lb==4)	//Èç¹ûÊÇÔ²»¡ 
		GetArc(Index)->Draw(pDC,Mode,Mode1,BackColor); 
	else if(Lb==5)	//Èç¹ûÊDZê×¢ÎÄ×Ö 
		GetText(Index)->Draw(pDC,Mode,Mode1,BackColor); 
} 
 
void CDrawDoc::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor) 
{ 
	int nn=GetNumbLines();//µÃµ½Ö±ÏßµÄÊýÄ¿	 
	while(b_Draw&&nn--)					//»æÖÆËùÓÐÖ±Ïß 
		GetLine(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor); 
	nn=GetNumbPLines();	//µÃµ½Á¬ÐøÖ±ÏߺͶà±ßÐÎÇøÓòÊýÄ¿ 
	while(b_Draw&&nn--)					//»æÖÆËùÓÐÁ¬ÐøÖ±ÏߺͶà±ßÐÎÇøÓò 
		GetPLine(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor); 
	nn=GetNumbCircles();	//µÃµ½Ô²µÄÊýÄ¿ 
	while(b_Draw&&nn--)					//»æÖÆËùÓÐÔ² 
		GetCircle(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor); 
	nn=GetNumbArcs();		//µÃµ½Ô²»¡µÄÊýÄ¿ 
	while(b_Draw&&nn--)					//»æÖÆËùÓÐÔ²»¡ 
		GetArc(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor); 
	nn=GetNumbTexts();	//µÃµ½Îı¾µÄÊýÄ¿ 
	while(b_Draw&&nn--)					//»æÖÆËùÓÐÎı¾ 
		GetText(nn)->Draw(pDC,m_DrawMode,m_DrawMode1,BackColor); 
	for(int i=0;i>line1; 
		// TODO: add loading code here 
	} 
	int nn=m_LineArray.GetSize(); 
	while(nn--) 
	{ 
		if(m_LineArray.GetAt(nn)->IsDelete()) 
		{	 
			delete m_LineArray.GetAt(nn); 
			m_LineArray.RemoveAt(nn); 
		} 
	} 
	nn=m_PLineArray.GetSize(); 
	while(nn--) 
	{ 
		if(m_PLineArray.GetAt(nn)->IsDelete()) 
		{ 
			delete m_PLineArray.GetAt(nn); 
			m_PLineArray.RemoveAt(nn);			 
		} 
	} 
	nn=m_CircleArray.GetSize(); 
	while(nn--) 
	{ 
		if(m_CircleArray.GetAt(nn)->IsDelete()) 
		{ 
			delete m_CircleArray.GetAt(nn); 
			m_CircleArray.RemoveAt(nn); 
		} 
	} 
	nn=m_ArcArray.GetSize(); 
	while(nn--) 
	{ 
		if(m_ArcArray.GetAt(nn)->IsDelete()) 
		{ 
			delete m_ArcArray.GetAt(nn); 
			m_ArcArray.RemoveAt(nn); 
		} 
	} 
	nn=m_TextArray.GetSize(); 
	while(nn--) 
	{ 
		if(m_TextArray.GetAt(nn)->IsDelete()) 
		{ 
			delete m_TextArray.GetAt(nn); 
			m_TextArray.RemoveAt(nn);		 
		} 
	} 
	m_LineArray.Serialize(ar); 
	m_PLineArray.Serialize(ar); 
	m_CircleArray.Serialize(ar); 
	m_ArcArray.Serialize(ar); 
	m_TextArray.Serialize(ar); 
	n_CurUnIndex=0; 
	SetModifiedFlag(0); 
	// Calling the base class COleDocument enables serialization 
	//  of the container document's COleClientItem objects. 
	COleDocument::Serialize(ar); 
} 
*/ 
 
void CDrawDoc::Serialize(CArchive& ar) 
{ 
	CFile *file1; 
	int n_LineNumb,n_PLineNumb,n_CircleNumb,n_ArcNumb,n_TextNumb; 
	file1=ar.GetFile(); 
	if (ar.IsStoring()) 
	{ 
		int nn=m_LineArray.GetUpperBound()+1; 
		while(nn--) 
		{ 
			if(m_LineArray.GetAt(nn)->IsDelete()) 
			{	 
				delete m_LineArray.GetAt(nn); 
				m_LineArray.RemoveAt(nn); 
			} 
		} 
		nn=m_PLineArray.GetUpperBound()+1; 
		while(nn--) 
		{ 
			if(m_PLineArray.GetAt(nn)->IsDelete()) 
			{ 
				delete m_PLineArray.GetAt(nn); 
				m_PLineArray.RemoveAt(nn);			 
			} 
		} 
		nn=m_CircleArray.GetUpperBound()+1; 
		while(nn--) 
		{ 
			if(m_CircleArray.GetAt(nn)->IsDelete()) 
			{ 
				delete m_CircleArray.GetAt(nn); 
				m_CircleArray.RemoveAt(nn); 
			} 
		} 
		nn=m_ArcArray.GetUpperBound()+1; 
		while(nn--) 
		{ 
			if(m_ArcArray.GetAt(nn)->IsDelete()) 
			{ 
				delete m_ArcArray.GetAt(nn); 
				m_ArcArray.RemoveAt(nn); 
			} 
		} 
		nn=m_TextArray.GetUpperBound()+1; 
		while(nn--) 
		{ 
			if(m_TextArray.GetAt(nn)->IsDelete()) 
			{ 
				delete m_TextArray.GetAt(nn); 
				m_TextArray.RemoveAt(nn);		 
			} 
			// TODO: add storing code here 
		} 
		n_LineNumb=m_LineArray.GetSize(); 
		n_PLineNumb=m_PLineArray.GetSize(); 
		n_CircleNumb=m_CircleArray.GetSize(); 
		n_ArcNumb=m_ArcArray.GetSize(); 
		n_TextNumb=m_TextArray.GetSize(); 
		file1->Write((unsigned char *)&n_LineNumb,sizeof(int)); 
		file1->Write((unsigned char *)&n_PLineNumb,sizeof(int)); 
		file1->Write((unsigned char *)&n_CircleNumb,sizeof(int)); 
		file1->Write((unsigned char *)&n_ArcNumb,sizeof(int)); 
		file1->Write((unsigned char *)&n_TextNumb,sizeof(int)); 
		if(n_LineNumb>0) 
		{ 
			nn=m_LineArray.GetUpperBound()+1; 
			while(nn--) 
			{ 
				if(m_LineArray.GetAt(nn)) 
					GetLine(nn)->Save(file1,1); 
			} 
		} 
		if(n_PLineNumb>0) 
		{ 
			nn=m_PLineArray.GetUpperBound()+1; 
			while(nn--) 
			{ 
				if(m_PLineArray.GetAt(nn)) 
					GetPLine(nn)->Save(file1,1); 
			} 
		} 
		if(n_CircleNumb>0) 
		{ 
			nn=m_CircleArray.GetUpperBound()+1; 
			while(nn--) 
			{ 
				if(m_CircleArray.GetAt(nn)) 
					GetCircle(nn)->Save(file1,1); 
			} 
		} 
		if(n_ArcNumb>0) 
		{ 
			nn=m_ArcArray.GetUpperBound()+1; 
			while(nn--) 
			{ 
				if(m_ArcArray.GetAt(nn)) 
					GetArc(nn)->Save(file1,1); 
			} 
		} 
		if(n_TextNumb>0) 
		{ 
			nn=m_TextArray.GetUpperBound(); 
			while(nn--) 
			{ 
				if(m_TextArray.GetAt(nn)) 
					GetText(nn)->Save(file1,1); 
			} 
		} 
	} 
	else 
	{ 
		file1->Read((unsigned char *)&n_LineNumb,sizeof(int)); 
		file1->Read((unsigned char *)&n_PLineNumb,sizeof(int)); 
		file1->Read((unsigned char *)&n_CircleNumb,sizeof(int)); 
		file1->Read((unsigned char *)&n_ArcNumb,sizeof(int)); 
		file1->Read((unsigned char *)&n_TextNumb,sizeof(int)); 
		for(int i=0;iSave(file1,0); 
			m_LineArray.Add(p_Line); 
		} 
 
		for(i=0;iSave(file1,0); 
			m_PLineArray.Add(p_PLine); 
		} 
		for(i=0;iSave(file1,0); 
			m_CircleArray.Add(p_Circle); 
		} 
		for(i=0;iSave(file1,0); 
			m_ArcArray.Add(p_Arc); 
		} 
		for(i=0;iSave(file1,0); 
			m_TextArray.Add(p_Text); 
		} 
	 
		// TODO: add loading code here 
	} 
	SetModifiedFlag(0);	 
	n_CurUnIndex=0; 
	COleDocument::Serialize(ar); 
} 
 
 
CLine* CDrawDoc::AddLine(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float X1,float Y1,float X2,float Y2) 
{ 
	CLine* p_Line=new CLine(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,X1,Y1,X2,Y2); 
	m_LineArray.Add(p_Line); 
	return p_Line; 
} 
 
CLine* CDrawDoc::AddLine() 
{ 
	CLine* p_Line=new CLine(); 
	m_LineArray.Add(p_Line); 
	return p_Line; 
} 
 
CLine * CDrawDoc::GetLine(int Index) 
{ 
	if(Index<0||Index>m_LineArray.GetUpperBound()) 
		return 0; 
	return m_LineArray.GetAt(Index); 
 
} 
 
int CDrawDoc::GetNumbLines() 
{ 
	return m_LineArray.GetSize(); 
} 
 
CPline* CDrawDoc::AddPLine(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct* PointList,BOOL Fill) 
{ 
	CPline* p_Pline=new CPline(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,Numble,PointList,Fill); 
	m_PLineArray.Add(p_Pline); 
	return p_Pline; 
} 
 
CPline* CDrawDoc::AddPLine() 
{ 
	CPline* p_Pline=new CPline(); 
	m_PLineArray.Add(p_Pline); 
	return p_Pline; 
} 
 
CPline* CDrawDoc::GetPLine(int Index) 
{ 
	if(Index<0||Index>m_PLineArray.GetUpperBound()) 
		return 0; 
	return m_PLineArray.GetAt(Index); 
} 
 
int CDrawDoc::GetNumbPLines() 
{ 
	return m_PLineArray.GetSize(); 
} 
 
CCircle* CDrawDoc::AddCircle(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill) 
{	 
	CCircle* p_Circle=new CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill); 
	m_CircleArray.Add(p_Circle); 
	return p_Circle; 
} 
 
CCircle* CDrawDoc::AddCircle() 
{	 
	CCircle* p_Circle=new CCircle(); 
	m_CircleArray.Add(p_Circle); 
	return p_Circle; 
} 
 
CCircle* CDrawDoc::GetCircle(int Index) 
{ 
	if(Index<0||Index>m_CircleArray.GetUpperBound()) 
		return 0; 
	return m_CircleArray.GetAt(Index); 
} 
 
int CDrawDoc::GetNumbCircles() 
{ 
	return m_CircleArray.GetSize(); 
} 
 
CArc* CDrawDoc::AddArc(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2)	 
{ 
	CArc* p_Arc=new CArc(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill,Angle1,Angle2); 
	m_ArcArray.Add(p_Arc); 
	return p_Arc; 
} 
 
CArc* CDrawDoc::AddArc() 
{ 
	CArc* p_Arc=new CArc(); 
	m_ArcArray.Add(p_Arc); 
	return p_Arc; 
} 
 
int CDrawDoc::GetNumbArcs() 
{ 
	return m_ArcArray.GetSize(); 
} 
 
CText* CDrawDoc::AddText(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,int TextLong,CString Text) 
{ 
	CText* p_Text=new CText(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,StartX,StartY,Angle1,Angle2,TextHeight,TextWide,OffWide,0,Text); 
	m_TextArray.Add(p_Text); 
	return p_Text; 
} 
 
CText* CDrawDoc::AddText() 
{ 
	CText* p_Text=new CText(); 
	m_TextArray.Add(p_Text); 
	return p_Text; 
} 
 
CText* CDrawDoc::GetText(int Index) 
{ 
	if(Index<0||Index>m_TextArray.GetUpperBound()) 
		return 0; 
	return m_TextArray.GetAt(Index); 
} 
 
int CDrawDoc::GetNumbTexts() 
{ 
	return m_TextArray.GetSize(); 
} 
 
//ÔÚÀúÊ·ÆÁÄ»ÖÐÔö¼ÓÒ»¸öÆÁÄ»£¬ÒÔ¹©ÆÁÄ»»ØËݲÙ×÷ 
//(StartX,StartY)ÆÁÄ»Æðµã£¬blcΪÆÁÄ»µÄ±ÈÀý³ß 
void CDrawDoc::AddScreen(float StartX,float StartY,float blc) 
{ 
	int i; 
	if(m_CurrentScreen==m_MaxScreen)//Èç¹ûµ±Ç°ÆÁÄ»ÔÚ50ÆÁÉÏ£¬¼´Ã»ÓÐÊý×é¿Õ¼äÔÙ´æÐÅÏ¢ 
	{ 
		//½«Êý×é×ö¶Ñʽ¹ö¶¯½«µÚ¶þÆÁÈ¥µô£¨screenxy[0]Öд洢µÄÊÇÊׯÁÐÅÏ¢£¬²Ù×÷ʱ²»¸Ä±ä) 
		for(i=1;iy2)ang1=(float)pi*2-ang1;  //Ö±Ïß(x1,y1)-(x2,y2)µÄ»¡¶È 
		} 
		ang2=(float)acos((xx-x1)/a); 
		if(y1>yy)ang2=(float)pi*2-ang2;  //Ö±Ïß(x1,y1)-(xx,yy)µÄ»¡¶È 
		ang=ang2-ang1; 
		if(ang<0)ang=-ang; 
		if(ang>pi) ang=(float)pi*2-ang;  //½»½ÇµÄ´óС 
		if(ang>pi/2) return a;    //Èç¹ûΪ¶Û½Ç£¬Ö±½Ó·µ»Ø¾àÀë 
		else  
			return (a*(float)sin(ang)); //·ñÔò·µ»Ø¼ÆËãµÃµ½µÄ¾àÀë  
	} 
	else //Èç¹û(xx,yy)µÄµã(x2,y2£©ÕâÌõ±ß½Ï¶Ì 
	{ 
		if(y1==y2) 
		{ 
			if(x1y1)ang1=(float)pi*2-ang1; 
		} 
		ang2=(float)acos((xx-x2)/b);     //Ö±Ïߣ¨x2,x1£©-(xx,yy)µÄбÂʵĻ¡¶È 
		if(y2>yy)ang2=(float)pi*2-ang2; 
		ang=ang2-ang1; 
		if(ang<0) ang=-ang; 
		if(ang>pi) ang=(float)pi*2-ang;  //½»½ÇµÄ´óС Ç
 
		if(ang>pi/2)  return b;   //Èç¹ûΪ¶Û½Ç£¬Ö±½Ó·µ»Ø¾àÀë 
		else  
			return(b*(float)sin(ang));  //·ñÔò·µ»Ø¼ÆËãµÃµ½µÄ¾àÀë 
	} 
} 
 
//º¯ÊýPointRgn×÷ÓãºÅжÏÒ»¸öµãÊÇ·ñÔÚÈÎÒâ¶à±ßÐÎÇøÓòÄÚ 
//²ÎÊý£ºNumble-±ß½çµãÊý£¬x,yÊǵãµÄ×ø±ê£¬¶à±ßÐζ¥µãµÄ×ø±êÔڽṹÊý×éPointListÖÐ 
//·µ»Ø£º1-µãÔÚ¶à±ßÐÎÇøÓò0-²»ÔÚ 
BOOL CDraw::PointRgn(float x,float y,int Numble,PointStruct *PointList,float blc) 
{ 
	CRgn rgn;         //¶¨ÒåÒ»¸öCRgn¶ÔÏó 
	int x1,y1,i; 
	CPoint bbcc[500]; 
	//POINT* bbcc;      // ¶¨ÒåÒ»¸öµã½á¹¹Ö¸Õë 
	if(Numble<3)  
		return 0;//Èç¹ûµãµÄÊýÄ¿<3¼´²»ÊÇÒ»¸öÇøÓò·µ»Ø²»³É¹¦±êÖ¾ 
	//bbcc=new POINT[Numble+1]; //·ÖÅäsm¸öµã 
	//½«µãµÄ×ø±êת±ä³ÉÆÁÄ»×ø±ê 
	x1=(int)(x/blc); 
	y1=(int)(y/blc); 
	//½«·â±ÕÇøÓò¸÷µãµÄ×ø±êת³ÉÆÁÄ»×ø±ê 
	for(i=0;i>b_Delete>>m_ColorPen>>m_ColorBrush>>m_LineWide>>m_LineType>>m_Layer>>m_id_only; 
	} 
} 
 
void CDraw::Save(CFile* file,BOOL Yn) 
{ 
	if(Yn)	//Èç¹ûÊÇÔÚ½øÐб£´æ 
	{ 
		file->Write((unsigned char *)&m_ColorPen,sizeof(m_ColorPen)); 
		file->Write((unsigned char *)&m_ColorBrush,sizeof(m_ColorBrush)); 
		file->Write((unsigned char *)&m_LineWide,sizeof(m_LineWide)); 
		file->Write((unsigned char *)&m_LineType,sizeof(m_LineType)); 
		file->Write((unsigned char *)&m_Layer,sizeof(m_Layer)); 
		file->Write((unsigned char *)&b_Delete,sizeof(b_Delete)); 
	} 
	else 
	{ 
		file->Read((unsigned char *)&m_ColorPen,sizeof(m_ColorPen)); 
		file->Read((unsigned char *)&m_ColorBrush,sizeof(m_ColorBrush)); 
		file->Read((unsigned char *)&m_LineWide,sizeof(m_LineWide)); 
		file->Read((unsigned char *)&m_LineType,sizeof(m_LineType)); 
		file->Read((unsigned char *)&m_Layer,sizeof(m_Layer)); 
		file->Read((unsigned char *)&b_Delete,sizeof(b_Delete)); 
	} 
} 
 
void CDraw::toChar(char *p_Char) 
{ 
	char p1[22]; 
	sprintf(p1,"%3d,%3d,%3d,%3d,%3d,%1d",(int)m_ColorPen,(int)m_ColorBrush,(int)m_LineWide,(int)m_LineType,(int)m_Layer,(int)b_Delete); 
	p1[21]=0; 
	lstrcat(p_Char,p1); 
} 
 
char *CDraw::toData(char *p_Char) 
{ 
	char p1[22]; 
	strncpy(p1,p_Char,21); 
	p1[21]=0; 
	sscanf(p1,"%d,%d,%d,%d,%d,%d",&m_ColorPen,&m_ColorBrush,&m_LineWide,&m_LineType,&m_Layer,&b_Delete); 
	p_Char+=21; 
	return p_Char; 
} 
 
IMPLEMENT_SERIAL(CLine,CObject,1) 
void CLine::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor) 
{ 
	int x1,y1,x2,y2; 
	float minx,miny,maxx,maxy; 
	if(b_Delete)	//Èç¹ûÒѾ­´¦ÓÚɾ³ý״̬ 
		return; 
	short LineType=m_LineType; 
	short ColorPen=m_ColorPen; 
	GetRect(&minx,&miny,&maxx,&maxy); 
	if(!IsRectCross(minx,miny,maxx,maxy)) 
		return; 
	if(m_DrawMode1==1)	//±»Êó±êÑ¡ÔñÑ¡ÔñºóÌØÊâÏÔʾ 
	{ 
		if(m_LineType!=2) 
			LineType=2; 
		else 
			LineType++; 
	} 
	else if(m_DrawMode1==2)	//Ö¸¶¨ÑÕÉ«»æÖÆ 
		ColorPen=BackColor; 
 
	//É趨»­±ÊµÄÏßÐÍ.¿í¶È.ÑÕÉ« 
	CPen pen((int)LineType,(int)m_LineWide,p_GraphPara->GetColor(ColorPen)); 
	CPen* pOldPen=pDC->SelectObject(&pen); 
	if(m_DrawMode==0) 
		pDC->SetROP2(R2_COPYPEN);//É趨¸²¸ÇµÄ»æÖÆÄ£Ê½ 
	else if(m_DrawMode==1) 
		pDC->SetROP2(R2_NOT); 
	//½«Êµ¼Ê×ø±êת»»³ÉÆÁÄ»µãÕó×ø±ê 
	DPtoVP(m_X1,m_Y1,&x1,&y1); 
	DPtoVP(m_X2,m_Y2,&x2,&y2); 
	//½øÐлæÖÆ 
	pDC->MoveTo(x1,y1); pDC->LineTo(x2,y2); 
	pDC->SelectObject(pOldPen);//»Ö¸´»­±Ê 
} 
 
//º¯ÊýLine::GetRect×÷Ó㺼ÆËã²¢·µ»ØÒ»ÌõÖ±ÏߵľØÐα߽ç 
void CLine::GetRect(float *minX,float *minY,float *maxX,float *maxY) 
{ 
	*minX=min(m_X1,m_X2);  //¼ÆËã²¢·µ»Ø×îСxÖµ 
	*maxX=max(m_X1,m_X2);  //¼ÆËã²¢·µ»Ø×î´óxÖµ 
	*minY=min(m_Y1,m_Y2);  //¼ÆËã²¢·µ»Ø×îСyÖµ 
	*maxY=max(m_Y1,m_Y2);  //¼ÆËã²¢·µ»Ø×î´óyÖµ 
} 
 
//º¯Êý£ºCLine::IsPoint 
//×÷ÓãºÅжϵãÊÇ·ñÔÚÖ±ÏßÉÏ£¬²ÎÊý£¨x,y)ÊǵãÖеãµÄ×ø±ê£¬jlΪµãÖеľàÀ뷶Χ 
//·µ»Ø£º1-µãÖÐÖ±Ïß 0-ûÓеãÖÐ 
BOOL CLine::IsPoint(float x,float y,float jl) 
{ 
	float xx,x1,x2,y1,y2; 
    if(b_Delete) 
		return FALSE; 
	GetRect(&x1,&y1,&x2,&y2);//µÃµ½Ã¿ÌõÖ±ÏßµÄ±ß½ç¾ØÐÎ 
    if(!(x>=x1&&x<=x2&&y>=y1&&y<=y2)) 
		return FALSE; //Èç¹ûµã²»ÔÚ±ß½ç¾ØÐÎÄÚ,¼ÌÐøÅжÏÏÂÒ»¸öͼÐÎÔªËØ 
	xx=PointLine(x,y,m_X1,m_Y1,m_X2,m_Y2);//µÃµ½µãµ½Ö±Ïß¾àÀë 
	if(xx>m_X1>>m_Y1>>m_X2>>m_Y2; 
	} 
} 
 
void CLine::Save(CFile* file,BOOL Yn) 
{ 
	CDraw::Save(file,Yn); 
	if(Yn) 
	{ 
		file->Write((unsigned char *)&m_X1,sizeof(m_X1)); 
		file->Write((unsigned char *)&m_Y1,sizeof(m_Y1)); 
		file->Write((unsigned char *)&m_X2,sizeof(m_X2)); 
		file->Write((unsigned char *)&m_Y2,sizeof(m_Y2)); 
	} 
	else 
	{ 
		file->Read((unsigned char *)&m_X1,sizeof(m_X1)); 
		file->Read((unsigned char *)&m_Y1,sizeof(m_Y1)); 
		file->Read((unsigned char *)&m_X2,sizeof(m_X2)); 
		file->Read((unsigned char *)&m_Y2,sizeof(m_Y2)); 
	} 
} 
 
void CLine::toChar(char *p_Char) 
{ 
	char p1[53]; 
	CDraw::toChar(p_Char); 
	sprintf(p1,"%12.4f,%12.4f,%12.4f,%12.4f\n",m_X1,m_Y1,m_X2,m_Y2); 
	p1[52]=0; 
	strcat(p_Char,p1); 
} 
 
char *CLine::toData(char *p_Char) 
{ 
	char p1[53]; 
	p_Char=CDraw::toData(p_Char); 
	strncpy(p1,p_Char,52); 
	p_Char+=52; 
	sscanf(p1,"%f,%f,%f,%f\n",&m_X1,&m_Y1,&m_X2,&m_Y2); 
	return p_Char; 
} 
 
void CLine::Move(float x_Move,float y_Move) 
{ 
	m_X1+=x_Move; 
	m_X2+=x_Move; 
	m_Y1+=y_Move; 
	m_Y2+=y_Move; 
} 
 
IMPLEMENT_SERIAL(CPline,CObject,1) 
void CPline::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor) 
{ 
	float minx,miny,maxx,maxy; 
	int x1,y1; 
	if(b_Delete)	//Èç¹ûÒѾ­´¦ÓÚɾ³ý״̬ 
		return; 
	short LineType=m_LineType; 
	short ColorPen=m_ColorPen; 
	short ColorBrush=m_ColorBrush; 
	GetRect(&minx,&miny,&maxx,&maxy); 
	if(!IsRectCross(minx,miny,maxx,maxy)) 
		return; 
	//É趨»­±ÊµÄÏßÐÍ.¿í¶È.ÑÕÉ« 
	if(m_DrawMode1==1)	//±»Êó±êÑ¡ÔñÑ¡ÔñºóÌØÊâÏÔʾ 
	{ 
		if(m_LineType!=2) 
			LineType=2; 
		else 
			LineType++; 
	} 
	else if(m_DrawMode1==2)	//Ö¸¶¨ÑÕÉ«»æÖÆ 
	{ 
		ColorPen=BackColor; 
		ColorBrush=BackColor; 
	} 
	CPen pen((int)LineType,(int)m_LineWide,p_GraphPara->GetColor(ColorPen)); 
	CPen* pOldPen=pDC->SelectObject(&pen); 
	CBrush brush(p_GraphPara->GetColor(m_ColorBrush)); 
	CBrush* pOldBrush=pDC->SelectObject(&brush); 
	POINT* ppoint; 
	CRgn rgn; 
	if(m_DrawMode==0) 
		pDC->SetROP2(R2_COPYPEN);//É趨¸²¸ÇµÄ»æÖÆÄ£Ê½ 
	else if(m_DrawMode==1) 
		pDC->SetROP2(R2_NOT); 
	 
	ppoint=new POINT[m_Numble+1]; 
	for(int i=0;iMoveTo(ppoint[0].x,ppoint[0].y); 
		for(i=0;iLineTo(ppoint[i].x,ppoint[i].y); 
	} 
	else 
    { 
		if(m_DrawMode1==0||m_DrawMode1==2)	//Èç¹ûÊÇÕý³£ÏÔʾ 
			pDC->Polygon(ppoint,m_Numble);	//»æÖƶà±ßÐÎ  
		else if(m_DrawMode1==1)	//½øÐз´É«ÏÔʾ 
		{ 
			rgn.CreatePolygonRgn(ppoint,m_Numble,1);  
			pDC->InvertRgn(&rgn); 
		} 
	} 
	delete ppoint; 
	pDC->SelectObject(pOldPen);   //»Ö¸´»­±Ê 
	pDC->SelectObject(pOldBrush); //»Ö¸´Ë¢×Ó 
} 
 
//º¯Êý:CPline::GetRect×÷ÓÃ:¼ÆËã²¢·µ»ØÒ»ÌõÁ¬ÐøÖ±ÏßµÄ±ß½ç¾ØÐÎ 
//Á¬ÐøÖ±ÏßµÄÖ÷¿Ø²ÎÊýÔÚpline1ÖУ¬×ø±êÔÚPointxyÖÐ 
void CPline::GetRect(float *minX,float *minY,float *maxX,float *maxY) 
{ 
	float x1,y1,x2,y2; 
	//ÓõÚÒ»¸ö¶¥µãµÄ×ø±ê³õÊÔ»¯±äÁ¿ 
	x1=m_PointList[0].x;x2=m_PointList[0].y; 
	y1=m_PointList[0].x;y2=m_PointList[0].y; 
	for(int i=1;i=x1-jl&&x<=x2+jl&&y>=y1-jl&&y<=y2+jl)) 
		return FALSE;	//Èç¹ûµã²»ÔÚ±ß½ç¾ØÐÎÄÚ,Ôò²»ÄÜÑ¡ÖÐ 
	    
	if(!b_Fill)			//Èç¹ûÊÇÁ¬ÐøÖ±Ïß 
	{ 
		for(i=0;i>b_Fill>>m_Numble; 
		m_PointList=new PointStruct[m_Numble]; 
		for(i=0;i>m_PointList[i].x>>m_PointList[i].y; 
	} 
} 
 
void CPline::Save(CFile* file,BOOL Yn) 
{ 
	int i; 
	CDraw::Save(file,Yn); 
	if(Yn) 
	{ 
		file->Write((unsigned char *)&b_Fill,sizeof(b_Fill)); 
		file->Write((unsigned char *)&m_Numble,sizeof(m_Numble)); 
		for(i=0;iWrite((unsigned char *)&m_PointList[i],sizeof(m_PointList[i])); 
		} 
	} 
	else 
	{ 
		file->Read((unsigned char *)&b_Fill,sizeof(b_Fill)); 
		file->Read((unsigned char *)&m_Numble,sizeof(m_Numble)); 
		m_PointList=new PointStruct[m_Numble]; 
		for(i=0;iRead((unsigned char *)&m_PointList[i],sizeof(m_PointList[i])); 
		} 
	} 
} 
 
void CPline::toChar(char *p_Char) 
{ 
	char p1[27]; 
	CDraw::toChar(p_Char); 
	sprintf(p1,"%4d,%1d\n",m_Numble,(int)b_Fill); 
	p1[7]=0; 
	lstrcat(p_Char,p1); 
	for(int i=0;iGetColor(ColorPen)); 
	CPen* pOldPen=pDC->SelectObject(&pen); 
	CBrush brush(p_GraphPara->GetColor(m_ColorBrush)); 
	CBrush* pOldBrush=pDC->SelectObject(&brush); 
	if(m_DrawMode==0) 
		pDC->SetROP2(R2_COPYPEN);//É趨¸²¸ÇµÄ»æÖÆÄ£Ê½ 
	else if(m_DrawMode==1) 
		pDC->SetROP2(R2_NOT);    //ÉèÖ÷´É«µÄ»æ»­Ä£Ê½ 
	if(!b_Fill)	//Èç¹ûÊÇÔ² 
		pDC->SelectStockObject(NULL_BRUSH); //Èç¹ûÊÇÆÕͨԲ£¬ÉèÖò»Ìî³ä״̬ 
		//¼ÆËãµÃµ½Ô²Ðİ뾶µÄÆÁÄ»ÏñËØ×ø±ê  
	DPtoVP(m_CircleX,m_CircleY,&x,&y); 
	r=DLtoVL(m_CircleR); 
	pDC->Ellipse(x-r,y-r,x+r,y+r); //»æÖÆÔ² 
	pDC->SelectObject(pOldPen);    //»Ö¸´»­±Ê 
	pDC->SelectObject(pOldBrush);  //»Ö¸´»­Ë¢ 
} 
 
//º¯Êý£ºCCircle::GetRect×÷Ó㺼ÆËã²¢·µ»ØÒ»Ìõ¸öÔ²µÄ¾ØÐα߽ç 
void CCircle::GetRect(float *minX,float *minY,float *maxX,float *maxY) 
{ 
	*minX=m_CircleX-m_CircleR;  //µÃµ½²¢·µ»Ø×îСxÖµ 
	*minY=m_CircleY-m_CircleR;  //µÃµ½²¢·µ»Ø×î´óxÖµ 
	*maxX=m_CircleX+m_CircleR;  //µÃµ½²¢·µ»Ø×îСyÖµ 
	*maxY=m_CircleY+m_CircleR;  //µÃµ½²¢·µ»Ø×î´óyÖµ 
} 
 
//º¯Êý£ºCCircle::IsPoint 
//¹¦ÄÜ£ºÅжϵãÊÇ·ñÔÚÔ²ÉÏ£¬²ÎÊý£¨x,y)ÊǵãÖеãµÄ×ø±ê£¬jlΪµãÖеľàÀ뷶Χ£¬ 
//·µ»Ø£º1-µãÖÐÔ²»òÔ²ÐÎÇøÓò£¬0-ûÓÐÑ¡ÖÐ 
BOOL CCircle::IsPoint(float x,float y,float jl) 
{ 
	float xx; 
    if(b_Delete) 
		return FALSE; 
	xx=CalDisp(x,y,m_CircleX,m_CircleY);	//µãµ½Ô²ÐĵľàÀë 
	//Èç¹ûÊÇÆÕͨԲ²¢Çҵ㵽ԲµÄ¾àÀëСÓÚjl 
	if(!b_Fill) 
	{ 
		if((xx>m_CircleR-jl&&xx>b_Fill>>m_CircleX>>m_CircleY>>m_CircleR; 
	} 
} 
 
void CCircle::Save(CFile* file,BOOL Yn) 
{ 
	CDraw::Save(file,Yn); 
	if(Yn) 
	{ 
		file->Write((unsigned char *)&b_Fill,sizeof(b_Fill)); 
		file->Write((unsigned char *)&m_CircleX,sizeof(m_CircleX)); 
		file->Write((unsigned char *)&m_CircleY,sizeof(m_CircleY)); 
		file->Write((unsigned char *)&m_CircleR,sizeof(m_CircleR)); 
	} 
	else 
	{ 
		file->Read((unsigned char *)&b_Fill,sizeof(b_Fill)); 
		file->Read((unsigned char *)&m_CircleX,sizeof(m_CircleX)); 
		file->Read((unsigned char *)&m_CircleY,sizeof(m_CircleY)); 
		file->Read((unsigned char *)&m_CircleR,sizeof(m_CircleR)); 
	} 
} 
 
void CCircle::toChar(char *p_Char) 
{ 
	char p1[42]; 
 
	CDraw::toChar(p_Char); 
	sprintf(p1,"%12.4f,%12.4f,%12.4f,%1d\n",m_CircleX,m_CircleY,m_CircleR,b_Fill); 
	p1[42]=0; 
	lstrcat(p_Char,p1); 
} 
 
char *CCircle::toData(char *p_Char) 
{ 
	char p1[42]; 
	p_Char=CDraw::toData(p_Char); 
	strncpy(p1,p_Char,41); 
	p_Char+=41; 
	p1[41]=0; 
	sscanf(p1,"%f,%f,%f,%d\n",&m_CircleX,&m_CircleY,&m_CircleR,&b_Fill); 
	return p_Char; 
} 
 
void CCircle::Move(float x_Move,float y_Move) 
{ 
	m_CircleX+=x_Move; 
	m_CircleY+=y_Move; 
} 
 
void CArc::Init(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2) 
{ 
	m_ColorPen=ColorPen; 
	m_ColorBrush=ColorBrush; 
	m_LineWide=LineWide; 
	m_LineType=LineType; 
	m_Layer=Layer; 
	m_CircleX=CircleX; 
	m_CircleY=CircleY; 
	m_CircleR=CircleR; 
	b_Fill=Fill; 
	m_Angle1=Angle1; 
	m_Angle2=Angle2; 
} 
 
CArc* CDrawDoc::GetArc(int Index) 
{ 
	if(Index<0||Index>m_ArcArray.GetUpperBound()) 
		return 0; 
	return m_ArcArray.GetAt(Index); 
} 
 
IMPLEMENT_SERIAL(CArc,CObject,1) 
void CArc::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor) 
{ 
//	if(b_Delete)	//Èç¹ûÒѾ­´¦ÓÚɾ³ý״̬ 
//			return; 
	float minx,miny,maxx,maxy; 
	GetRect(&minx,&miny,&maxx,&maxy); 
	if(!IsRectCross(minx,miny,maxx,maxy)) 
		return; 
	int x,y,rr; 
	int x1,x2,y1,y2; 
	short LineType=m_LineType; 
	short ColorPen=m_ColorPen; 
	if(m_DrawMode1==1)	//±»Êó±êÑ¡ÔñÑ¡ÔñºóÌØÊâÏÔʾ 
	{ 
		if(m_LineType!=2) 
			LineType=2; 
		else 
			LineType++; 
	} 
	else if(m_DrawMode1==2)	//Ö¸¶¨ÑÕÉ«»æÖÆ 
		ColorPen=BackColor; 
	//É趨»­±ÊµÄÏßÐÍ.¿í¶È.ÑÕÉ« 
	CPen pen((int)LineType,(int)m_LineWide,p_GraphPara->GetColor(ColorPen)); 
	CPen* pOldPen=pDC->SelectObject(&pen); 
	if(m_DrawMode==0) 
		pDC->SetROP2(R2_COPYPEN);//É趨¸²¸ÇµÄ»æÖÆÄ£Ê½ 
	else if(m_DrawMode==1) 
		pDC->SetROP2(R2_NOT); 
	//½«Ô²ÐÄʵ¼Ê×ø±êתΪÆÁÄ»×ø±ê 
	DPtoVP(m_CircleX,m_CircleY,&x,&y); 
	rr=DLtoVL(m_CircleR); 
	//µÃµ½ÆðµãµÄ×ø±ê 
	x1=x+DLtoVL(m_CircleR*(float)cos(m_Angle1)); 
	y1=y-DLtoVL(m_CircleR*(float)sin(m_Angle1)); 
 
	//µÃµ½ÖÕµãµÄ×ø±ê 
	x2=x+DLtoVL(m_CircleR*(float)cos(m_Angle2)); 
	y2=y-DLtoVL(m_CircleR*(float)sin(m_Angle2)); 
	pDC->Arc(x-rr,y-rr,x+rr,y+rr,x1,y1,x2,y2);  //»æÖÆÔ²»¡ 
	pDC->SelectObject(pOldPen);             //»Ö¸´»­±Ê 
} 
 
 
//º¯Êý£ºAarc::GetRect×÷Ó㺼ÆËãÒ»Ìõ»¡µÄ±ß½ç¾ØÐΣ¬»¡µÄ×ø±êÔÚarc1ÄÚ 
void CArc::GetRect(float *minX,float *minY,float *maxX,float *maxY) 
{ 
	float x,y,x1,y1,x2,y2; 
	int i; 
	//  µÃµ½Ô²»¡Æðµã×ø±ê 
	x=m_CircleX+(float)(cos(m_Angle1)*m_CircleR); 
	y=m_CircleY+(float)(sin(m_Angle1)*m_CircleR); 
	x1=x; y1=y; 
	x2=x; y2=y;           //¸ø±ß½ç¾ØÐγõÖµ£º 
	// µÃµ½Ô²»¡ÖÕµã×ø±ê 
	x=m_CircleX+(float)(cos(m_Angle2)*m_CircleR);    
	y=m_CircleY+(float)(sin(m_Angle2)*m_CircleR); 
	//µÃµ½×îСºÍ×î´ó×ø±ê  
	x1=min(x,x1);x2=max(x,x2); 
	y1=min(y,y1);y2=max(y,y2); 
	for(i=0;i<4;i++)     //¶ÔÁíÍâÈý¸ö×ø±êÖáÑ­»· 
	{ 
		if(IsInArc(pi/2*i)) 
		{ 
			if(i==0) 
			{ 
				x=m_CircleX+m_CircleR; 
				y=m_CircleY; 
			} 
			else if(i==1)     //ÓëYÖáÕý·½ÏòÏཻ 
			{ 
				x=m_CircleX; 
				y=m_CircleY+m_CircleR;  //µÃµ½½»µã×ø±ê 
			} 
			else if(i==2)    //ÓëxÖḺ·½ÏòÏཻ 
			{ 
				x=m_CircleX-m_CircleR; 
				y=m_CircleY;  
			} 
			else if(i==3)    //ÓëYÖáÕý·½ÏòÏཻ 
			{ 
				x=m_CircleX; 
				y=m_CircleY-m_CircleR;  
			} 
			//µÃµ½×îÐ¡×ø±êÖµºÍ×î´ó×ø±êÖµ 
			x1=min(x,x1);x2=max(x,x2); 
			y1=min(y,y1);y2=max(y,y2); 
		} 
	} 
	*minX=x1;*maxX=x2;*minY=y1;*maxY=y2; //¸³Öµ¸øµØÖ··µ»Ø 
} 
 
BOOL CArc::IsInArc(float angle) 
{ 
	if((m_Angle1m_Angle1) 
		||m_Angle1>m_Angle2&&(!(angle<=m_Angle1&&angle>=m_Angle2))) 
		return TRUE; 
	else 
		return FALSE; 
} 
 
//º¯Êý£ºCArc::IsPoint 
//¹¦ÄÜ£ºÅжϵãÊÇ·ñÔÚÔ²»¡ÉÏ£¬²ÎÊý£¨x,y)ÊǵãÖеãµÄ×ø±ê£¬jlΪµãÖеľàÀ뷶Χ£¬ 
//·µ»Ø£º1-µãÖÐÔ²»¡£¬index·µ»ØµãÖеÄͼÐÎÔªËØµÄÐòÁкţ¬index1·µ»ØÎ¨Ò»Ê¶±ðºÅ 
BOOL CArc::IsPoint(float x,float y,float jl) 
{ 
	if(CCircle::IsPoint(x,y,jl)) 
	{ 
		//µãÖеãÏà¶ÔÓÚ»¡µÄÔ²ÐĽǵĻ¡¶È 
		float xx=CalDisp(x,y,m_CircleX,m_CircleY); 
		float ang=(float)acos((x-m_CircleX)/xx); 
		if(y-m_CircleY<0) 
			ang=(float)pi*2-ang; 
		//Èç¹ûµãÖеĵãÏà¶ÔÓÚ»¡µÄÔ²ÐĵĻ¡¶ÈÔÚ»¡µÄ»¡¶È·¶Î§ÄÚ 
		if(IsInArc(ang)) 
			return TRUE; 
	} 
	return 0;//Èç¹ûûÓеãÖÐÔ²»¡£¬·µ»Ø0 
} 
 
void CArc::Serialize(CArchive& ar) 
{ 
	CCircle::Serialize(ar); 
	if(ar.IsStoring()) 
	{ 
		ar<>m_Angle1>>m_Angle2; 
	} 
} 
 
void CArc::Save(CFile* file,BOOL Yn) 
{ 
	CCircle::Save(file,Yn); 
	if(Yn) 
	{ 
		file->Write((unsigned char *)&m_Angle1,sizeof(m_Angle1)); 
		file->Write((unsigned char *)&m_Angle2,sizeof(m_Angle2)); 
	} 
	else 
	{ 
		file->Read((unsigned char *)&m_Angle1,sizeof(m_Angle1)); 
		file->Read((unsigned char *)&m_Angle2,sizeof(m_Angle2)); 
	} 
} 
 
void CArc::toChar(char *p_Char) 
{ 
	char p1[66]; 
	CDraw::toChar(p_Char); 
	sprintf(p1,"%12.4f,%12.4f,%12.4f,%12.4f,%12.4f\n",m_CircleX,m_CircleY,m_CircleR,m_Angle1,m_Angle2); 
	p1[65]=0; 
	lstrcat(p_Char,p1); 
} 
 
char *CArc::toData(char *p_Char) 
{ 
	char p1[66]; 
	p_Char=CDraw::toData(p_Char); 
	strncpy(p1,p_Char,65); 
	p_Char+=65; 
	p1[65]=0; 
	sscanf(p1,"%f,%f,%f,%f,%f\n",&m_CircleX,&m_CircleY,&m_CircleR,&m_Angle1,&m_Angle2); 
	return p_Char; 
} 
 
IMPLEMENT_SERIAL(CText,CObject,1) 
void CText::Init(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,CString Text) 
{ 
	m_ColorPen=ColorPen; 
	m_ColorBrush=ColorBrush; 
	m_LineType=LineType; 
	m_LineWide=LineWide; 
	m_Layer=Layer; 
	m_StartX=StartX; 
	m_StartY=StartY; 
	m_Angle1=Angle1; 
	m_Angle2=Angle2; 
	m_TextHeight=TextHeight; 
	m_TextWide=TextWide; 
	m_OffWide=OffWide; 
	m_TextLong=c_Text.GetLength(); 
	m_TextFont=TextFont; 
	c_Text=Text; 
} 
 
void CText::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor) 
{          
	if(b_Delete)	//Èç¹ûÒѾ­´¦ÓÚɾ³ý״̬ 
		return; 
	float minx,miny,maxx,maxy; 
	GetRect(&minx,&miny,&maxx,&maxy); 
	if(!IsRectCross(minx,miny,maxx,maxy)) 
		return; 
	short ColorPen=m_ColorPen; 
	if(m_DrawMode1==2)	//Ö¸¶¨ÑÕÉ«»æÖÆ 
		ColorPen=BackColor; 
	CFont cjcf;  //¶¨ÒåÒ»¸ö×ÖÄ£ 
	int high,wide,cc1,cc2,cd,angg; 
	unsigned char c1,c2; 
	float x1,y1,ang1; 
	char bz[4]; 
	const char *ls1; 
	if(m_DrawMode==0) 
		pDC->SetROP2(R2_COPYPEN); 
	else if(m_DrawMode==1) 
		pDC->SetROP2(R2_NOT);   
	pDC->SetBkMode(TRANSPARENT); 
	 
	high=DLtoVL(m_TextHeight); //µÃµ½×ÖÌåµÄµãÕó¸ß¶È 
	ang1=(float)(m_Angle1*pi/180); 
	if(high<3||high>200) 
		return;                 //×ÖÌå̫С»òÌ«´ó½«²»ÏÔʾ 
	x1=m_StartX-m_TextHeight*(float)sin(ang1); 
	y1=m_StartY+m_TextHeight*(float)cos(ang1); 
	angg=(int)(m_Angle2*10); 
	wide=DLtoVL(m_TextWide); 
	//ÆðʼµãµÄÆÁÄ»µãÕó×ø±ê 
	DPtoVP(x1,y1,&cc1,&cc2); 
	//´´½¨×ÖÄ£ 
	cjcf.CreateFont(high,wide,angg,0,50,0,0,0,255,OUT_TT_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,"cjc"); 
	//Ñ¡ÖÐ×ÖÄ£ 
	CFont* cjcbakf=pDC->SelectObject(&cjcf); 
	pDC->SetBkMode(TRANSPARENT);          //É趨ÏÔʾ·½Ê½ 
	pDC->SetTextColor(p_GraphPara->GetColor(ColorPen)); //É趨Îı¾ÑÕÉ« 
	ls1=(const char *)c_Text;                     //Îı¾ÄÚÈÝ 
	cd=strlen(ls1);                       //Îı¾×Ö·û³¤¶È 
	while(cd>0)  //»æ³öËùÓеÄ×Ö·û 
	{ 
		c1=*ls1; 
		c2=*(ls1+1); 
		if(c1>127&&c2>127)  //Èç¹ûÊÇÒ»¸öºº×Ö 
		{ 
			strncpy(bz,ls1,2);//¿½±´Ò»¸öºº×Öµ½bzÖÐ 
			bz[2]=0; 
			ls1=ls1+2;        //Ìø¹ýºº×ÖÖ¸ÏòÏÂÒ»¸ö×Ö·ûλÖà 
			pDC->TextOut(cc1,cc2,bz); //ÔÚÆÁÄ»ÉÏдÕâ¸öºº×Ö 
			cd=cd-2;                  //×Ö·ûÊý¼õ2 
			//ÏÂÒ»¸ö×Ö·ûµÄÏÔʾλÖà 
			x1=x1+(m_TextWide*2+m_OffWide)*(float)cos(ang1); 
			y1=y1+(m_TextWide*2+m_OffWide)*(float)sin(ang1); 
			//ÏÂÒ»¸ö×Ö·ûÏÔʾλÖÃµÄÆÁÄ»×ø±ê 
			DPtoVP(x1,y1,&cc1,&cc2); 
		} 
		else //Èç¹ûÊÇÒ»¸öÎ÷ÎÄ×Ö·û 
		{ 
			strncpy(bz,ls1,1);       //¿½±´Ò»¸ö×Ö·ûµ½bzÖÐ 
			bz[1]=0; 
			ls1++;                   //Ìø¹ýÕâÒ»¸ö×Ö·ûµ½ÏÂÒ»¸ö×Ö·û 
			pDC->TextOut(cc1,cc2,bz);//ÔÚÆÁÄ»ÉÏд×Ö·û 
			cd=cd-1;                 //×Ö·ûÊý¼õ1 
			//ÏÂÒ»¸ö×Ö·ûµÄÏÔʾλÖõÄʵ¼Ê×ø±ê 
 
			x1=x1+(m_TextWide+m_OffWide/2)*(float)cos(ang1); 
			y1=y1+(m_TextWide+m_OffWide/2)*(float)sin(ang1); 
			//ÏÂÒ»¸ö×Ö·ûÏÔʾλÖÃµÄÆÁÄ»×ø±ê 
			DPtoVP(x1,y1,&cc1,&cc2); 
		} 
	}  
	pDC->SelectObject(cjcbakf);//»Ö¸´×ÖÄ£ 
} 
 
void CText::GetRect(float *minX,float *minY,float *maxX,float *maxY) 
{ 
	float x[4],y[4]; 
	double ang=pi*m_Angle1/180; 
	x[0]=m_StartX; 
	y[0]=m_StartY; 
	x[1]=m_StartX+(float)((m_TextWide+m_OffWide)*m_TextLong*cos(ang)); 
	y[1]=m_StartY+(float)((m_TextWide+m_OffWide)*m_TextLong*sin(ang)); 
	x[2]=x[1]-(float)(sin(ang)*m_TextHeight); 
	y[2]=y[1]+(float)(cos(ang)*m_TextHeight); 
	x[3]=m_StartX-(float)(sin(ang)*m_TextHeight); 
	y[3]=m_StartY+(float)(cos(ang)*m_TextHeight); 
	*minX=m_StartX; 
	*minY=m_StartY; 
	*maxX=m_StartX; 
	*maxY=m_StartY; 
	for(int i=1;i<4;i++) 
	{ 
		if(*minX>x[i])*minX=x[i]; 
		if(*minY>y[i])*minY=y[i]; 
		if(*maxX=x1&&x<=x2&&y>=y1&&y<=y2)) 
		return FALSE;			//Èç¹ûµã²»ÔÚ±ß½ç¾ØÐÎÄÚ,¼ÌÐøÅжÏÏÂÒ»¸öͼÐÎÔªËØ 
	float ang=(float)pi*m_Angle1/180; 
	XY[0].x=m_StartX; 
	XY[0].y=m_StartY; 
	XY[1].x=m_StartX+(float)((m_TextWide+m_OffWide)*m_TextLong*cos(ang)); 
	XY[1].y=m_StartY+(float)((m_TextWide+m_OffWide)*m_TextLong*sin(ang)); 
	XY[2].x=XY[1].x-(float)(sin(ang)*m_TextHeight); 
	XY[2].y=XY[1].y+(float)(cos(ang)*m_TextHeight); 
	XY[3].x=m_StartX-(float)(sin(ang)*m_TextHeight); 
	XY[3].y=m_StartY+(float)(cos(ang)*m_TextHeight); 
	if(PointRgn(x,y,4,XY,blc))    //Èç¹ûµãÔÚ·â±ÕÇøÓòÄÚ 
		return TRUE; 
	return FALSE; //ûÓÐÑ¡ÖÐÁ¬ÐøÖ±Ïß»ò·â±ÕÇøÓò£¬·µ»Ø0 
} 
 
void CText::Serialize(CArchive& ar) 
{ 
	CDraw::Serialize(ar); 
	if(ar.IsStoring()) 
	{ 
		ar<>m_StartX>>m_StartY>>m_Angle1>>m_Angle2>>m_TextHeight; 
		ar>>m_TextWide>>m_OffWide>>m_TextFont>>m_TextLong; 
		ar>>c_Text; 
	} 
} 
 
void CText::Save(CFile* file,BOOL Yn) 
{ 
	//char *p; 
	CDraw::Save(file,Yn); 
	if(Yn) 
	{ 
		file->Write((unsigned char *)&m_StartX,sizeof(m_StartX)); 
		file->Write((unsigned char *)&m_StartY,sizeof(m_StartY)); 
		file->Write((unsigned char *)&m_Angle1,sizeof(m_Angle1)); 
		file->Write((unsigned char *)&m_Angle2,sizeof(m_Angle2)); 
		file->Write((unsigned char *)&m_TextHeight,sizeof(m_TextHeight)); 
		file->Write((unsigned char *)&m_TextWide,sizeof(m_TextWide)); 
		file->Write((unsigned char *)&m_OffWide,sizeof(m_OffWide)); 
		file->Write((unsigned char *)&m_TextFont,sizeof(m_TextFont)); 
		file->Write((unsigned char *)&m_TextLong,sizeof(m_TextLong)); 
		file->Write((unsigned char *)&c_Text,m_TextLong); 
	} 
	else 
	{ 
		file->Read((unsigned char *)&m_StartX,sizeof(m_StartX)); 
		file->Read((unsigned char *)&m_StartY,sizeof(m_StartY)); 
		file->Read((unsigned char *)&m_Angle1,sizeof(m_Angle1)); 
		file->Read((unsigned char *)&m_Angle2,sizeof(m_Angle2)); 
		file->Read((unsigned char *)&m_TextHeight,sizeof(m_TextHeight)); 
		file->Read((unsigned char *)&m_TextWide,sizeof(m_TextWide)); 
		file->Read((unsigned char *)&m_OffWide,sizeof(m_OffWide)); 
		file->Read((unsigned char *)&m_TextFont,sizeof(m_TextFont)); 
		file->Read((unsigned char *)&m_TextLong,sizeof(m_TextLong)); 
		c_Text.Empty(); 
	/*	p=new char[m_TextLong+1]; 
		file->Read((unsigned char *)&p,m_TextLong); 
		CString Text(p,m_TextLong); 
		delete p; 
		c_Text=Text;*/ 
	} 
} 
 
void CText::toChar(char *p_Char) 
{ 
	char p1[101]; 
	CDraw::toChar(p_Char); 
	sprintf(p1,"%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%4d,%3d\n", 
	m_StartX,m_StartY,m_Angle1,m_Angle2,m_TextHeight,m_TextWide,m_OffWide, 
	m_TextLong,(int)m_TextFont); 
	p1[100]=0; 
	lstrcat(p_Char,p1); 
	strncat(p_Char,(const char *)c_Text,m_TextLong); 
} 
 
char *CText::toData(char *p_Char) 
{ 
	char p1[101],*pp; 
	p_Char=CDraw::toData(p_Char); 
	strncpy(p1,p_Char,100); 
	p_Char+=100; 
	p1[100]=0; 
	sscanf(p1,"%f,%f,%f,%f,%f,%f,%f,%d,%d\n", 
	&m_StartX,&m_StartY,&m_Angle1,&m_Angle2,&m_TextHeight,&m_TextWide,&m_OffWide, 
	&m_TextLong,&m_TextFont); 
	pp=p_Char; 
	p_Char+=m_TextLong; 
	pp[m_TextLong]=0; 
	c_Text=pp; 
	return p_Char; 
} 
 
int CText::GetLong() 
{ 
	return m_TextLong; 
} 
 
void CText::Move(float x_Move,float y_Move) 
{ 
	m_StartX+=x_Move; 
	m_StartY+=y_Move; 
} 
 
void CDrawDoc::DeleteContents()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	int nn=m_LineArray.GetSize(); 
	while(nn--) 
		delete m_LineArray.GetAt(nn); 
	m_LineArray.RemoveAll(); 
	nn=m_PLineArray.GetSize(); 
	while(nn--) 
		delete m_PLineArray.GetAt(nn); 
	m_PLineArray.RemoveAll(); 
	nn=m_CircleArray.GetSize(); 
	while(nn--) 
		delete m_CircleArray.GetAt(nn); 
	m_CircleArray.RemoveAll(); 
	nn=m_ArcArray.GetSize(); 
	while(nn--) 
		delete m_ArcArray.GetAt(nn); 
	m_ArcArray.RemoveAll(); 
	nn=m_TextArray.GetSize(); 
	while(nn--) 
		delete m_TextArray.GetAt(nn); 
	m_TextArray.RemoveAll(); 
	COleDocument::DeleteContents(); 
} 
 
BOOL CDrawDoc::GetRect(float * m_Xmin, float * m_Ymin, float * m_Xmax, float * m_Ymax) 
{ 
	float m_minX,m_minY,m_maxX,m_maxY; 
	BOOL pb; 
	int nn=GetNumbLines(); 
	pb=0; 
	while(nn--) 
	{ 
		pb=1; 
		GetLine(nn)->GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		if(*m_Xmin>m_minX)	*m_Xmin=m_minX; 
		if(*m_Xmaxm_minY)	*m_Ymin=m_minY; 
		if(*m_YmaxGetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		if(*m_Xmin>m_minX)	*m_Xmin=m_minX; 
		if(*m_Xmaxm_minY)	*m_Ymin=m_minY; 
		if(*m_YmaxGetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		if(*m_Xmin>m_minX)	*m_Xmin=m_minX; 
		if(*m_Xmaxm_minY)	*m_Ymin=m_minY; 
		if(*m_YmaxGetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		if(*m_Xmin>m_minX)	*m_Xmin=m_minX; 
		if(*m_Xmaxm_minY)	*m_Ymin=m_minY; 
		if(*m_YmaxGetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		if(*m_Xmin>m_minX)	*m_Xmin=m_minX; 
		if(*m_Xmaxm_minY)	*m_Ymin=m_minY; 
		if(*m_YmaxIsPoint(x,y,jl,blc)) 
		{ 
			*Index=nn; 
			*Lb=2; 
			*pbh=GetPLine(nn)->GetID();			 
			return TRUE; 
		} 
	} 
	nn=GetNumbCircles(); 
	while(nn--) 
	{ 
		if(GetCircle(nn)->IsPoint(x,y,jl)) 
		{ 
			*Index=nn; 
			*Lb=3; 
			*pbh=GetCircle(nn)->GetID();			 
			return TRUE; 
		} 
	} 
	nn=GetNumbLines(); 
	while(nn--) 
	{ 
		if(GetLine(nn)->IsPoint(x,y,jl)) 
		{ 
			*Index=nn; 
			*Lb=1; 
			*pbh=GetLine(nn)->GetID();			 
			return TRUE; 
		} 
	} 
	nn=GetNumbArcs(); 
	while(nn--) 
	{ 
		if(GetArc(nn)->IsPoint(x,y,jl)) 
		{ 
			*Index=nn; 
			*Lb=4; 
			*pbh=GetArc(nn)->GetID();			 
			return TRUE; 
		} 
	} 
	nn=GetNumbTexts(); 
	while(nn--) 
	{ 
		if(GetText(nn)->IsPoint(x,y,jl,blc)) 
		{ 
			*Index=nn; 
			*Lb=5; 
			*pbh=GetText(nn)->GetID();			 
			return TRUE; 
		} 
	} 
	 
	return FALSE; 
} 
 
void CDrawDoc::OnUpdateSelectClear(CCmdUI* pCmdUI)  
{ 
	if(n_GraphSelect>0) 
		pCmdUI->Enable(TRUE); 
	else 
		pCmdUI->Enable(FALSE); 
} 
 
BOOL CDrawDoc::AddSelectList(int Lb, int Index,int Pbh) 
{ 
	for(int i=0;iGetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		else if(GraphSelect[i].Lb==2)	//Á¬ÐøÖ±Ïß 
		{ 
			CPline* p_Pline=GetPLine(GraphSelect[i].Index); 
			p_Pline->GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
			LongChar+=p_Pline->GetNumb()*26; 
		} 
		else if(GraphSelect[i].Lb==3)	//Ô² 
			GetCircle(GraphSelect[i].Index)->GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		else if(GraphSelect[i].Lb==4)	//Ô²»¡ 
			GetArc(GraphSelect[i].Index)->GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
		else if(GraphSelect[i].Lb==5)	//Îı¾ 
		{ 
		 
			CText* p_Text=GetText(GraphSelect[i].Index); 
			p_Text->GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); 
			LongChar+=p_Text->GetLong(); 
		} 
		if(i==0) 
		{ 
			minX=m_minX;  
			minY=m_minY; 
		} 
		else 
		{ 
			if(minX>m_minX)	minX=m_minX; 
			if(minY>m_minY)	minY=m_minY; 
		} 
	}		 
	 
	HMem=(char *)::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,LongChar+1); 
	if(HMem==NULL) 
	{ 
		return FALSE; 
	} 
	p_Char=new char[LongChar+1]; 
	if(p_Char==NULL) 
	{ 
		return FALSE; 
	} 
	sprintf(p1,"%4d,%4d,%4d,%4d,%4d\n",n_Num[0],n_Num[1],n_Num[2],n_Num[3],n_Num[4]); 
	//µÃµ½¸÷ÖÖͼÐÎÔªËØµÄÊýÁ¿ 
	strcpy(p_Char,p1); 
	sprintf(p1,"%12.4f,%12.4f\n",minX,minY); 
	strcat(p_Char,p1); 
	for(int j=0;j<5;j++) 
	{ 
		for(i=0;itoChar(p_Char); 
			else if(GraphSelect[i].Lb==2&&j==1)	//Á¬ÐøÖ±Ïß 
				GetPLine(GraphSelect[i].Index)->toChar(p_Char); 
			else if(GraphSelect[i].Lb==3&&j==2)	//Ô² 
				GetCircle(GraphSelect[i].Index)->toChar(p_Char); 
			else if(GraphSelect[i].Lb==4&&j==3)	//Ô²»¡ 
				GetArc(GraphSelect[i].Index)->toChar(p_Char); 
			else if(GraphSelect[i].Lb==5&&j==4)	//Îı¾ 
				GetText(GraphSelect[i].Index)->toChar(p_Char); 
		} 
	} 
 
	pMem=(char *)::GlobalLock(HMem); 
	if(pMem==NULL) 
	{ 
		delete p_Char; 
		return FALSE; 
	} 
	::lstrcpy(pMem,p_Char); 
	::GlobalUnlock(HMem); 
	if(!OpenClipboard(NULL)) 
	{ 
		delete p_Char; 
		return FALSE; 
	} 
	::EmptyClipboard(); 
	::SetClipboardData(DrawFormat,HMem); 
	HMem=0; 
	::CloseClipboard(); 
	delete p_Char; 
	return TRUE; 
} 
 
BOOL CDrawDoc::ReadClipBoard(float x,float y) 
{ 
	char p1[30]; 
	int n_Num[5]; 
	float minX,minY; 
	HANDLE HClipText; 
	char *PClipText; 
	char *CharTemp,*p_Char; 
	OpenClipboard(NULL); 
	HClipText=::GetClipboardData(DrawFormat); 
	if(HClipText==NULL) 
	{ 
		return FALSE; 
	} 
	CharTemp=new char[::GlobalSize(HClipText)]; 
	if(CharTemp==0) 
	{ 
		::CloseClipboard(); 
		return FALSE; 
	} 
	PClipText=(char *)::GlobalLock(HClipText); 
	if(PClipText==NULL) 
	{ 
		return FALSE; 
	} 
	::lstrcpy(CharTemp,PClipText); 
	::GlobalUnlock(HClipText); 
	::CloseClipboard(); 
	p_Char=CharTemp; 
 
	//µÃµ½¸÷ÖÖͼÐÎÔªËØµÄÊýÁ¿ 
	strncpy(p1,p_Char,25); 
	p_Char+=25; 
	p1[25]=0; 
	sscanf(p1,"%d,%d,%d,%d,%d\n",&n_Num[0],&n_Num[1],&n_Num[2],&n_Num[3],&n_Num[4]); 
	 
	strncpy(p1,p_Char,26); 
	p_Char+=26; 
	p1[26]=0; 
	sscanf(p1,"%f,%f\n",&minX,&minY); 
	minX=x-minX; 
	minY=y-minY; 
	for(int i=0;i<5;i++) 
	{ 
		for(int j=0;jtoData(p_Char); 
				p_Line->Move(minX,minY); 
			} 
			else if(i==1) 
			{ 
				CPline *p_PLine=new CPline(); 
				m_PLineArray.Add(p_PLine); 
				p_Char=p_PLine->toData(p_Char); 
				p_PLine->Move(minX,minY); 
			} 
			else if(i==2) 
			{ 
				CCircle *p_Circle=new CCircle(); 
				m_CircleArray.Add(p_Circle); 
				p_Char=p_Circle->toData(p_Char); 
				p_Circle->Move(minX,minY); 
			} 
			else if(i==3) 
			{ 
				CArc *p_Arc=new CArc(); 
				m_ArcArray.Add(p_Arc); 
				p_Char=p_Arc->toData(p_Char); 
				p_Arc->Move(minX,minY); 
			} 
			else if(i==4) 
			{ 
				CText *p_Text=new CText(); 
				m_TextArray.Add(p_Text); 
				p_Char=p_Text->toData(p_Char); 
				p_Text->Move(minX,minY); 
			} 
			GraphSelect[n_GraphSelect++].Index=GetMaxIndex(i+1); 
		} 
	} 
	delete []CharTemp; 
	return TRUE; 
} 
 
 
void CDrawDoc::OnCloseDocument()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	COleDocument::OnCloseDocument(); 
} 
 
BOOL CDrawDoc::OnOpenDocument(LPCTSTR lpszPathName)  
{ 
	if (!COleDocument::OnOpenDocument(lpszPathName)) 
		return FALSE; 
	// TODO: Add your specialized creation code here 
	return TRUE; 
} 
 
BOOL CDrawDoc::AddUndo(float sx, float sy, float blc) 
{ 
	long l; 
	l=m_UndoList[n_CurUnIndex].l_Start;	//µÃµ½ÔÚÎļþÖÐµÄÆðµã 
	Fundo.Seek(0,l); 
	Fundo.Write((unsigned char *)&sx,sizeof(sx)); 
	Fundo.Write((unsigned char *)&sy,sizeof(sy)); 
	Fundo.Write((unsigned char *)&blc,sizeof(blc)); 
	m_UndoList[n_CurUnIndex].Lb=1;	//ͼÐÎÆÁÄ»±ä»¯²Ù×÷ 
	n_CurUnIndex++; 
	m_UndoList[n_CurUnIndex].Index=l+3*sizeof(float); 
	return TRUE; 
} 
 
BOOL CDrawDoc::AddUndo(int Lb, int Numble, GraphSelectStruct * GraphList) 
{ 
	long l; 
	l=m_UndoList[n_CurUnIndex].l_Start;	//µÃµ½ÔÚÎļþÖÐµÄÆðµã 
	Fundo.Seek(l,0); 
	for(int i=0;iGetID()]=1; 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(m_Index[i]==0) 
			return i; 
	} 
	return -1; 
} 
 
int CDrawDoc::GetPLineId() 
{ 
	int nn=m_PLineArray.GetUpperBound(); 
	for(int i=0;i<20000;i++) 
		m_Index[i]=0; 
	for(i=0;i<=nn;i++) 
	{ 
		if(GetPLine(i)) 
			m_Index[GetPLine(i)->GetID()]=1; 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(m_Index[i]==0) 
			return i; 
	} 
	return -1; 
} 
 
int CDrawDoc::GetArcId() 
{ 
	int nn=m_ArcArray.GetUpperBound(); 
	for(int i=0;i<20000;i++) 
		m_Index[i]=0; 
	for(i=0;i<=nn;i++) 
	{ 
		if(GetArc(i)) 
			m_Index[GetArc(i)->GetID()]=1; 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(m_Index[i]==0) 
			return i; 
	} 
	return -1; 
} 
 
int CDrawDoc::GetTextId() 
{ 
	int nn=m_TextArray.GetUpperBound(); 
	for(int i=0;i<20000;i++) 
		m_Index[i]=0; 
	for(i=0;i<=nn;i++) 
	{ 
		if(GetText(i)) 
			m_Index[GetText(i)->GetID()]=1; 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(m_Index[i]==0) 
			return i; 
	} 
	return -1; 
} 
 
int CDrawDoc::GetCircleId() 
{ 
	int nn=m_CircleArray.GetUpperBound(); 
	for(int i=0;i<20000;i++) 
		m_Index[i]=0; 
	for(i=0;i<=nn;i++) 
	{ 
		if(GetCircle(i)) 
			m_Index[GetCircle(i)->GetID()]=1; 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(m_Index[i]==0) 
			return i; 
	} 
	return -1; 
} 
 
void CDrawDoc::OnEditUndo() 
{ 
	int i,Numble; 
	if(n_CurUnIndex<=0) 
		return; 
	if(m_UndoList[n_CurUnIndex-1].Lb==2)//Èç¹ûÔ­À´ÊÇÔö¼Ó²Ù×÷ 
	{ 
		Numble=m_UndoList[n_CurUnIndex-1].Index; 
		Fundo.Seek(m_UndoList[n_CurUnIndex-1].l_Start,0); 
		for(i=0;i=0;i--) 
		{ 
			int Lb=GraphSelect[i].Lb; 
			if(Lb==1) 
			{ 
				delete GetLine(GraphSelect[i].Index); 
				m_LineArray.RemoveAt(GraphSelect[i].Index); 
			} 
			else if(Lb==2) 
			{ 
				delete GetPLine(GraphSelect[i].Index); 
				m_PLineArray.RemoveAt(GraphSelect[i].Index); 
			} 
			else if(Lb==3) 
			{ 
				delete GetCircle(GraphSelect[i].Index); 
				m_CircleArray.RemoveAt(GraphSelect[i].Index); 
			} 
			else if(Lb==4) 
			{ 
				delete GetArc(GraphSelect[i].Index); 
				m_ArcArray.RemoveAt(GraphSelect[i].Index); 
			} 
			else if(Lb==5) 
			{ 
				delete GetText(GraphSelect[i].Index); 
				m_TextArray.RemoveAt(GraphSelect[i].Index); 
			} 
		} 
	} 
	if(m_UndoList[n_CurUnIndex-1].Lb==3)//Èç¹ûÔ­À´ÊÇɾ³ý²Ù×÷ 
	{ 
		Numble=m_UndoList[n_CurUnIndex-1].Index; 
		Fundo.Seek(m_UndoList[n_CurUnIndex-1].l_Start,0); 
		for(i=0;iDelete(0); 
			else if(Lb==2) 
				GetPLine(GraphSelect[i].Index)->Delete(0); 
			else if(Lb==3) 
				GetCircle(GraphSelect[i].Index)->Delete(0); 
			else if(Lb==4) 
				GetArc(GraphSelect[i].Index)->Delete(0); 
			else if(Lb==5) 
				GetText(GraphSelect[i].Index)->Delete(0); 
		} 
	} 
	n_CurUnIndex--; 
	UpdateAllViews(NULL); 
} 
 
BOOL CDrawDoc::OnSaveDocument(LPCTSTR lpszPathName)  
{ 
	return COleDocument::OnSaveDocument(lpszPathName); 
} 
 
void CDrawDoc::OnUpdateEditUndo(CCmdUI* pCmdUI)  
{ 
	if(n_CurUnIndex>0) 
		pCmdUI->Enable(TRUE); 
	else 
		pCmdUI->Enable(FALSE); 
} 
 
CDataBaseSet* CDrawDoc::GetDataSet(int Index) 
{ 
	CDataBaseSet *m_pSet; 
	if(Index<0||Index>=m_NumbData) 
		return NULL; 
	short ID=DataInfo[Index].only_ID; 
	switch(ID) 
	{ 
		case 1: 
			m_pSet=&m_data1; 
			break; 
		case 2: 
			m_pSet=&m_data2; 
			break; 
/*		case 3: 
			m_pSet=&m_data3; 
			break; 
		case 4: 
			m_pSet=&m_data4; 
			break; 
		case 5: 
			m_pSet=&m_data5; 
			break; 
		case 6: 
			m_pSet=&m_data6; 
			break;*/ 
		default: 
			m_pSet=NULL; 
	} 
	return m_pSet; 
} 
 
short CDrawDoc::GetDataID(int Index) 
{ 
	if(Index<0||Index>=m_NumbData) 
		return -1; 
	return DataInfo[Index].only_ID; 
} 
 
short CDrawDoc::GetDataIndex(int ID) 
{ 
	for(int i=0;im_X2) 	//½«µÚÒ»ÌõÖ±Ï߶εÄÁ½¸ö¶¥µã°´ºá×ø±êÓÉСµ½´óÅÅÐò 
	{ 
		xx1=m_X2; 
		xx2=m_X1; 
		yy1=m_Y2; 
		yy2=m_Y1; 
	} 
	else 
	{ 
		xx1=m_X1; 
		xx2=m_X2; 
		yy1=m_Y1; 
		yy2=m_Y2; 
	} 
	if(xx1==xx2&&yy1==yy2)	//Èç¹ûµÚÒ»ÌõÖ±ÏßÊÇÒ»¸öµã£¬·µ»Ø0£¨²»Ïཻ£© 
		return 0; 
	 
	if(line1->m_X1>line1->m_X2) 	//½«µÚÒ»ÌõÖ±Ï߶εÄÁ½¸ö¶¥µã°´ºá×ø±êÓÉСµ½´óÅÅÐò 
	{ 
		x1=line1->m_X2; 
		x2=line1->m_X1; 
		y1=line1->m_Y2; 
		y2=line1->m_Y1; 
	} 
	else 
	{ 
		x1=line1->m_X1; 
		x2=line1->m_X2; 
		y1=line1->m_Y1; 
		y2=line1->m_Y2; 
	} 
 
	if(x1==x2&&y1==y2)	//Èç¹ûµÚ¶þÌõÖ±ÏßÊÇÒ»¸öµã·µ»Ø0£¨²»Ïཻ£© 
		return 0; 
 
	if(x1==x2&&xx1==xx2) 	//Á½ÌõÖ±Ïß¶¼ÊÇÊúÖ±Ïß 
	{ 
		if(x1!=xx1) 	//Á½¸öƽÐÐÊúÖ±Ïߵĺá×ø±ê²»Í¬£¬Á½ÌõÖ±Ï߶β»Ïཻ£¬º¯Êý·µ»Ø0 
			return 0;	 
		*xxx1=x1;		//µÃµ½½»µãµÄºá×ø±ê 
		n1=min(yy1,yy2);	//µÚÒ»ÌõÖ±Ï߶εÄ×îС×Ý×ø±ê 
		n2=max(yy1,yy2);	//µÚÒ»ÌõÖ±Ï߶εÄ×î´ó×Ý×ø±ê 
		n3=min(y1,y2);		//µÚ¶þÌõÖ±Ï߶εÄ×îС×Ý×ø±ê 
		n4=max(y1,y2);		//µÚ¶þÌõÖ±Ï߶εÄ×î´ó×Ý×ø±ê 
		if(n1>n4||n2=xx1&&x1<=xx2))	//Èç¹û½»µãºá×ø±êûÓÐÔÚµÚÒ»ÌõÖ±Ïߵĺá×ø±ê·¶Î§ÄÚ£¬²»Ïཻ 
			return 0; 
		*yyy1=yy1+(x1-xx1)/(xx2-xx1)*(yy2-yy1);	//¼ÆËãµÃµ½½»µãµÄ×÷×ø±ê 
		if(*yyy1>=y1&&*yyy1<=y2||*yyy1>=y2&&*yyy1<=y1)	//½»µã×Ý×ø±êÔÚµÚ¶þÖ±Ïß×Ý×ø±ê·¶Î§ 
			return 1;		//·µ»Ø1£¬ÓÐÒ»¸ö½»µã 
		else 	//½»µã×Ý×ø±êûÓÐÔÚµÚ¶þÖ±Ïß×Ý×ø±ê·¶Î§ÄÚ 
			return 0;		//·µ»Ø0£¬Á½ÌõÖ±Ïß²»Ïཻ 
	} 
	else if(x1!=x2&&xx1==xx2)	//Èç¹ûµÚÒ»ÌõÖ±ÏßÊÇÊúÖ±Ïߣ¬µÚ¶þÌõÖ±ÏßÊÇбÏß 
	{ 
		*xxx1=x1; 
		if(!(xx1>=x1&&xx1<=x2))  
			return 0; 
		*yyy1=y1+(xx1-x1)/(x2-x1)*(y2-y1); 
		if(*yyy1>=yy1&&*yyy1<=yy2||*yyy1>=yy2&&*yyy1<=yy1) 
			return 1;//Ïཻ 
		else  
			return 0; 
	} 
	else //Èç¹ûÁ½ÌõÖ±Ïß¶¼ÊÇбÏß 
	{ 
		//µÃµ½Á½ÌõÖ±ÏßµÄбÂÊ 
		k1=(y2-y1)/(x2-x1); 
		k2=(yy2-yy1)/(xx2-xx1); 
		if(k1==k2) //Èç¹ûÁ½ÌõÖ±Ï߯½ÐÐ 
		{ 
			if(x1>xx2||x2=x1&&*xxx1<=x2)&&(*xxx1>=xx1&&*xxx1<=xx2)) 
				return 1;	//ÓÐÒ»¸ö½»µã 
			else //Èç¹û½»µãºá×ø±ê²»È«ÔÚÁ½ÌõÖ±Ï߶εĺá×ø±ê·¶Î§ÄÚ 
				return 0; 
		} 
	} 
	return 0; 
} 
 
 
	int CPline::LineRgn(CLine* line1,int *nCross,PointStruct* Pointxy1) 
	{ 
		int pb,sm,pb1; 
		float x1,y1,x2,y2; 
		float xx1,yy1,xx2,yy2; 
		CLine line2; 
		xx1=line1->m_X1; 
		yy1=line1->m_Y1; 
		xx2=line1->m_X2; 
		yy2=line1->m_Y2; 
		//¼ÓÉÏÒ»¸ö¶¥µã£¬ÐγɱպÍÇøÓò 
		m_PointList[m_Numble].x=m_PointList[0].x; 
		m_PointList[m_Numble].y=m_PointList[0].y; 
		//½«Á¬ÐøÖ±ÏߵĵÚÒ»¸ö¶¥µã×÷ΪµÚÒ»¸ö½»µã 
		Pointxy1[0].x=xx1; 
		Pointxy1[0].y=yy1; 
		sm=1; 	//½»µãµÄÊýĿΪ1£¬Ö±Ïߵįðµã×÷ΪµÚÒ»¸ö½»µã 
		 
		for(int i=0;i=1)	//Èç¹ûÓн»µã£¬½«µÚÒ»¸ö½»µãµÄ×ø±ê¼Ç¼ÔڽṹָÕëPointxy1Ö¸ÏòµÄ½á¹¹Êý×é 
			{ 
				Pointxy1[sm].x=x1;		 
				Pointxy1[sm++].y=y1;	 
			} 
			if(pb==2)	//ÈçÓÐÁ½¸ö½»µã£¬½«µÚ¶þ¸ö½»µãµÄ×ø±ê¼Ç¼ÔÚÖ¸ÕëPointxy1Ö¸ÏòµÄ½á¹¹Êý×é 
			{ 
				Pointxy1[sm].x=x2; 
				Pointxy1[sm++].y=y2; 
			} 
		} 
		//½«Ö±ÏßµÄÖÕµã×÷Ϊ×îºóÒ»¸ö½»µã 
		Pointxy1[sm].x=xx2; 
		Pointxy1[sm++].y=yy2; 
		//ÒÔ϶Խ»µãµÄ×ø±ê½øÐÐÅÅÐò 
		pb=1;//°´ºá×ø±êÅÅÐò 
		if(xx1==xx2) //Èç¹ûÖ±ÏßÊÇÊúÖ±Ïߣ¬°´×Ý×ø±êÅÅÐò 
			pb=2; 
		do  //°´ºá×ø±ê»ò×Ý×ø±êÅÅÐò 
		{ 
			pb1=0; 
			for(i=0;iPointxy1[i+1].x&&xx1xx2) 
					||pb==2&&(Pointxy1[i].y>Pointxy1[i+1].y&&yy1yy2)) 
				{ 
					x1=Pointxy1[i].x; y1=Pointxy1[i].y; 
					Pointxy1[i].x=Pointxy1[i+1].x; Pointxy1[i].y=Pointxy1[i+1].y; 
					Pointxy1[i+1].x=x1; Pointxy1[i+1].y=y1; 
					pb1=1; 
				} 
			} 
		}while(pb1==1);//Ö±µ½ËùÓеĽ»µã¶¼Êǰ´ÕÕºá×ø±ê»ò×Ý×ø±ê˳ÐòÅÅÁÐ 
 
		for(i=0;iLineRgn(&line2,&Numb,Pointxy); 
		for(int j=0;jm_X1-x; 
	y1=line1->m_Y1-y; 
	x2=line1->m_X2-x; 
	y2=line1->m_Y2-y; 
	if(x1==x2) //Èç¹ûÊÇ´¹Ö±Ïß 
	{ 
		if(x1*x1>r*r) 
			return 0; 
		else 
		{ 
			yy=(float)sqrt(r*r-x1*x1);  
			yy1=-yy;  yy2=yy; //µÃµ½Á½¸ö½»µãµÄy×ø±ê 
			//µÃµ½Ï߶εÄ×îСºÍ×î´óy×ø±ê 
			miny=min(y1,y2); maxy=max(y1,y2); 
			if(miny>yy1&&maxy=miny&&yy1<=maxy)//Èç¹ûµÚÒ»¸ö½»µãÔÚÏß¶ÎÉÏ 
			{ 
				*Y1=yy1+y; //·µ»ØµÚÒ»¸ö½»µãµÄ×ø±ê 
				*angle1=(float)pi*3/2; 
				pb=1; 
			} 
			//Èç¹ûµÚ¶þ¸ö½»µãÔÚÏß¶ÎÉÏÇÒµÚ¶þ¸ö½»µã²»µÈµÚÒ»¸ö½»µã 
			if(yy1!=yy2&&yy2>=miny&&yy2<=miny) 
			{ 
				if(pb==1)     //Èç¹ûµÚÒ»¸ö½»µãÒѾ­ÔÚÏß¶ÎÉÏ 
				{ 
					*Y2=yy2+y; 
					*angle2=(float)pi/2; 
					pb=2;                  //Á½¸ö½»µã 
 
				} 
				else                   //Èç¹ûµÚÒ»¸ö½»µã²»ÔÚÏß¶ÎÉÏ 
				{ 
					*Y1=yy2+y;    //Ö»ÓÐÒ»¸ö½»µã£¬·µ»Ø½»µã×ø±ê 
					*angle1=(float)pi/2; 
					pb=1; 
				} 
			} 
			return pb;//·µ»ØÏཻµÄµãÊý 
		} 
	} 
	else    //Èç¹ûÖ±Ïß²»´¹Ö± 
	{ 
		k=(y1-y2)/(x1-x2);  //µÃµ½Ö±ÏßµÄбÂÊ 
		k1=y1-k*x1; 
		k2=4*k*k*k1*k1-4*(k*k+1)*(k1*k1-r*r);//½â·½³ÌʱµÄb2-4ac 
		if(k2<0)return 0; 
		else  // Èç¹ûb*b-4ac,Ö±ÏßÓëÔ²Óн»µã 
		{ 
			//µÃµ½Á½¸ö½»µãµÄ×ø±ê 
			xx1=(-2*k*k1-(float)sqrt(k2))/(2*(k*k+1)); 
			xx2=(-2*k*k1+(float)sqrt(k2))/(2*(k*k+1)); 
			yy1=y1+k*(xx1-x1); 
			yy2=y1+k*(xx2-x1); 
			if(x1>xx1&&x1xx1&&x2=x1&&xx1<=x2||xx1<=x1&&xx1>=x2)//ÅжϵÚÒ»¸ö½»µãÊÇ·ñÔÚÏß¶ÎÉÏ 
			{ 
				*X1=xx1+x; 
				*Y1=yy1+y; 
				*angle1=GetAngle(0,0,xx1,yy1); 
				pb=1; //·µ»ØµÚÒ»¸ö½»µãµÄ×ø±ê 
			} 
			//Èç¹ûÓÐÁ½¸ö½»µã²¢ÇÒµÚ¶þ¸ö½»µãÔÚÖ±Ïß¶ÎÉÏ 
			if(k2!=0&&xx1!=xx2&&xx2>=x1&&xx2<=x2||xx2<=x1&&xx2>=x2) 
			{ 
				if(pb==1) //Èç¹ûµÚÒ»¸ö½»µãÒѾ­ÔÚÏß¶ÎÉÏ£¬ÔòÓÐÁ½¸ö½»µã 
				{ 
					*X2=xx2+x;*Y2=yy2+y;pb=2; //·µ»ØµÚ¶þ¸ö½»µãµÄ×ø±ê 
					*angle2=GetAngle(0,0,xx2,yy2); 
				} 
				else      //Èç¹ûµÚÒ»¸ö½»µã²»ÔÚÏß¶ÎÉÏ 
				{ 
					*X1=xx2+x;*Y1=yy2+y; 
					*angle1=GetAngle(0,0,xx2,yy2); 
					pb=1; 
 
				} 
			} 
			return pb; //·µ»Ø½»µãÊýÄ¿ 
		} 
	} 
	return 0; 
} 
 
int CArc::ArcLine(CLine *line1, float *angle1, float *angle2, float *X1, float *Y1, float *X2, float *Y2) 
{ 
	float x1,y1,x2,y2; 
	float angl1,angl2; 
	int pb,pb1; 
	//µ÷Óú¯ÊýµÃµ½Ô²ºÍÏ߶εĽ»µãÊýÄ¿ºÍ½»µãµÄ×ø±ê 
	pb=CircleLine(line1,&angl1,&angl2,&x1,&y1,&x2,&y2); 
	pb1=0; 
	if(pb==0||pb==3) // Ô²ÓëÏ߶β»Ïཻ£¬Ôò»¡ÓëÏß¶ÎÒ²²»Ïཻ 
		return 0; 
	else     //Ô²ÓëÖ±ÏßÓн»µã 
	{ 
		//Èç¹ûÕâ¸ö½»µãµÄ»¡¶ÈÔÚÔ²»¡µÄ·¶Î§ÄÚ 
		if(IsInArc(angl1)) 
		{ 
			pb1=1;      //ÓÐÒ»¸ö½»µã 
			*angle1=angl1; //µÚÒ»¸ö½»µãµÄ»¡¶È 
			*X1=x1;	*Y1=y1;		 
		} 
		if(pb==2)     //Èç¹ûÓÐÁ½¸ö½»µã 
		{ 
			//Èç¹ûÕâ¸ö½»µãµÄ»¡¶ÈÔÚÔ²»¡µÄ·¶Î§ÄÚ 
			if(IsInArc(angl2)) 
			{ 
				if(pb1==1)  
				{ 
					*X2=x2;	*Y2=y2; 
					*angle2=angl2;//Èç¹ûÕâÊǵڶþ¸ö½»µã 
				} 
				else          //Èç¹ûÕâÊÇÔ²»¡ÓëÖ±ÏߵĵÚÒ»¸ö½»µã 
				{ 
					*angle1=angl2; //·µ»Ø½»µãµÄ»¡¶È 
					*X1=x2;	*Y1=y2; 
				} 
				pb1++; //Ô²»¡ÓëÖ±Ïß½»µãµÄÊýÄ¿ 
			} 
		}   
		return pb1; //·µ»Ø½»µãÊýÄ¿ 
	} 
	return 0; 
} 
 
float CDraw::GetAngle(float x, float y, float xx, float yy) 
{ 
	float r,ang; 
	if(x==xx&&y==yy) 
		return 0; 
	if(x==xx) //Èç¹ûÁ¬½ÓÁ½µãµÄÖ±Ïß´¹Ö± 
	{ 
		if(yy>y) 
			ang=(float)(pi/2);   //YÖáÕý·½Ïò 
		else 
			ang=(float)(pi*3/2); //YÖḺ·½Ïò 
		return ang; 
	}  
	else 
	{ 
		r=(float)sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y));//µÃµ½Á½µãµÄ¾àÀë 
		ang=(float)acos((xx-x)/r);                 //µÃµ½»¡¶È 
		if(yym_Angle1; 
	angl2=arc1->m_Angle2; 
	angle[numb++]=angl1; //½«Ô²»¡µÄÆðʼ»¡¶È×÷ΪµÚÒ»¸öÏཻ»¡¶È 
	m_PointList[m_Numble].x=m_PointList[0].x; 
	m_PointList[m_Numble].y=m_PointList[0].y; 
	for(i=0;iArcLine(&line1,&ang1,&ang2,&x1,&y1,&x2,&y2); //¼ÆËãÔ²»¡ÓëÖ±ÏߵĽ»µã 
		if(nn>=1)   //Èç¹û´æÔÚ½»µã 
		{ 
			angle[numb++]=ang1; //½«½»µãµÄ»¡¶È´æÊý×éangle 
			if(nn==2)  //Èç¹ûÓÐÁ½¸ö½»µãµÄ»°   
				angle[numb++]=ang2; 
		} 
	} 
	angle[numb++]=angl2;//Ô²»¡µÄÖÕµã×÷Ϊ×îºóÒ»¸ö½»µã 
	//Èç¹û»¡ÊÇ¿çXÖáÕýÏòµÄ£¬XÖáÕýÏòµ½½áÊø²¿·ÖµÄ»¡¶ÈÖµ¼Ó2pi£¬ÒÔÀûÓÚÅÅÐò 
	if(angl1>angl2) 
	{ 
		for(i=0;i=0&&angle[i]<=angl2) 
				angle[i]=(float)pi*2+angle[i]; 
		} 
	} 
		//ÒÔ϶ÔangleÊý×éÖеĻ¡¶ÈÖµ½øÐÐÅÅÐò 
	do 
	{ 
		pb=0; 
		for(i=0;iangle[i+1])//Èç¹û˳ÐòÏà·´     
			{ 
				pb=1; 
				ang1=angle[i]; angle[i]=angle[i+1];angle[i+1]=ang1; 
			}  
		} 
	}while(pb==1);//Èç¹û»¹Óе¹ÐòµÄ£¬ÔÙ½øÐÐÑ­»·±È½Ï 
	pb=0; 
	for(i=0;im_CircleX+arc1->m_CircleR*(float)cos(ang1);  
		y1=arc1->m_CircleY+arc1->m_CircleR*(float)sin(ang1); 
		if(PointRgn(x1,y1,m_Numble,m_PointList,1)) //Èç¹ûÖмäµãÔÚ¶à±ßÐÎÇøÓòÄÚ 
			Pointxy1[i].z=1; 
		else 
			Pointxy1[i].z=0; 
	}   
	Pointxy1[numb-1].x=angle[numb-1]; //×îºóÒ»¸ö½»µãµÄ»¡¶ÈÖµ 
	*nCross=numb; 
	if(numb==2)	//Èç¹ûÖ»ÓÐÁ½¸ö¶¥µã£¬¼´Ô²»¡Óë¶à±ßÐα߲»Ïཻ 
	{ 
		if(Pointxy1[0].z==1)	//Èç¹ûÔ²»¡¶ÎÔÚ¶à±ßÐÎÇøÓòÄÚ 
			return 1;			//Ô²»¡ÔÚ¶à±ßÐÎÇøÓòÄÚ£¬·µ»Ø1 
		else					//Èç¹ûÔ²»¡¶ÎûÓÐÔÚ¶à±ßÐÎÇøÓòÄÚ 
			return 0;			//Ô²»¡Óë¶à±ßÐÎÇøÓò²»Ïཻ£¬·µ»Ø0 
	} 
	else	//Èç¹û¶àÓÚ2¸ö¶¥µã 
		return 2;	//Ô²»¡Óë¶à±ßÐÎÇøÓòÏཻ£¬·µ»Ø2 
} 
 
 
	int CCircle::CircleCircle(CCircle* cir1,float *angl1,float *angl2) 
	{ 
		float jl,ang,ang1; 
		float x1,y1,r1,x2,y2,r2; 
		x1=m_CircleX; 
		y1=m_CircleY; 
		r1=m_CircleR; 
		x2=cir1->m_CircleX; 
		y2=cir1->m_CircleY; 
		r2=cir1->m_CircleR; 
		 
		//µÚ¶þ¸öÔ²ÐÄÏà¶ÔµÚÒ»¸öÔ²ÐĵĻ¡¶È 
		ang=GetAngle(x1,y1,x2,y2);			//¼ÆËãÁ½¸öÔ²ÐļäµÄ¾àÀë 
		jl=(float)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
		if(jl+r12*pi) 
				*angl2=*angl2-(float)pi*2; 
			return 2;			//ÓÐÁ½¸ö½»µã 
		} 
	} 
 
int CArc::ArcCircle(CCircle* cir1,int *nCross,PointStruct* Pointxy1) 
{ 
	float ang1,ang2,angle[5],x1,y1,r; 
	int pb,numb,i; 
	numb=0; 
	angle[numb++]=m_Angle1; 
	pb=CircleCircle(cir1,&ang1,&ang2);//µ÷ÓÃCircleCircleº¯ÊýÀ´¼ÆËãÔ²ºÍÔ²µÄÏ໥¹ØÏµ 
	if(pb==1||pb==11||pb==21)	//Èç¹ûÔ²»¡ËùÔÚµÄÔ²ºÍÔ²ÐÎÇøÓòÓÐÒ»¸ö½»µã 
	{ 
		if(IsInArc(ang1))		//Èç¹û½»µãÔÚÔ²»¡µÄ»¡¶È·¶Î§ÄÚ 
		{ 
			angle[numb++]=ang1;  
		} 
	}  
	else if(pb==2) //Èç¹ûÔ²»¡ËùÔÚµÄÔ²ºÍÔ²ÐÎÇøÓòÓÐÁ½¸ö½»µã 
	{ 
		if(IsInArc(ang1)) 
		{ 
			angle[numb++]=ang1;  
		} 
		if(IsInArc(ang2)) 
		{ 
			angle[numb++]=ang2;  
		} 
	} 
 
	angle[numb++]=m_Angle2; 
	if(m_Angle1>m_Angle2) 
	{ 
		for(i=0;i=0&&angle[i]<=m_Angle2) 
				angle[i]=(float)pi*2+angle[i]; 
		} 
	} 
	pb=0; 
	for(i=0;im_CircleX)*(x1-cir1->m_CircleX)+(y1-cir1->m_CircleY)*(y1-cir1->m_CircleY)); 
		if(r<=cir1->m_CircleR) 
			Pointxy1[i].z=1; 
		else 
			Pointxy1[i].z=0; 
	} 
	Pointxy1[numb-1].x=angle[numb-1]; 
	*nCross=numb; 
	if(numb==2)	//Èç¹ûÖ»ÓÐÁ½¸ö¶¥µã£¬¼´Ô²»¡ÓëÔ²ÐÎÇøÓò²»Ïཻ 
	{ 
		if(Pointxy1[0].z==1)	//Èç¹ûÔ²»¡¶ÎÔÚÔ²ÐÎÇøÓòÄÚ 
			return 1;			//Ô²»¡ÔÚÔ²ÐÎÇøÓòÄÚ£¬·µ»Ø1 
		else					//Èç¹ûÔ²»¡¶ÎûÓÐÔÚÔ²ÐÎÇøÓòÄÚ 
			return 0;			//Ô²»¡ÓëÔ²ÐÎÇøÓò²»Ïཻ£¬·µ»Ø0 
	} 
	else	//Èç¹û¶àÓÚ2¸ö¶¥µã 
		return 2;	//Ô²»¡ÓëÔ²ÐÎÇøÓòÏཻ£¬·µ»Ø2 
} 
 
void CDrawDoc::OnTest()  
{ 
	// TODO: Add your command handler code here 
/*	CLine *line1,*line2; 
	line1=GetLine(0); 
	line2=GetLine(1); 
	float x1,y1,x2,y2; 
	int numb; 
	numb=line1->LineLine(line2,&x1,&y1,&x2,&y2); 
	if(numb==0) 
	{ 
		;//Á½ÌõÖ±Ïß²»Ïཻ 
	} 
	else if(numb==1) 
	{ 
		;//Á½ÌõÓÐÒ»¸ö½»µã£¬½»µã×ø±êΪ(x1,y1) 
	} 
	else if(numb==2) 
	{ 
		;//Á½ÌõÖ±Ïß²¿·ÖÖØºÏ£¬ÖØºÏ¶ÎµÄÆðµãºÍÖÕµã×ø±êΪ(x1,y1)ºÍ£¨x2,y2£© 
	} 
*/ 
 
/* 
	CLine* line1; 
	CPline* pline1; 
	PointStruct *Pointxy1; 
	int crossNumb,numb; 
	line1=GetLine(0); 
	pline1=GetPLine(0); 
	Pointxy1=new PointStruct[pline1->GetNumb()*2]; 
	numb=pline1->LineRgn(line1,&crossNumb,Pointxy1); 
	if(numb==0) 
	{ 
		;//Ö±ÏßÔÚ¶à±ßÐÎÇøÓòÍâ 
	} 
	else if(numb==1) 
	{ 
		;//Ö±ÏßÔÚ¶à±ßÐÎÇøÓòÄÚ 
	} 
	else if(numb==2) 
	{ 
		;//Ö±ÏßÓë¶à±ßÐÎÇøÓòÏཻ£¬numb-2Êǽ»µãÊý£¬¸÷¸ö·Ö¸î¶ÎµÄÐÅÏ¢´æ´¢ÔÚPointxy1ÖÐ 
	} 
	delete Pointxy1; 
*/ 
	/* 
	CPline* pline1; 
	CPline* pline2; 
	PointStruct *Pointxy1; 
	int crossNumb,numb; 
	pline1=GetPLine(0); 
	pline2=GetPLine(1); 
	Pointxy1=new PointStruct[pline1->GetNumb()*pline2->GetNumb()+2]; 
	numb=pline1->PLineRgn(pline2,&crossNumb,Pointxy1); 
	if(numb==0) 
	{ 
		;//Ö±ÏßÔÚ¶à±ßÐÎÇøÓòÍâ 
	} 
	else if(numb==1) 
	{ 
		;//Ö±ÏßÔÚ¶à±ßÐÎÇøÓòÄÚ 
	} 
	else if(numb==2) 
	{ 
		;//Ö±ÏßÓë¶à±ßÐÎÇøÓòÏཻ£¬crossNumb-2Êǽ»µãÊý£¬¸÷¸ö·Ö¸î¶ÎµÄÐÅÏ¢´æ´¢ÔÚPointxy1ÖÐ 
	} 
	delete Pointxy1; 
*/ 
/* 
	 
	CCircle* circle1; 
	CLine* line1; 
	float x1,y1,x2,y2,angle1,angle2; 
	circle1=GetCircle(0); 
	line1=GetLine(0); 
	int numb=circle1->CircleLine(line1,&angle1,&angle2,&x1,&y1,&x2,&y2); 
	if(numb==0) 
	{ 
		;//Ö±ÏßÔÚÔ²Íâ 
	} 
	else if(numb==3) 
	{ 
		;//Ö±ÏßÔÚÔ²ÄÚ 
	} 
	else  
	{ 
		;	//Ö±ÏßÓëÔ²Ïཻ£¬numbΪ½»µãÊýÄ¿£¬½»µãµÄ×ø±êΪ(x1,y1)ºÍ(x2,y2) 
			//½»µãÏà¶ÔÓÚÔ²ÐĵĻ¡¶ÈΪangle1ºÍangle2 
	} 
	*/ 
	/* 
	CArc* arc1; 
	CPline* pline1; 
	PointStruct *Pointxy1; 
	int crossNumb,numb; 
	pline1=GetPLine(0); 
	arc1=GetArc(0); 
	Pointxy1=new PointStruct[pline1->GetNumb()*2+2]; 
	numb=pline1->ArcRgn(arc1,&crossNumb,Pointxy1); 
	if(numb==0) 
	{ 
		;//Ô²»¡ÔÚ¶à±ßÐÎÇøÓòÍâ 
	} 
	else if(numb==1) 
	{ 
		;//Ô²»¡ÔÚ¶à±ßÐÎÇøÓòÄÚ 
	} 
	else if(numb==2) 
	{ 
		;//Ô²»¡Óë¶à±ßÐÎÇøÓòÏཻ£¬crossNumb-2Êǽ»µãÊý£¬¸÷¸ö¶¥µã¼°·Ö¸î¶ÎµÄÐÅÏ¢´æ´¢ÔÚPointxy1ÖÐ 
	} 
	delete Pointxy1; 
	*/   
/*	CCircle* circle1; 
	CCircle* circle2; 
	float angle1,angle2; 
	circle1=GetCircle(0); 
	circle2=GetCircle(1); 
	int ret=circle1->CircleCircle(circle2,&angle1,&angle2); 
	if(ret==0) 
	{ 
		;//Á½¸öÔ²·ÖÀë²»Ïཻ£» 
	} 
	else if(ret==10) 
	{ 
		;//µÚÒ»¸öÔ²ÔÚµÚ¶þ¸öÔ²ÄÚ£» 
	} 
	else if(ret==20) 
	{ 
		;//µÚ¶þ¸öÔ²ÔÚµÚÒ»¸öÔ²ÄÚ£» 
	} 
	else if(ret==11) 
	{ 
		;//µÚÒ»¸öÔ²ÄÚÇÐÓÚµÚ¶þ¸öÔ²,angle1·µ»ØÇеãÏà¶ÔÓÚµÚÒ»¸öÔ²ÐĵĻ¡¶È 
	} 
	else if(ret==21) 
	{ 
		;//µÚ¶þ¸öÔ²ÄÚÇÐÓÚµÚÒ»¸öÔ²£¬angle1·µ»ØÇеãÏà¶ÔÓÚµÚÒ»¸öÔ²ÐĵĻ¡¶È 
	} 
	else if(ret==31) 
	{ 
		;//Á½¸öÔ²ÍâÇУ¬angle1·µ»ØÇеãÏà¶ÔÓÚµÚÒ»¸öÔ²ÐĵĻ¡¶È 
	} 
	else if(ret==2) 
	{ 
		;//Á½¸öÔ²Ïཻ£¬angle1ºÍangle2·µ»Ø½»µãÏà¶ÔÓÚµÚÒ»¸öÔ²ÐĵĻ¡¶È 
	} 
*/ 
 
	CArc* arc1; 
	CCircle* circle1; 
	PointStruct Pointxy1[5]; 
	int crossNumb; 
	arc1=GetArc(0); 
	circle1=GetCircle(0); 
	int ret=arc1->ArcCircle(circle1,&crossNumb,Pointxy1);  
	if(ret==0) 
	{ 
		;//Ô²»¡ÔÚÔ²ÐÎÇøÓòÍâ 
	} 
	else if(ret==1) 
	{ 
		;//Ô²»¡ÔÚÔ²ÐÎÇøÓòÄÚ 
	} 
	else if(ret==2) 
	{ 
		;//Ô²»¡ÓëÔ²ÐÎÇøÓòÏཻ£¬crossNumb-2Êǽ»µãÊý£¬¸÷·Ö¸î¶¥µãÒÔ¼° 
		 //¶¥µãºóµÄ·Ö¸î¶ÎµÄÐÅÏ¢´æ´¢ÔÚPointxy1ÖÐ 
	} 
}