📄 paintside.cpp
字号:
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 + -