📄 graphexpdoc.cpp
字号:
m_Set=LineSetR(m_RctLU,m_RctRD);
}
else
m_Set=LineSetL(m_RctLU,m_RctRD);
//将窗外端点移到交点处并重新编码
if(m_code==m_code1)
{
m_pStart=m_Set;
Code(m_pStart,m_RctLU,m_RctRD,m_code1);
}
else
{
m_pEnd=m_Set;
Code(m_pEnd,m_RctLU,m_RctRD,m_code2);
}
}
else
done=0;
}while(done);
AddLineDDA(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,RGB(255,0,255));
AddRect(m_RctLU,m_RctRD);
}
int CGraphExpDoc::ClipBarskyTest(float p, float q, float *u1, float *u2)
{
int flag=1; /*flag为标志变量,0:表示舍弃;1:表示可见。*/
float r;
if(p<0.0)
{
r=q/p;
if(r>*u2)
flag=0;
else if(r>*u1)
*u1=r; /*u1取"进入"点的最大参数值*/
}
else if(q>0.0)
{
r=q/p;
if(r<*u1)
flag=0;
else if(r<*u2)
*u2=r; /*u2取"离开" 点的最小参数值*/
}
else if(q<0.0) /*p=0,且q<0。平行于边界,而且在界外的线*/
flag=0;
return flag;
}
void CGraphExpDoc::ClipBarskyLine(CPoint m_RctLU, CPoint m_RctRD)
{
float u1=0.0,u2=1.0,dx,dy;
dx=m_pEnd.x-m_pStart.x;
if(ClipBarskyTest(-dx,m_pStart.x-m_RctLU.x,&u1,&u2))
if(ClipBarskyTest(dx,m_RctRD.x-m_pStart.x,&u1,&u2))
{
dy=m_pEnd.y-m_pStart.y;
if(ClipBarskyTest(-dy,m_pStart.y-m_RctLU.y,&u1,&u2))
if(ClipBarskyTest(dy,m_RctRD.y-m_pStart.y,&u1,&u2))
{
if(u2<1.0)
{
m_pEnd.x=m_pStart.x+u2*dx;
m_pEnd.y=m_pStart.y+u2*dy;
}
if(u1>0.0)
{
m_pStart.x=m_pStart.x+u1*dx;
m_pStart.y=m_pStart.y+u1*dy;
}
AddLineDDA(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,RGB(255,255,0));
AddRect(m_RctLU,m_RctRD);
}
}
}
void CGraphExpDoc::AddPloygon(CPoint *m_Ploy,int m_numPloy)
{
m_Ploygon=new CPoint[PLOYGONNUM];
m_Ploygon=m_Ploy;
m_nPloy=m_numPloy;
}
void CGraphExpDoc::DrawPloygon(CDC *pDC)
{
pDC->Polygon(m_Ploygon,m_nPloy);
}
void CGraphExpDoc::ClipSHLineL(CPoint blan)
{
CPoint m_temp;
int flag;
m_temp=m_Ploygon[m_nPloy-1];
CPoint m_pSet;
CPoint *m_ps=new CPoint[100];
if(m_temp.x>blan.x)
flag=0;
else
flag=1;
int j=0;
for(int i=0;i<m_nPloy;i++)
{
if(m_Ploygon[i].x>blan.x)
{
if(flag!=0)
{
flag=0;
m_pSet.x=blan.x;
m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
m_ps[j]=m_pSet;
j++;
}
m_ps[j]=m_Ploygon[i];
j++;
}
else
{
if(flag==0)
{
flag=1;
m_pSet.x=blan.x;
m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
m_ps[j]=m_pSet;
j++;
}
}
m_temp=m_Ploygon[i];
}
m_Ploygon=m_ps;
m_nPloy=j;
AddPloygon(m_Ploygon,m_nPloy);
}
void CGraphExpDoc::ClipSHLineR(CPoint blan)
{
CPoint m_temp;
int flag;
m_temp=m_Ploygon[m_nPloy-1];
CPoint m_pSet;
CPoint *m_ps=new CPoint[100];
if(m_temp.x<blan.x)
flag=0;
else
flag=1;
int j=0;
for(int i=0;i<m_nPloy;i++)
{
if(m_Ploygon[i].x<blan.x)
{
if(flag!=0)
{
flag=0;
m_pSet.x=blan.x;
m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
m_ps[j]=m_pSet;
j++;
}
m_ps[j]=m_Ploygon[i];
j++;
}
else
{
if(flag==0)
{
flag=1;
m_pSet.x=blan.x;
m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
m_ps[j]=m_pSet;
j++;
}
}
m_temp=m_Ploygon[i];
}
m_Ploygon=m_ps;
m_nPloy=j;
AddPloygon(m_Ploygon,m_nPloy);
}
void CGraphExpDoc::ClipSHLineU(CPoint blan)
{
CPoint m_temp;
int flag;
m_temp=m_Ploygon[m_nPloy-1];
CPoint m_pSet;
CPoint *m_ps=new CPoint[100];
if(m_temp.y>blan.y)
flag=0;
else
flag=1;
int j=0;
for(int i=0;i<m_nPloy;i++)
{
if(m_Ploygon[i].y>blan.y)
{
if(flag!=0)
{
flag=0;
m_pSet.y=blan.y;
m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
m_ps[j]=m_pSet;
j++;
}
m_ps[j]=m_Ploygon[i];
j++;
}
else
{
if(flag==0)
{
flag=1;
m_pSet.y=blan.y;
m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
m_ps[j]=m_pSet;
j++;
}
}
m_temp=m_Ploygon[i];
}
m_Ploygon=m_ps;
m_nPloy=j;
AddPloygon(m_Ploygon,m_nPloy);
}
void CGraphExpDoc::ClipSHLineD(CPoint blan)
{
CPoint m_temp;
int flag;
m_temp=m_Ploygon[m_nPloy-1];
CPoint m_pSet;
CPoint *m_ps=new CPoint[100];
if(m_temp.y<blan.y)
flag=0;
else
flag=1;
int j=0;
for(int i=0;i<m_nPloy;i++)
{
if(m_Ploygon[i].y<blan.y)
{
if(flag!=0)
{
flag=0;
m_pSet.y=blan.y;
m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
m_ps[j]=m_pSet;
j++;
}
m_ps[j]=m_Ploygon[i];
j++;
}
else
{
if(flag==0)
{
flag=1;
m_pSet.y=blan.y;
m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
m_ps[j]=m_pSet;
j++;
}
}
m_temp=m_Ploygon[i];
}
m_Ploygon=m_ps;
m_nPloy=j;
AddPloygon(m_Ploygon,m_nPloy);
}
void CGraphExpDoc::ClipSHRect(CPoint m_RctLU, CPoint m_RctRD)
{
ClipSHLineL(m_RctLU);
ClipSHLineR(m_RctRD);
ClipSHLineU(m_RctLU);
ClipSHLineD(m_RctRD);
AddRect(m_RctLU,m_RctRD);
}
void CGraphExpDoc::AddRect(CPoint m_RctLU, CPoint m_RctRD)
{
m_RngLU=m_RctLU;
m_RngRD=m_RctRD;
}
void CGraphExpDoc::DrawRect(CDC *pDC)
{
CRect rect(m_RngLU,m_RngRD);
pDC->Rectangle(rect);
}
void CGraphExpDoc::Add_Bezier2_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, COLORREF color)
{
m_vBezier2.push_back(CB_Line(m_p1,m_p2,m_p3,color));
}
CB_Line CGraphExpDoc::Get_Bezier2_Line(int index)
{
return m_vBezier2.at(index);
}
int CGraphExpDoc::GetBezier2LineNumber()
{
return m_vBezier2.size();
}
void CGraphExpDoc::Add_Bezier3_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, CPoint m_p4, COLORREF color)
{
m_vBezier3.push_back(CB_Line(m_p1,m_p2,m_p3,m_p4,color));
}
CB_Line CGraphExpDoc::Get_Bezier3_Line(int index)
{
return m_vBezier3.at(index);
}
int CGraphExpDoc::GetBezier3LineNumber()
{
return m_vBezier3.size();
}
void CGraphExpDoc::Add_B2_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, COLORREF color)
{
m_vB2Lines.push_back(CB_Line(m_p1,m_p2,m_p3,color));
}
CB_Line CGraphExpDoc::Get_B2_Line(int index)
{
return m_vB2Lines.at(index);
}
int CGraphExpDoc::GetB2LineNumber()
{
return m_vB2Lines.size();
}
void CGraphExpDoc::Add_B3_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, CPoint m_p4, COLORREF color)
{
m_vB3Lines.push_back(CB_Line(m_p1,m_p2,m_p3,m_p4,color));
}
CB_Line CGraphExpDoc::Get_B3_Line(int index)
{
return m_vB3Lines.at(index);
}
int CGraphExpDoc::GetB3LineNumber()
{
return m_vB3Lines.size();
}
int CGraphExpDoc::GetBezierNLineNumber()
{
return m_vBezierN.size();
}
CB_Line CGraphExpDoc::Get_BezierN_Line(int index)
{
return m_vBezierN.at(index);
}
void CGraphExpDoc::Add_BezierN_Line(CPoint *m_Bezier,int num,COLORREF color)
{
m_vBezierN.push_back(CB_Line(m_Bezier,num,color));
}
void CGraphExpDoc::AddRect3(COLORREF color, CPoint pStart, CPoint pEnd)
{
m_vRect3.push_back(CRect3D(color,pStart,pEnd));
SetModifiedFlag();
}
CRect3D CGraphExpDoc::GetRect3(int index)
{
return m_vRect3.at(index);
}
int CGraphExpDoc::GetRect3Number()
{
return m_vRect3.size();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -