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