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||maxx yMaxScreen||maxy DPtoVP(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;i Save(file1,0); m_LineArray.Add(p_Line); } for(i=0;i Save(file1,0); m_PLineArray.Add(p_PLine); } for(i=0;i Save(file1,0); m_CircleArray.Add(p_Circle); } for(i=0;i Save(file1,0); m_ArcArray.Add(p_Arc); } for(i=0;i Save(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;i y2)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(x1 y1)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;i MoveTo(ppoint[0].x,ppoint[0].y); for(i=0;i LineTo(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;i Write((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;i Read((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;i GetColor(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_Angle1 m_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_Xmax m_minY) *m_Ymin=m_minY; if(*m_Ymax GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); if(*m_Xmin>m_minX) *m_Xmin=m_minX; if(*m_Xmax m_minY) *m_Ymin=m_minY; if(*m_Ymax GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); if(*m_Xmin>m_minX) *m_Xmin=m_minX; if(*m_Xmax m_minY) *m_Ymin=m_minY; if(*m_Ymax GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); if(*m_Xmin>m_minX) *m_Xmin=m_minX; if(*m_Xmax m_minY) *m_Ymin=m_minY; if(*m_Ymax GetRect(&m_minX,&m_minY,&m_maxX,&m_maxY); if(*m_Xmin>m_minX) *m_Xmin=m_minX; if(*m_Xmax m_minY) *m_Ymin=m_minY; if(*m_Ymax IsPoint(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;i GetRect(&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;i toChar(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;j toData(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;i GetID()]=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;i Delete(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;i m_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;i Pointxy1[i+1].x&&xx1 xx2) ||pb==2&&(Pointxy1[i].y>Pointxy1[i+1].y&&yy1 yy2)) { 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;i LineRgn(&line2,&Numb,Pointxy); for(int j=0;j m_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&&x1 xx1&&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(yy m_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;i ArcLine(&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;i angle[i+1])//Èç¹û˳ÐòÏà·´ { pb=1; ang1=angle[i]; angle[i]=angle[i+1];angle[i+1]=ang1; } } }while(pb==1);//Èç¹û»¹Óе¹ÐòµÄ£¬ÔÙ½øÐÐÑ»·±È½Ï pb=0; for(i=0;i m_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+r1 2*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;i m_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ÖÐ } }