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

📄 line.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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_bBrushwork)//相切画法
	{
		//要画的直线起点任意的情况下
		if(((CPaintLine*) m_pDoc->m_pSelectedTool)->m_bpointEndControl==0)
		{
			int nShapes = m_pDoc->NumShapes();
			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);
					if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
					{	pnt1.x=pointPrimary.x;
						pnt1.y=pointPrimary.y;
						m_pDoc->m_uCurEndnodeId=node1;
						forreturn=TRUE;						
						break;
					}
					else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
					{	pnt1.x=pointEnd.x;
						pnt1.y=pointEnd.y;
						m_pDoc->m_uCurEndnodeId=node2;
						forreturn=TRUE;
						break;
					}
				}
				else//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);
					if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
					{	CPnt startnode;
						startnode=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
						//如果直线的起点满足圆弧的切线方程						
						double aa;						
						aa=PointToLine1(startnode,pointPrimary,pointPrimary,pcirclecenter,TRUE);
						if(aa<0.0001)
						{
							pnt1.x=pointPrimary.x;
							pnt1.y=pointPrimary.y;
							m_pDoc->m_uCurEndnodeId=node1;
							forreturn=TRUE;
						}						
						break;
					}
					else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
					{	CPnt startnode;
						startnode=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
						//如果直线的起点满足圆弧的切线方程
						double aa;						
						aa=PointToLine1(startnode,pointEnd,pointEnd,pcirclecenter,TRUE);
						if(aa<0.0001)
						{	pnt1.x=pointEnd.x;
							pnt1.y=pointEnd.y;
							m_pDoc->m_uCurEndnodeId=node2;
							forreturn=TRUE;
						}
						break;
					}
				}
			}//		
		}
		//要画的直线起点为某直线的端点的情况下
		else if(((CPaintLine*) m_pDoc->m_pSelectedTool)->m_bpointEndControl==1)
		{
			CPnt startnode;
			CPnt pointTemp;
			CPoint startnode1;
			CPoint pointTemp1;
			startnode=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
			pointTemp=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointTemp;
			//解得直线切线与通过鼠标点的垂线的交点作为直线的准终点pnt1.
			if(fabs(startnode.x-pointTemp.x)<mindouble)//直线切线垂直
			{	pnt1.x=startnode.x;
				pnt1.y=pnt1.y;
			}
			else if(fabs(startnode.y-pointTemp.y)<mindouble)//直线切线水平
			{	pnt1.x=pnt1.x;
				pnt1.y=startnode.y;
			}
			else ////直线切线既不水平也不垂直
			{	double k1=(startnode.y-pointTemp.y)/(startnode.x-pointTemp.x);
				double k2=(pointTemp.x-startnode.x)/(startnode.y-pointTemp.y);
				pnt1.x=(double) ((pnt1.y-startnode.y+k1*startnode.x-k2*pnt1.x)/(k1-k2));
				pnt1.y=(double) (k1*(pnt1.x-startnode.x)+startnode.y);
			}	
			DPtoVP(pnt1,point1);
			int nShapes = m_pDoc->NumShapes();
			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);
					if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
					{	//如果就近的直线端点满足切线方程
						double aa;						
						aa=PointToLine1(pointPrimary,startnode,startnode,pointTemp,FALSE);
						if(aa<0.0001)
						{
							pnt1.x=pointPrimary.x;
							pnt1.y=pointPrimary.y;
							m_pDoc->m_uCurEndnodeId=node1;
							forreturn=TRUE;
						}
						break;
					}
					else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
					{	//如果就近的直线端点满足切线方程
						double aa;						
						aa=PointToLine1(pointEnd,startnode,startnode,pointTemp,FALSE);
						if(aa<0.0001)
						{
							pnt1.x=pointEnd.x;
							pnt1.y=pointEnd.y;
							m_pDoc->m_uCurEndnodeId=node2;
							forreturn=TRUE;
						}
						break;
					}
				}
				else//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);
					if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
					{	
						//如果直线的起点满足就近圆弧的切线方程
						//并且就近圆弧的端点满足起点直线的切线方程
						double aa,bb;						
						aa=PointToLine1(startnode,pointPrimary,pointPrimary,pcirclecenter,TRUE);
						bb=PointToLine1(pointPrimary,startnode,startnode,pointTemp,FALSE);
						if(aa<0.0001&&bb<0.0001)
						{
							pnt1.x=pointPrimary.x;
							pnt1.y=pointPrimary.y;
							m_pDoc->m_uCurEndnodeId=node1;
							forreturn=TRUE;
						}						
						break;
					}
					else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
					{
						//如果直线的起点满足就近圆弧的切线方程
						//并且就近圆弧的端点满足起点直线的切线方程
						double aa,bb;						
						aa=PointToLine1(startnode,pointEnd,pointEnd,pcirclecenter,TRUE);
						bb=PointToLine1(pointEnd,startnode,startnode,pointTemp,FALSE);
						if(aa<0.0001&&bb<0.0001)					
						{	pnt1.x=pointEnd.x;
							pnt1.y=pointEnd.y;
							m_pDoc->m_uCurEndnodeId=node2;
							forreturn=TRUE;
						}
						break;						
					}//
				}
			}		
		}
		//要画的直线起点为某圆弧的端点的情况下
		else if(((CPaintLine*) m_pDoc->m_pSelectedTool)->m_bpointEndControl==2)
		{	CPnt startnode;
			CPnt circlecenter;
			CPoint startnode1;
			CPoint circlecenter1;
			startnode=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
			circlecenter=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointTemp;
			//解得圆弧切线与通过鼠标点的垂线的交点作为直线的准终点pnt1.
			if(fabs(circlecenter.y-startnode.y)<mindouble)//圆弧切线垂直
			{	pnt1.x=startnode.x;
				pnt1.y=pnt1.y;
			}
			else if(fabs(circlecenter.x-startnode.x)<mindouble)//圆弧切线水平
			{	pnt1.x=pnt1.x;
				pnt1.y=startnode.y;
			}
			else ////圆弧切线既不水平也不垂直
			{	double k1=(startnode.x-circlecenter.x)/(circlecenter.y-startnode.y);
				double k2=(circlecenter.y-startnode.y)/(circlecenter.x-startnode.x);
				pnt1.x=(pnt1.y-startnode.y+k1*startnode.x-k2*pnt1.x)/(k1-k2);
				pnt1.y=k1*(pnt1.x-startnode.x)+startnode.y;
			}				
			DPtoVP(pnt1,point1);
			int nShapes = m_pDoc->NumShapes();
			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);
					if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
					{	//如果就近的直线端点满足切线方程
						double aa;						
						aa=PointToLine1(pointPrimary,startnode,startnode,circlecenter,TRUE);
						if(aa<0.0001)
						{
							pnt1.x=pointPrimary.x;
							pnt1.y=pointPrimary.y;
							m_pDoc->m_uCurEndnodeId=node1;
							forreturn=TRUE;
						}						
						break;
					}
					else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
					{	//如果就近的直线端点满足切线方程
						double aa;						
						aa=PointToLine1(pointEnd,startnode,startnode,circlecenter,TRUE);
						if(aa<0.0001)
						{	pnt1.x=pointEnd.x;
							pnt1.y=pointEnd.y;
							m_pDoc->m_uCurEndnodeId=node2;
							forreturn=TRUE;
						}
						break;
					}
				}
				else//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);
					if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
					{	
						//如果直线的起点满足就近圆弧的切线方程
						//并且就近圆弧的端点满足起点圆弧的切线方程
						double aa,bb;						
						aa=PointToLine1(startnode,pointPrimary,pointPrimary,pcirclecenter,TRUE);
						bb=PointToLine1(pointPrimary,startnode,startnode,circlecenter,TRUE);
						if(aa<0.0001&&bb<0.0001)
						{
							pnt1.x=pointPrimary.x;
							pnt1.y=pointPrimary.y;
							m_pDoc->m_uCurEndnodeId=node1;
							forreturn=TRUE;
						}					
						break;
					}
					else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
					{
						//如果直线的起点满足就近圆弧的切线方程
						//并且就近圆弧的端点满足起点圆弧的切线方程
						double aa,bb;						
						aa=PointToLine1(startnode,pointEnd,pointEnd,pcirclecenter,TRUE);
						bb=PointToLine1(pointEnd,startnode,startnode,circlecenter,TRUE);
						if(aa<0.0001&&bb<0.0001)
						{	pnt1.x=pointEnd.x;
							pnt1.y=pointEnd.y;
							m_pDoc->m_uCurEndnodeId=node2;
							forreturn=TRUE;
						}					
						break;
					}
				}//
			}
		 }
	 }
	 else//非相切画法
	 {	
		int nShapes = m_pDoc->NumShapes();
		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);
				if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
				{	pnt1.x=pointPrimary.x;
					pnt1.y=pointPrimary.y;
					m_pDoc->m_uCurEndnodeId=node1;
					forreturn=TRUE;
					break;
				}
				else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
				{	pnt1.x=pointEnd.x;
					pnt1.y=pointEnd.y;
					m_pDoc->m_uCurEndnodeId=node2;
					forreturn=TRUE;
					break;
				}
			}
			else//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);
				if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
				{	CPnt startnode;
					startnode=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
					//如果直线的起点满足圆弧的切线方程						
					double aa;						
					aa=PointToLine1(startnode,pointPrimary,pointPrimary,pcirclecenter,TRUE);
					if(aa<0.0001)
					{
						pnt1.x=pointPrimary.x;
						pnt1.y=pointPrimary.y;
						m_pDoc->m_uCurEndnodeId=node1;
						forreturn=TRUE;
					}						
					break;
				}
				else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
				{	CPnt startnode;
					startnode=((CPaintLine*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
					//如果直线的起点满足圆弧的切线方程
					double aa;						
					aa=PointToLine1(startnode,pointEnd,pointEnd,pcirclecenter,TRUE);
					if(aa<0.0001)
					{	pnt1.x=pointEnd.x;
						pnt1.y=pointEnd.y;
						m_pDoc->m_uCurEndnodeId=node2;

⌨️ 快捷键说明

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