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

📄 line.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{
	double xmin,xmax,ymin,ymax;
	xmin=min(m_pointPrimary.x,m_pointEnd.x);
	xmax=max(m_pointPrimary.x,m_pointEnd.x);
	ymin=min(m_pointPrimary.y,m_pointEnd.y);
	ymax=max(m_pointPrimary.y,m_pointEnd.y);
	minx=xmin;
	miny = ymin;
	maxx =xmax;
	maxy =ymax;
}

void CPaintLine::Serialize(CArchive& ar)
{
	CPainted::Serialize(ar);
	if (ar.IsStoring())
	{
		ar << m_pointEnd;
		ar << m_fangle;
		ar << m_flength;
	}
	else
	{
		ar >> m_pointEnd;
		ar >> m_fangle;
		ar >> m_flength;
	}
}


void CPaintLine::onup1(CPnt& point1, CPnt& point2, CPnt& point3,CWnd *pWnd)
{	m_pointPrimary=point1;
	m_pointEnd=point2;
}

CPnt CPaintLine::returnattr1()
{
	return m_pointPrimary;
}
CPnt CPaintLine::returnattr2()
{
	return	m_pointEnd;
}

//得到路径的绘制起点
//pnt1 为传递的鼠标点坐标或给定的起点坐标,
//id为返回点的ID,
//pnt为返回点的坐标,angle为返回点的姿态角
//return FALSE表示无就近点
//return TRUE表示有就近点
BOOL CPaintLine::GetPathStartnode1(CPnt& pnt1,UINT& id,CPnt& pnt,double& angle)
{
	BOOL forreturn=FALSE;	
	CPainted*	pPainted;
	//若有一条参考线段并定义了参考点为其起点或终点
	if(m_pDoc->m_nGraphSelect==1 && m_pDoc->GraphSelect[0].Type>=0 && m_pDoc->GraphSelect[0].Type<=4)
	{
		pPainted =m_pDoc->GetShape(m_pDoc->GraphSelect[0].Index);
		if(!pPainted->m_bReferencePoint)//参考点为终点
		{	
			CPnt ppp;
			ppp=pPainted->returnattr2();
			pnt=ppp;			
			angle=pPainted->m_EndPostureAngle;
			id=pPainted->m_uEndNodeId;	
			forreturn=TRUE;							
		}
		else//参考点为起点
		{			
			CPnt ppp;
			ppp=pPainted->returnattr1();
			pnt=ppp;
			angle=pPainted->m_StartPostureAngle;
			id=pPainted->m_uStartNodeId;	
			forreturn=TRUE;
		}
	}
	else//若没有一条参考线段
	{
		int nShapes = m_pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			forreturn=pPainted->NearJudge2(pnt1,id,pnt,angle);
			if(forreturn)
				break;
		}
	}
	return forreturn;
}


//得到路径的绘制起点
//画线时自动取就近的线条端点为起点
//起点为直线端点时return 1;
//起点为圆弧端点时return 2;
//起点为鼠标点时return 0;(即鼠标点距离就近的线条端点超过规定的范围)
//pnt1 为传递的鼠标点坐标,成功则赋值为就近的线条端点坐标,不成功则无意义
//pnt2 成功则为直线的另一端点或圆弧的圆心,不成功则无意义
int CPaintLine::GetPathStartnode(CPnt& pnt1, CPnt& pnt2)
{
	CPainted*	pPainted;
	int    forreturn=0;
	CPoint point1;
	DPtoVP(pnt1,point1);	
	if(m_pDoc->m_nGraphSelect==1)//若有一条参考线段并定义了参考点为其起点或终点
	{
		pPainted =m_pDoc->GetShape(m_pDoc->GraphSelect[0].Index);
		if (pPainted->m_uFigureType==0)//Line
		{
			UINT node1,node2;
			CPnt pointEnd;
			CPnt pointPrimary;
			pointPrimary=pPainted->m_pointPrimary;
			pointEnd=((CPaintLine*) pPainted)->m_pointEnd;
			node1=((CPaintLine*) pPainted)->m_uStartNodeId;
			node2=((CPaintLine*) pPainted)->m_uEndNodeId;
			if(!pPainted->m_bReferencePoint)//参考点为终点
			{
				pnt1.x=pointEnd.x;
				pnt1.y=pointEnd.y;
				pnt2.x=pointPrimary.x;
				pnt2.y=pointPrimary.y;
				m_pDoc->m_uCurStartnodeId=node2;
				forreturn=1;
			}
			else//参考点为起点
			{
				pnt1.x=pointPrimary.x;
				pnt1.y=pointPrimary.y;
				pnt2.x=pointEnd.x;
				pnt2.y=pointEnd.y;
				m_pDoc->m_uCurStartnodeId=node1;
				forreturn=1;
			}
		}
		else if(pPainted->m_uFigureType==1)//Arc
		{
			UINT node1,node2;
			CPnt pointEnd;
			CPnt pointPrimary;
			CPnt pcirclecenter;
			pointPrimary=pPainted->m_pointPrimary;
			pointEnd=((CPaintArc*) pPainted)->m_pointEnd;
			pcirclecenter=((CPaintArc*) pPainted)->m_pcirclecenter;
			node1=((CPaintArc*) pPainted)->m_uStartNodeId;
			node2=((CPaintArc*) pPainted)->m_uEndNodeId;
			if(!pPainted->m_bReferencePoint)//参考点为终点
			{
				pnt1.x=pointEnd.x;
				pnt1.y=pointEnd.y;
				pnt2.x=pcirclecenter.x;
				pnt2.y=pcirclecenter.y;
				m_pDoc->m_uCurStartnodeId=node2;
				forreturn=2;
			}
			else//参考点为起点
			{
				pnt1.x=pointPrimary.x;
				pnt1.y=pointPrimary.y;
				pnt2.x=pcirclecenter.x;
				pnt2.y=pcirclecenter.y;
				m_pDoc->m_uCurStartnodeId=node1;
				forreturn=2;
			}
		}
	}
	else//若没有一条参考线段则普通画法
	{		
		int nShapes = m_pDoc->NumShapes();
		if(m_pDoc->m_PathPaintMode==1||m_pDoc->m_PathPaintMode==2
			||m_pDoc->m_PathPaintMode==6||m_pDoc->m_PathPaintMode==7
			||m_pDoc->m_PathPaintMode==10||m_pDoc->m_PathPaintMode==11)//路径的绘制模式
		{
			pnt1=m_pDoc->m_pPaintStartNode;//绘图时给定的起点
		}		
		for (int index = 0; index < nShapes; index++)
		{
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			if (pPainted->m_uFigureType==0)//LINE
			{				
				UINT node1,node2;
				CPnt pointEnd;
				CPnt pointPrimary;
				CPoint pointEnd1;
				CPoint pointPrimary1;
				pointPrimary=pPainted->m_pointPrimary;
				pointEnd=((CPaintLine*) pPainted)->m_pointEnd;
				node1=((CPaintLine*) pPainted)->m_uStartNodeId;
				node2=((CPaintLine*) pPainted)->m_uEndNodeId;
				DPtoVP(pointPrimary,pointPrimary1);
				DPtoVP(pointEnd,pointEnd1);
				DPtoVP(pnt1,point1);
				if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
				{	pnt1.x=pointPrimary.x;
					pnt1.y=pointPrimary.y;
					pnt2.x=pointEnd.x;
					pnt2.y=pointEnd.y;
					m_pDoc->m_uCurStartnodeId=node1;
					forreturn=1;
					break;
				}
				else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
				{	pnt1.x=pointEnd.x;
					pnt1.y=pointEnd.y;
					pnt2.x=pointPrimary.x;
					pnt2.y=pointPrimary.y;
					m_pDoc->m_uCurStartnodeId=node2;
					forreturn=1;
					break;
				}
				
			}
			else if(pPainted->m_uFigureType==1)//ARC
			{
				UINT node1,node2;
				CPnt pointEnd;
				CPnt pointPrimary;
				CPnt pcirclecenter;
				CPoint pointEnd1;
				CPoint pointPrimary1;
				pointPrimary=pPainted->m_pointPrimary;
				pointEnd=((CPaintArc*) pPainted)->m_pointEnd;
				pcirclecenter=((CPaintArc*) pPainted)->m_pcirclecenter;
				node1=((CPaintArc*) pPainted)->m_uStartNodeId;
				node2=((CPaintArc*) pPainted)->m_uEndNodeId;
				DPtoVP(pointPrimary,pointPrimary1);
				DPtoVP(pointEnd,pointEnd1);
				DPtoVP(pnt1,point1);
				if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
				{	pnt1.x=pointPrimary.x;
					pnt1.y=pointPrimary.y;
					pnt2.x=pcirclecenter.x;
					pnt2.y=pcirclecenter.y;
					m_pDoc->m_uCurStartnodeId=node1;
					forreturn=2;
					break;
				}
				else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
				{	pnt1.x=pointEnd.x;
					pnt1.y=pointEnd.y;
					pnt2.x=pcirclecenter.x;
					pnt2.y=pcirclecenter.y;
					m_pDoc->m_uCurStartnodeId=node2;
					forreturn=2;
					break;
				}
			}
		}
	}
	return forreturn;
}


//得到路径的绘制终点
//返回值==FALSE时表示终点独立(不与任何节点相连)
//返回值==TRUE时表示终点与某节点相连
//
BOOL CPaintLine::GetPathEndnode1(CPnt& pnt1)
{
	CPainted*	pPainted;
	BOOL forreturn=FALSE;
	CPoint point1;
	DPtoVP(pnt1,point1);
	if(m_pDoc->m_banglelengthok)//定角定长画线
	{
		double angle;
		angle=m_pDoc->m_fangle*pi/180.0;		
		pnt1.x=m_pointPrimary.x+m_pDoc->m_flength*cos(angle);
		pnt1.y=m_pointPrimary.y+m_pDoc->m_flength*sin(angle);
		int nShapes = m_pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			UINT id;
			CPnt pnt;
			double angle;
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			forreturn=pPainted->NearJudge2(pnt1,id,pnt,angle);
			if(forreturn)
			{
				pnt1=pnt;
				m_pDoc->m_uCurEndnodeId=id;
				break;
			}				
		}
	}
	else if(m_pDoc->m_PathPaintMode==2)//给定起点终点方式画直线
	{
		pnt1=m_pDoc->m_pPaintEndNode;//绘图时给定的终点
		int nShapes = m_pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			UINT id;
			CPnt pnt;
			double angle;
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			forreturn=pPainted->NearJudge2(pnt1,id,pnt,angle);
			if(forreturn)
			{
				pnt1=pnt;
				m_pDoc->m_uCurEndnodeId=id;
				break;
			}				
		}
	}
	else if(m_pDoc->m_bBrushwork && !m_pDoc->m_bStartnodeIndep)//相切画法&&起点与其它线段相连
	{
		double x1,y1,x2,y2,angle;
		x1=pnt1.x; y1=pnt1.y;	//直线外一点p1
		x2=m_pointPrimary.x; y2=m_pointPrimary.y;//直线上一点p2
		angle=m_StartPostureAngle;//路段起点的姿态角(外射角)
		CPnt joinpnt;//直线与过p1点的垂线的交点
		//直线垂直
		if(fabs(angle-pi/2)<mindouble||fabs(angle-3*pi/2)<mindouble)
		{	joinpnt.x=x2;
			joinpnt.y=y1;
		}
		//直线水平
		else if(fabs(angle-pi)<mindouble||fabs(angle)<mindouble)
		{	joinpnt.x=x1;
			joinpnt.y=y2;
		}
		else 
		{
			double k1=tan(angle);//(y4-y3)/(x4-x3);
			double k2=-1/k1;//(x3-x4)/(y4-y3);							
			joinpnt.x=(double) ((y1-y2+k1*x2-k2*x1)/(k1-k2));
			joinpnt.y=(double) (k1*(joinpnt.x-x2)+y2);
		}
		pnt1=joinpnt;
					
		int nShapes = m_pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			UINT id;					
			CPnt pnt;
			double angle;			
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			if(pPainted->NearJudge2(pnt1,id,pnt,angle))//有就近终点
			{
				double angle1;			
				if( GetEndPostureAngle(pnt,angle1) )
				{
					if(AngleJudge(angle1,angle))//姿态角同相或反相
					{
						pnt1=pnt;
						m_pDoc->m_uCurEndnodeId=id;
						forreturn=TRUE;
					}
				}
				break;
			}				
		}		
		//go on
	}
	else//非相切画法||起点不与其它线段相连
	{
		int nShapes = m_pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			UINT id;
			CPnt pnt;
			double angle;
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			forreturn=pPainted->NearJudge2(pnt1,id,pnt,angle);
			if(forreturn)
			{
				pnt1=pnt;
				m_pDoc->m_uCurEndnodeId=id;
				break;
			}				
		}
	
	}

	return forreturn;
}


//得到路径的绘制终点
//返回值==FALSE时表示终点独立(不与任何节点相连)
//返回值==TRUE时表示终点与某节点相连
//
BOOL CPaintLine::GetPathEndnode(CPnt& pnt1)
{	
	CPainted*	pPainted;
	BOOL forreturn=FALSE;
	CPoint point1;
	DPtoVP(pnt1,point1);
	if(m_pDoc->m_banglelengthok)//定角定长画线
	{
		double angle;
		CPnt primary;
		angle=m_pDoc->m_fangle*pi/180.0;
		primary=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
		pnt1.x=primary.x+m_pDoc->m_flength*cos(angle);
		pnt1.y=primary.y+m_pDoc->m_flength*sin(angle);
		int nShapes = m_pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			CPnt p1,p2;
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			p1=pPainted->returnattr1();
			p2=pPainted->returnattr2();			
			if(fabs(pnt1.x-p1.x)<mindouble&&fabs(pnt1.y-p1.y)<mindouble)
			{
				m_pDoc->m_uCurEndnodeId=pPainted->m_uStartNodeId;
				forreturn=TRUE;
				break;
			}
			else if(fabs(pnt1.x-p2.x)<mindouble&&fabs(pnt1.y-p2.y)<mindouble)
			{
				m_pDoc->m_uCurEndnodeId=pPainted->m_uEndNodeId;
				forreturn=TRUE;
				break;
			}			
		}
	}
	else if(m_pDoc->m_PathPaintMode==2)//给定起点终点方式画直线
	{
		pnt1=m_pDoc->m_pPaintEndNode;//绘图时给定的终点

⌨️ 快捷键说明

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