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

📄 paintside.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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;
}

//得到路径的绘制终点
BOOL CPaintSide::GetPathEndnode(CPnt& pnt1)
{
	return	1;
}
void CPaintSide::GetBoundingRect(double &minx,double &miny,double &maxx,double &maxy)
{
	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 CPaintSide::IsDblClk(void* pTemp1,void* pTemp2)//是否被双击选中
{
loop11:
	m_pDoc = (CPaintobjDoc*) pTemp1;
	CSideAttrDlg sideattr;				
	sideattr.m_pDoc =(CPaintobjDoc*) pTemp1;
	sideattr.m_pActive1=this;	
	sideattr.m_dPathAngle=m_angHeading*180.0/pi;
	sideattr.m_dPathLength=m_flength;
	sideattr.m_uEndId =m_uEndNodeId;
	sideattr.m_nPathHead =m_uPathHeading;
	sideattr.m_uPathId = m_uPathId;
	UINT id=m_uPathId;
	sideattr.m_dPathLimit = m_fPathLimit;
	sideattr.m_uStartId =m_uStartNodeId;
	sideattr.m_nGuidance=m_uPathGuideType;
	int result=sideattr.DoModal();
	if(result==IDOK)
	{
		//如果更改了路径编号,不能与某存在的路径编号相同
		//必须定义新的路径编号
		CPainted*	pPainter;				
		if(id!=sideattr.m_uPathId)
		{
			BOOL breturn=FALSE;
			int nShapes = m_pDoc->NumShapes();
			for (int index = 0; index < nShapes; index++)
			{
				pPainter =m_pDoc->GetShape(index);
				if(pPainter->m_uPathId==sideattr.m_uPathId)
				{
					CString str="更改后的路径编号不能与某存在的路径编号相同,必须重新定义新的路径编号!";
					AfxMessageBox(str);
					breturn=TRUE;
					break;
				}
			}
			if(breturn)	{goto loop11;}
		}
		//pHit->m_uPathEndNode=sideattr.m_uEndId;
		m_uPathHeading=sideattr.m_nPathHead;
		m_uPathId=sideattr.m_uPathId;
		m_fPathLimit=sideattr.m_dPathLimit;
		//pHit->m_uPathStartNode=sideattr.m_uStartId;
		//m_uPathType=0;//直线类型为0;
		//((CPaintLine*)pHit)->m_fangle=sideattr.m_fPathAngle*pi/180.0;
		//((CPaintLine*)pHit)->m_flength=sideattr.m_fPathLength;
		m_uPathGuideType=sideattr.m_nGuidance;
		m_pDoc->GetPathIdMax();			
	}
}

//
//判断是否点击了某节点
//返回0==没击中,1==击中起点,2==击中终点
UINT CPaintSide::IsHit1(CPnt& pointBang)
{
	UINT forreturn=0;
	CPoint m_pointPrimary1;	
	CPoint m_pointEnd1;
	CPoint m_pointBang1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);	
	DPtoVP(m_pointEnd,m_pointEnd1);
	DPtoVP(pointBang,m_pointBang1);
	if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointPrimary1.x,m_pointPrimary1.y)<4)
	{
		forreturn=1;
	}
	else if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointEnd1.x,m_pointEnd1.y)<4)
	{
		forreturn=2;
	}
	return forreturn;
}

BOOL CPaintSide::IsHit(CPnt& pointBang)
{
	CPoint m_pointPrimary1;	
	CPoint m_pointEnd1;
	CPoint m_pointBang1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);	
	DPtoVP(m_pointEnd,m_pointEnd1);
	DPtoVP(pointBang,m_pointBang1);

	double a,b,c,ang1,ang2,ang;
	double x1=(double) m_pointPrimary1.x;
	double y1=(double) m_pointPrimary1.y;
	double x2=(double) m_pointEnd1.x;
	double y2=(double) m_pointEnd1.y;
	double xx=(double) m_pointBang1.x;
	double yy=(double) m_pointBang1.y;
	//计算三条边的距离
	a=Distancef(x1,y1,xx,yy);
	if(a==0.0)	return TRUE;
	b=Distancef(x2,y2,xx,yy);
	if(b==0.0)	return TRUE;
	c=Distancef(x1,y1,x2,y2);
	if(c==0.0)//线段为一个点
	{
		if(a<3)
			return TRUE;
		else 
			return FALSE;
	}
	if(a<b)//如果点击的点到线段起点的这条边较短
	{
		if(y1==y2)
		{
			if(x1<x2)
				ang1=0;
			else
				ang1=(double)pi;
		}
		else
		{
			double x=(x2-x1)/c;
			if(x<-1) x=-1;
			if(x>1) x=1;
			ang1=acos(x);
			if(y1>y2) ang1=(double)pi*2-ang1;//直线(x1,y1)-(x2,y2)斜率的弧度
		}
		double x=(xx-x1)/a;
		if(x<-1) x=-1;
		if(x>1) x=1;
		ang2=acos(x);
		if(y1>yy) ang2=(double)pi*2-ang2;//直线(x1,y1)-(xx,yy)斜率的弧度
		ang=ang2-ang1;
		if(ang<0)ang=-ang;
		if(ang>pi)ang=(double)pi*2-ang;//交角大小
		if(ang>pi/2)	//若为钝角,直接得到距离为a
		{
			if(a<3)
				return TRUE;
			else 
				return FALSE;
		}
		else				//锐角则计算得到距离
		{
			if((a*(double)sin(ang))<3)
				return TRUE;
			else 
				return FALSE;
		}
	}
	else
	{
		if(y1==y2)
		{
			if(x1<x2)
				ang1=(double)pi;
			else
				ang1=0;
		}
		else
		{
			double x=(x1-x2)/c;
			if(x<-1) x=-1;
			if(x>1) x=1;
			ang1=acos(x);
			if(y2>y1) ang1=(double)pi*2-ang1;//直线(x2,y2)-(x1,y1)斜率的弧度
		}
		double x=(xx-x2)/b;
		if(x<-1) x=-1;
		if(x>1) x=1;
		ang2=acos(x);
		if(y2>yy) ang2=(double)pi*2-ang2;//直线(x2,y2)-(xx,yy)斜率的弧度
		ang=ang2-ang1;
		if(ang<0)ang=-ang;
		if(ang>pi)ang=(double)pi*2-ang;
		if(ang>pi/2)	
		{
			if(b<3)
				return TRUE;
			else 
				return FALSE;
		}
		else
		{
			if((b*(double)sin(ang))<3)
				return TRUE;
			else 
				return FALSE;
		}
	}
}

void CPaintSide::Serialize(CArchive& ar)
{
	CPainted::Serialize(ar);
	if (ar.IsStoring())
	{
		ar << m_pointEnd;
		ar << m_angHeading;// 在此路径上的车头角
		ar << m_flength;//长度
	}
	else
	{
		ar >> m_pointEnd;
		ar >> m_angHeading;// 在此路径上的车头角
		ar >> m_flength;//长度
	}

}

void CPaintSide::toChar(char *p_Char)
{
	
}

char * CPaintSide::toData(char *p_Char)
{
	
	return p_Char;			//返回指向成员变量的字符串后的位置
}

void CPaintSide::ChangeOrigin(CPnt pnt)//改变坐标原点
{	
	m_pointPrimary.x=m_pointPrimary.x-pnt.x;
	m_pointPrimary.y=m_pointPrimary.y-pnt.y;
	m_pointEnd.x=m_pointEnd.x-pnt.x;
	m_pointEnd.y=m_pointEnd.y-pnt.y;
}

//返回路段给定端点的姿态角(外射角)
double CPaintSide::ReturnPostureAngle(UINT id)
{
	double angle;
	if(m_uStartNodeId==id)
		angle=m_StartPostureAngle;
	else
		angle=m_EndPostureAngle;
	return angle;
}


void CPaintSide::GetPostureAngle()//计算得到路段的姿态角(外射角)
{
	m_StartPostureAngle=m_angHeading;	
	m_EndPostureAngle=m_angHeading;
}


//就近点判断函数,pnt1为鼠标点坐标,id为返回点的ID,pnt为返回点的坐标,angle为返回点的姿态角
//此函数只用于得到路径的起点!!
//返回值为TRUE表示有就近点,FALSE表示无就近点
BOOL CPaintSide::NearJudge1(CPnt pnt1,UINT& id,CPnt& pnt,double& angle)
{
	BOOL forreturn=FALSE;
	if(m_pDoc->m_nGraphSelect==1&&m_bSelect==TRUE)//若为参考线段
	{		
		if(!m_bReferencePoint)//参考点为终点
		{
			pnt.x=m_pointEnd.x;
			pnt.y=m_pointEnd.y;
			angle=m_EndPostureAngle;
			id=m_uEndNodeId;	
			forreturn=TRUE;
		}
		else//参考点为起点
		{
			pnt.x=m_pointPrimary.x;
			pnt.y=m_pointPrimary.y;
			angle=m_StartPostureAngle;
			id=m_uStartNodeId;
			forreturn=TRUE;
		}
	}
	else//若不为参考线段
	{		
		CPoint pointPrimary1,pointEnd1,point1;		
		DPtoVP(m_pointPrimary,pointPrimary1);
		DPtoVP(m_pointEnd,pointEnd1);
		DPtoVP(pnt1,point1);
		if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
		{				
			pnt.x=m_pointPrimary.x;
			pnt.y=m_pointPrimary.y;
			angle=m_StartPostureAngle;
			id=m_uStartNodeId;
			forreturn=TRUE;
		}
		else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
		{
			pnt.x=m_pointEnd.x;
			pnt.y=m_pointEnd.y;
			angle=m_EndPostureAngle;
			id=m_uEndNodeId;
			forreturn=TRUE;
		}
	}
	return forreturn;
}


//就近点判断函数,	
//pnt1为鼠标点坐标或计算得到的准终点坐标,
//id为返回点的ID,pnt为返回点的坐标,angle为返回点的姿态角
//此函数只用于得到路径的终点!!
//返回值为TRUE表示有就近点,FALSE表示无就近点
//当GetPathEndnode()函数调用此函数时
//应根据是否满足相切条件来决定此函数返回数据的取舍
BOOL CPaintSide::NearJudge2(CPnt pnt1,UINT& id,CPnt& pnt,double& angle)
{
	BOOL forreturn=FALSE;
	CPoint pointPrimary1,pointEnd1,point1;		
	DPtoVP(m_pointPrimary,pointPrimary1);
	DPtoVP(m_pointEnd,pointEnd1);
	DPtoVP(pnt1,point1);		
	if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
	{				
		pnt.x=m_pointPrimary.x;
		pnt.y=m_pointPrimary.y;
		angle=m_StartPostureAngle;
		id=m_uStartNodeId;
		forreturn=TRUE;
	}
	else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
	{
		pnt.x=m_pointEnd.x;
		pnt.y=m_pointEnd.y;
		angle=m_EndPostureAngle;
		id=m_uEndNodeId;
		forreturn=TRUE;
	}	
	return forreturn;
}

⌨️ 快捷键说明

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