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

📄 drawdoc.cpp

📁 在vc下编写的一个开发地理信息系统的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					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<n_LineNumb;i++)
		{
			CLine* p_Line=new CLine();
			p_Line->Save(file1,0);
			m_LineArray.Add(p_Line);
		}

		for(i=0;i<n_PLineNumb;i++)
		{
			CPline* p_PLine=new CPline();
			p_PLine->Save(file1,0);
			m_PLineArray.Add(p_PLine);
		}
		for(i=0;i<n_CircleNumb;i++)
		{
			CCircle* p_Circle=new CCircle();
			p_Circle->Save(file1,0);
			m_CircleArray.Add(p_Circle);
		}
		for(i=0;i<n_ArcNumb;i++)
		{
			CArc* p_Arc=new CArc();
			p_Arc->Save(file1,0);
			m_ArcArray.Add(p_Arc);
		}
		for(i=0;i<n_TextNumb;i++)
		{
			CText* p_Text=new CText();
			p_Text->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<m_MaxScreen-1;i++)
			m_Screen[i]=m_Screen[i+1];
	}
	else    //如果不是最大屏,屏幕记录号增加1
		m_CurrentScreen++;
	//记录下本屏幕的参数
	m_Screen[m_CurrentScreen].sx=StartX;
	m_Screen[m_CurrentScreen].sy=StartY;
	m_Screen[m_CurrentScreen].blc=blc;
}

/////////////////////////////////////////////////////////////////////////////
// CDrawDoc diagnostics

#ifdef _DEBUG
void CDrawDoc::AssertValid() const
{
	COleDocument::AssertValid();
}

void CDrawDoc::Dump(CDumpContext& dc) const
{
	COleDocument::Dump(dc);
}
#endif //_DEBUG

COLORREF CGraphPara::GetColor(int n)
{
	return m_ColorList[n]; //返回第n种颜色的实际值
}

BOOL CGraphPara::GetDisplayStatue(int n)
{
	return m_LayerList[n].b_Display;
}

//计算点(x1,y1)与点(x2,y2)间的距离
float CDraw::CalDisp(float x1,float y1,float x2,float y2)
{
	return (float)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

//作用:计算点(xx,yy)到线段(x1,y1)(x2,y2)的距离,返回计算的距离值
float CDraw::PointLine(float xx,float yy,float x1,float y1,float x2,float y2)
{
	float a,b,c,ang1,ang2,ang;
    //计算三条边的距离
    a=CalDisp(x1,y1,xx,yy);if(a==0.0)return 0.0;
    b=CalDisp(x2,y2,xx,yy);if(b==0.0)return 0.0;
    c=CalDisp(x1,y1,x2,y2);
    //如果(x1,y1)和(x2,y2)是一个点直接返回距离
    if(c==0.0) return a;
	if(a<b) //如果(xx,yy)的点(x1,y1)这条边较短
	{
		if(y1==y2)
		{
			if(x1<x2)
				ang1=0;
			else
				ang1=(float)pi;
		}
		else
		{
			ang1=(float)acos((x2-x1)/c);
			if(y1>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<x2)
				ang1=(float)pi;
			else
				ang1=0;
		}
		else
		{
			ang1=(float)acos((x1-x2)/c);     //直线(x2,y2)-(x1,y1)的斜率的弧度
			if(y2>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;  //交角的大小 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -