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

📄 paintlazys.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	bbb.y=int(Bang1.y);
	if (!rect.PtInRect(bbb))
		return FALSE;
	else
	{
		//进一步判断点是否在曲线上		
		double yyyy=calculate(Bang1.x,mm,nn);
		if(fabs(yyyy-Bang1.y)<5)
			return TRUE;
		else
			return FALSE;
	}
}

void CPaintLazys::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 CPaintLazys::Serialize(CArchive& ar)
{
	CPainted::Serialize(ar);
	if (ar.IsStoring())
	{
		ar << m_pointEnd;
		ar << m_angStart;
	
	}
	else
	{
		ar >> m_pointEnd;
		ar >> m_angStart;
	}
}


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

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

//得到路径的绘制起点
//pnt1 为传递的鼠标点坐标或给定的起点坐标,
//id为返回点的ID,
//pnt为返回点的坐标,angle为返回点的姿态角
//return FALSE表示无就近点
//return TRUE表示有就近点
BOOL CPaintLazys::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 CPaintLazys::GetPathStartnode(CPnt& pnt1, CPnt& pnt2)
{
	
	return 1;
}

//得到路径的绘制终点
//返回值==FALSE时表示终点独立(不与任何节点相连)
//返回值==TRUE时表示终点与某节点相连
//
BOOL CPaintLazys::GetPathEndnode1(CPnt& pnt1)
{
	BOOL  forreturn=FALSE;
	CPainted*	pPainted;		
	if(m_pDoc->m_LazysPaintMode==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;
		}				
	}
	return forreturn;
}


//得到路径的绘制终点
//返回值==FALSE时表示终点独立(不与任何节点相连)
//返回值==TRUE时表示终点与某节点相连
//
BOOL CPaintLazys::GetPathEndnode(CPnt& pnt1)
{	
	 return 1;
}

/*
double CPaintLazys::Distance1(double x1, double y1, double x2, double y2)
{
return (double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

void CPaintLazys::toChar(char *p_Char)
{
	double x1,y1,x2,y2,Speed,Length,Angle;
	UINT PathId,StartId,StartType,EndId,EndType,HeadDir,Guide,Obstacle;
	x1=m_pointPrimary.x;
	y1=m_pointPrimary.y;
	x2=m_pointEnd.x;
	y2=m_pointEnd.y;

	Speed=m_fPathLimit;//速度限制
	Length=m_flength;//直线长度
	Angle=m_fangle;//直线角度
	PathId=m_uPathId;//路径ID 5
	StartId=m_uStartNodeId;//起点ID 5
	StartType=m_uStartNodeType;//起点类型 2
	EndId=m_uEndNodeId;//终点ID 5
	EndType=m_uEndNodeType;//终点类型 2
	HeadDir=m_uPathHeading;//路径车头方向 2
	Guide=m_uPathGuideType;//导航方式 1
	Obstacle=m_uPathObstacle;//路径障碍物模式 4	
	char p1[126];
	//把格式化数据写到字符串
	sprintf(p1,"%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%5d,%5d,%2d,%5d,%2d,%2d,%1d,%4d\n",
		x1,y1,x2,y2,Speed,Length,Angle,PathId,StartId,
		StartType,EndId,EndType,HeadDir,Guide,Obstacle);
	p1[125]=0;
	lstrcat(p_Char,p1);//增加在p_Char字符串后
}

char * CPaintLazys::toData(char *p_Char)
{
	float x1,y1,x2,y2,Speed,Length,Angle;
	UINT PathId,StartId,StartType,EndId,EndType,HeadDir,Guide,Obstacle;
	char p1[126];
	strncpy(p1,p_Char,125);	//拷贝一个125字节长度的字符串
	p_Char+=125;			//指向成员变量的字符串后的位置
	p1[125]=0;
	//从字符串读格式化数据
	sscanf(p1,"%f,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d\n",
		&x1,&y1,&x2,&y2,&Speed,&Length,&Angle,&PathId,&StartId,
		&StartType,&EndId,&EndType,&HeadDir,&Guide,&Obstacle);
	m_pointPrimary.x=x1;
	m_pointPrimary.y=y1;
	m_pointEnd.x=x2;
	m_pointEnd.y=y2;

	m_fPathLimit=Speed;//速度限制
	m_flength=Length;//直线长度
	m_fangle=Angle;//直线角度
	m_uPathId=PathId;//路径ID
	m_uStartNodeId=StartId;//起点ID
	m_uStartNodeType=StartType;//起点类型
	m_uEndNodeId=EndId;//终点ID
	m_uEndNodeType=EndType;//终点类型
	m_uPathHeading=HeadDir;//路径车头方向
	m_uPathGuideType=Guide;//导航方式
	m_uPathObstacle=Obstacle;//路径障碍物模式
	return p_Char;			//返回指向成员变量的字符串后的位置
}
*/

void CPaintLazys::Move(double x_Move,double y_Move)
{
	//移动直线的起点和终点坐标
	m_pointPrimary.x+=x_Move;
	m_pointEnd.x+=x_Move;
	m_pointPrimary.y+=y_Move;
	m_pointEnd.y+=y_Move;
}




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

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

void CPaintLazys::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 CPaintLazys::ReturnPostureAngle(UINT id)
{
	double angle;
	if(m_uStartNodeId==id)
		angle=m_StartPostureAngle;
	else
		angle=m_EndPostureAngle;
	return angle;
}

void CPaintLazys::GetPostureAngle()//计算得到路段的姿态角(外射角)
{
	m_StartPostureAngle=m_angStart+pi;
	if(m_StartPostureAngle>=2*pi) m_StartPostureAngle-=2*pi;
	m_EndPostureAngle=m_angStart;

}

//就近点判断函数,	
//pnt1为鼠标点坐标或计算得到的准终点坐标,
//id为返回点的ID,pnt为返回点的坐标,angle为返回点的姿态角
//此函数只用于得到路径的终点!!
//返回值为TRUE表示有就近点,FALSE表示无就近点
//当GetPathEndnode()函数调用此函数时
//应根据是否满足相切条件来决定此函数返回数据的取舍
BOOL CPaintLazys::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;
}
//就近点判断函数,pnt1为鼠标点坐标,id为返回点的ID,pnt为返回点的坐标,angle为返回点的姿态角
//此函数只用于得到路径的起点!!
//返回值为TRUE表示有就近点,FALSE表示无就近点
BOOL CPaintLazys::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;
}



void CPaintLazys::IsDblClkPath(void *pTemp1, void *pTemp2)
{
	loop11:
	m_pDoc = (CPaintobjDoc*) pTemp1;
	CLazysAttrDlg lazysattr;				
	lazysattr.m_pDoc =(CPaintobjDoc*) pTemp1;
	lazysattr.m_pActive1=this;	
	lazysattr.m_dAngle=m_angStart*180.0/pi;	
	lazysattr.m_uEndId =m_uEndNodeId;

	lazysattr.m_uId = m_uPathId;
	UINT id=m_uPathId;
	lazysattr.m_dLimit = m_fPathLimit;
	lazysattr.m_uStartId =m_uStartNodeId;
	lazysattr.m_nGuide=m_uPathGuideType;
	int result=lazysattr.DoModal();
	if(result==IDOK)
	{
		//如果更改了路径编号,不能与某存在的路径编号相同
		//必须定义新的路径编号
		CPainted*	pPainter;				
		if(id!=lazysattr.m_uId)
		{
			BOOL breturn=FALSE;
			int nShapes = m_pDoc->NumShapes();
			for (int index = 0; index < nShapes; index++)
			{
				pPainter =m_pDoc->GetShape(index);
				if(pPainter->m_uPathId==lazysattr.m_uId)
				{
					CString str="更改后的路径编号不能与某存在的路径编号相同,必须重新定义新的路径编号!";
					AfxMessageBox(str);
					breturn=TRUE;
					break;
				}
			}
			if(breturn)	{goto loop11;}
		}
		
//		m_uPathHeading=lazysattr.m_nHead;
		m_uPathId=lazysattr.m_uId;
		m_fPathLimit=lazysattr.m_dLimit;
		m_uPathGuideType=lazysattr.m_nGuide;
		m_pDoc->GetPathIdMax();			
	}
}

void CPaintLazys::IsDblClkBuilding(void *pTemp1, void *pTemp2)
{
	CBuildingLazysAttrDlg lazysattr;	
	lazysattr.m_dAngle=m_angStart*180.0/pi;	
	lazysattr.m_dStartx=m_pointPrimary.x;//起点坐标
	lazysattr.m_dStarty=m_pointPrimary.y;//起点坐标
	lazysattr.m_dEndx=m_pointEnd.x;//终点坐标
	lazysattr.m_dEndy=m_pointEnd.y;//终点坐标
	int result=lazysattr.DoModal();
	if(result==IDOK)
	{		
		if(m_pointPrimary.x!=lazysattr.m_dStartx||m_pointPrimary.y!=lazysattr.m_dStarty
			||m_pointEnd.x!=lazysattr.m_dEndx||m_pointEnd.y!=lazysattr.m_dEndy)
		{
			m_pointPrimary.x=lazysattr.m_dStartx;//起点坐标
			m_pointPrimary.y=lazysattr.m_dStarty;//起点坐标
			m_pointEnd.x=lazysattr.m_dEndx;//终点坐标
			m_pointEnd.y=lazysattr.m_dEndy;//终点坐标		
			GetPostureAngle();
			((CPaintobjView*) pTemp2)->Invalidate();
		}
	}
}

void CPaintLazys::IsDblClkDevice(void *pTemp1, void *pTemp2)
{
	CDeviceLazysAttrDlg lazysattr;	
	lazysattr.m_nDeviceId=m_nDeviceId;
	lazysattr.m_nSomeStatus=m_nSomeStatus;
	lazysattr.m_nStatusNumber=m_nStatusNumber;
	lazysattr.m_dAngle=m_angStart*180.0/pi;	
	lazysattr.m_dStartx=m_pointPrimary.x;//起点坐标
	lazysattr.m_dStarty=m_pointPrimary.y;//起点坐标
	lazysattr.m_dEndx=m_pointEnd.x;//终点坐标
	lazysattr.m_dEndy=m_pointEnd.y;//终点坐标
	int result=lazysattr.DoModal();
	if(result==IDOK)
	{
		m_nDeviceId=lazysattr.m_nDeviceId;
		m_nSomeStatus=lazysattr.m_nSomeStatus;
		m_nStatusNumber=lazysattr.m_nStatusNumber;
		if(m_pointPrimary.x!=lazysattr.m_dStartx||m_pointPrimary.y!=lazysattr.m_dStarty
			||m_pointEnd.x!=lazysattr.m_dEndx||m_pointEnd.y!=lazysattr.m_dEndy)
		{
			m_pointPrimary.x=lazysattr.m_dStartx;//起点坐标
			m_pointPrimary.y=lazysattr.m_dStarty;//起点坐标
			m_pointEnd.x=lazysattr.m_dEndx;//终点坐标
			m_pointEnd.y=lazysattr.m_dEndy;//终点坐标		
			GetPostureAngle();
			((CPaintobjView*) pTemp2)->Invalidate();
		}
	}
}



//用CPath数据初始化CPaintLine数据
void CPaintLazys::Init(CPath* pPath)
{
	CLazysPath* pLazysPath=((CLazysPath*) pPath);
	USHORT StartNodeId=pLazysPath->m_uStartNode;//起点ID
	USHORT EndNodeId=pLazysPath->m_uEndNode;//终点ID
	CNode* pStartNode=m_pDoc->GetNode(StartNodeId);
	CNode* pEndNode=m_pDoc->GetNode(EndNodeId);

	
	m_pointPrimary=CPnt(pStartNode->x,pStartNode->y);//起点坐标	
	m_uStartNodeId=StartNodeId;//起点ID
	m_uStartNodeType=pStartNode->m_uType;//起点类型
	m_uStartNodeExtType=pStartNode->m_uExtType;//起点扩展类型
	m_fStartHeading=pStartNode->m_fHeading;//起点车头方向角(度)

	m_pointEnd=CPnt(pEndNode->x,pEndNode->y);//终点坐标
	m_uEndNodeId=EndNodeId;//终点ID
	m_uEndNodeType=pEndNode->m_uType;//终点类型
	m_uEndNodeExtType=pEndNode->m_uExtType;//终点扩展类型
	m_fEndHeading=pEndNode->m_fHeading;//终点车头方向角(度)

	m_uFigureType=2;		//路径类型
	m_uPathId=pLazysPath->m_uId;		//路径ID
	m_fPathLimit=pLazysPath->m_fVeloLimit;	//速度限制
	m_uPathGuideType=pLazysPath->m_uGuideType;	//导航方式
	m_uPathExtType=pLazysPath->m_uExtType;	//路径扩展类型		
	m_angStart=pLazysPath->m_angStart;   // 起点的倾斜角(世界坐标系中)
	m_uObjectType=0;//地图对象的类型0=路径1=建筑2=设备		
	
	GetPostureAngle();//计算得到路段的姿态角(外射角)	
	
}

⌨️ 快捷键说明

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