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