📄 graphexpview.cpp
字号:
m_temp1.y=(point.y-m_temp.y)+m_pntPrev.y;
m_temp1.x=m_pntPrev.x;
m_temp2.y=(point.y-m_temp.y)+m_pntOrigin.y;
m_temp2.x=m_pntOrigin.x;
pDoc->AddLineBresenham(m_temp1.x,m_temp1.y,m_temp2.x,m_temp2.y,RGB(50,0,125));
Invalidate();
}
}
else if(m_MenuTool==TRANSX)
{
if(m_pntPrev.x!=0&&m_pntPrev.y!=0&&m_pntOrigin.x!=0&&m_pntOrigin.y!=0)
{
m_temp1.x=(point.x-m_pntPrev.x)*2+m_pntPrev.x;
m_temp1.y=m_pntPrev.y;
m_temp2.x=(point.x-m_pntOrigin.x)*2+m_pntOrigin.x;
m_temp2.y=m_pntOrigin.y;
pDoc->AddLineBresenham(m_temp1.x,m_temp1.y,m_temp2.x,m_temp2.y,RGB(50,125,10));
Invalidate();
}
}
else if(m_MenuTool==TRANSY)
{
if(m_pntPrev.x!=0&&m_pntPrev.y!=0&&m_pntOrigin.x!=0&&m_pntOrigin.y!=0)
{
m_temp1.y=(point.y-m_pntPrev.y)*2+m_pntPrev.y;
m_temp1.x=m_pntPrev.x;
m_temp2.y=(point.y-m_pntOrigin.y)*2+m_pntOrigin.y;
m_temp2.x=m_pntOrigin.x;
pDoc->AddLineBresenham(m_temp1.x,m_temp1.y,m_temp2.x,m_temp2.y,RGB(50,125,100));
Invalidate();
}
}
else if(m_MenuTool==DRAWCUBOID)
{
m_pRect3Ds=point;
m_pRect3De=point;
m_markRect3D=1;
}
SetCapture();
CView::OnLButtonDown(nFlags, point);
}
void CGraphExpView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC;
pDC=GetDC();
SetCursor(m_hCursor);
CClientDC dc(this);
CStatusBar *pStatus;
pStatus=(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CString str;
if(pStatus)
{
str.Format("x=%3d,y=%3d",point.x,point.y);
pStatus->SetPaneText(1,str);
}
if(m_MenuTool==LineLine)
{
if(m_Drag)
{
dc.SetROP2(R2_NOT);
dc.MoveTo(m_pntOrigin);
dc.LineTo(m_pntPrev);
dc.MoveTo(m_pntOrigin);
dc.LineTo(point);
m_pntPrev=point;
}
}
else if((m_MenuTool==SLIPPOINT||m_MenuTool==SLIPCOHEN||m_MenuTool==CLIPBARSKY||m_MenuTool==CLIPSHRECT)&&m_slipPointNum==1)
{
dc.Rectangle(m_RngLU.x,m_RngLU.y,point.x,point.y);
}
else if(m_MenuTool==DRAWPLOYGON)
{
if(m_Drag)
{
dc.SetROP2(R2_NOT);
if(mPointOld!=point)//如果鼠标的现在移动点与上一个点不相同
//将上一个顶点到上一个移动点的直线擦除,绘制从上一个顶点到移动点的直线
{
dc.MoveTo(mPointOrign);
dc.LineTo(mPointOld); //擦除原来的直线
dc.MoveTo(mPointOrign);
dc.LineTo(point); //重画移动到点的直线
mPointOld=point;
}
}
}
else if(m_MenuTool==DRAWCUBOID&&m_markRect3D==1)
{
pDC->SetROP2(R2_NOT); //设置反色实现橡皮线功能
CRect3D rect(RGB(125,125,125),m_pRect3Ds,m_pRect3De);
rect.SetRect3d();
rect.RoundY(0.2);
rect.RoundX(0.2);
rect.DrawRect3d(pDC);
CRect3D rect1(RGB(125,125,255),m_pRect3Ds,point);
rect1.SetRect3d();
rect1.RoundY(0.2);
rect1.RoundX(0.2);
rect1.DrawRect3d(pDC);
//保存长方体的控制点
Lrecord=m_pRect3Ds;
m_pRect3De=point;
Rrecord=point;
pDC->SetROP2(R2_COPYPEN);
}
ReleaseDC(pDC);
CView::OnMouseMove(nFlags, point);
}
void CGraphExpView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CGraphExpDoc *pDoc=GetDocument();
CDC *pDC;
pDC=GetDC();
int m_nMaxX=GetSystemMetrics(SM_CXSCREEN); //获取屏幕x的最大值
if(m_MenuTool==DRAWPOINT)
{
pDoc->AddPoint(point);
}
if(m_MenuTool==LineLine)
{
m_pntPrev=point;
pDoc->AddLine(m_pntOrigin,point);
if(m_Drag)
{
m_Drag=0;
ClipCursor(NULL);
}
}
else if(m_MenuTool==LineDDA)
{
if(m_LineNum==2)
{
m_LineNum=0;
pDoc->AddLineDDA(m_pntOrigin.x,m_pntOrigin.y,m_pntPrev.x,m_pntPrev.y,RGB(255,0,0));
Invalidate();
}
}
else if(m_MenuTool==LineBresenham)
{
if(m_LineNum==2)
{
m_LineNum=0;
pDoc->AddLineBresenham(m_pntOriginB.x,m_pntOriginB.y,m_pntPrevB.x,m_pntPrevB.y,RGB(0,255,0));
Invalidate();
}
}
else if(m_MenuTool==MIDDPOINTCIRCLE)
{
if(m_LineNum==2)
{
m_LineNum=0;
pDoc->AddMidpointCircle(m_pntCircle.x,m_pntCircle.y,m_CircleR,RGB(0,0,255));
Invalidate();
}
}
else if(m_MenuTool==PNARC)
{
if(m_LineNum==2)
{
m_LineNum=0;
pDoc->AddPnarc(m_pntCircle.x,m_pntCircle.y,m_CircleR,RGB(0,255,255));
Invalidate();
}
}
else if(m_MenuTool==SCANFILL)
{
CFill sc;
//设置填充图形的边界颜色和填充颜色
unsigned boundary_color=RGB(0,0,0);
unsigned fill_color=RGB(0,255,255); //RGB(255,255,0);
CPoint p;
p.x=point.x; p.y=point.y;
int getx=p.x+1;
int gety=p.y;
unsigned int color;
color=pDC->GetPixel(p);
while(pDC->GetPixel(getx,gety)==color)
getx++;
if(getx>=m_nMaxX-4)
MessageBox("你没选中图形或者选的图形没有封闭");
else
{
boundary_color=pDC->GetPixel(getx,gety);
//调用sc类的函数,函数的参数分别是输入种子点,填充图形的边界颜色,填充颜色
sc.Scan_Fill(pDC,p,RGB(0,0,0),RGB(0,255,255));
}
}
else if(m_MenuTool==FLOODFILL)
{
CFill sc;
CPoint P;
P.x=point.x;
P.y=point.y;
//获取洪水填充的背景色和
unsigned int old_color;
old_color=pDC->GetPixel(point);
//给填充颜色赋初值
unsigned int fill_color=RGB(0,125,0);//RGB(255,0,0);
if(fill_color==old_color)
MessageBox("请选一种颜色");
else
//调用洪水填充函数 参数分别是种子点, 填充图形的背景颜色 填充颜色
sc.Flood_Fill_8(pDC,P,old_color,fill_color);
}
else if(m_MenuTool==EDGEFILL)
{
CFill at;
//该函数输入的参数分别是要填充多边形的顶点数,多边形的顶点数组,填充的颜色
at.poly_fill(pDC,(int)m_nEdgeFill/2,polypoints,RGB(0,125,0));
}
else if(m_MenuTool==DRAWCUBOID&&m_markRect3D==1)
{
m_pRect3De=point;
CRect3D rect(RGB(150,50,50),m_pRect3Ds,m_pRect3De);
rect.SetRect3d();
//////实现投影变换
rect.RoundY(0.2);
rect.RoundX(0.2);
rect.DrawRect3d(pDC);
pDoc->AddRect3(RGB(150,50,50),m_pRect3Ds,m_pRect3De);
m_markRect3D=0;
Invalidate();
}
ReleaseCapture();
CView::OnLButtonUp(nFlags, point);
}
void CGraphExpView::OnDrawLine()
{
// TODO: Add your command handler code here
m_MenuTool=LineLine;
}
void CGraphExpView::OnDrawDda()
{
// TODO: Add your command handler code here
m_MenuTool=LineDDA;
}
void CGraphExpView::OnDrawBresenham()
{
// TODO: Add your command handler code here
m_MenuTool=LineBresenham;
}
void CGraphExpView::OnDrawMidpointcircle()
{
// TODO: Add your command handler code here
m_MenuTool=MIDDPOINTCIRCLE;
}
void CGraphExpView::OnDrawPnarc()
{
// TODO: Add your command handler code here
m_MenuTool=PNARC;
}
void CGraphExpView::OnDrawPoint()
{
// TODO: Add your command handler code here
m_MenuTool=DRAWPOINT;
}
void CGraphExpView::OnSlipPoint()
{
// TODO: Add your command handler code here
m_MenuTool=SLIPPOINT;
}
void CGraphExpView::OnSlipCohen()
{
// TODO: Add your command handler code here
m_MenuTool=SLIPCOHEN;
}
void CGraphExpView::OnClipBarsky()
{
// TODO: Add your command handler code here
m_MenuTool=CLIPBARSKY;
}
void CGraphExpView::OnDrawPloygon()
{
// TODO: Add your command handler code here
m_MenuTool=DRAWPLOYGON;
}
void CGraphExpView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC;
pDC=GetDC();
CClientDC dc(this);
CGraphExpDoc *pDoc=GetDocument();
int i=m_numPloy;
if(m_MenuTool==DRAWPLOYGON)
{
//保存封闭多边形并重新绘制封闭多边形
if(m_numPloy==2)
{
MessageBox("多边形的顶点不能少于三个,请重新绘制!","信息提示");
dc.MoveTo(m_Ploygon[0].x,m_Ploygon[0].y);
dc.LineTo(m_Ploygon[1].x,m_Ploygon[1].y);
}
else
{
pDoc->AddPloygon(m_Ploygon,m_numPloy);
if(m_Drag)
{
m_Drag=0;
ClipCursor(NULL);
}
for(m_nEdgeFill=0;m_nEdgeFill<=2*(m_numPloy-1);m_nEdgeFill++)
{
polypoints[m_nEdgeFill]=m_Ploygon[i-1].x;
polypoints[m_nEdgeFill+1]=m_Ploygon[i-1].y;
m_nEdgeFill++;
i--;
}
i=0;
m_numPloy=0;
}
Invalidate();
}
else if(m_MenuTool==CURVELUGRANGE)
{
if(m_nLag<4)
MessageBox("请输入大于4个控制点");
else
{
Lugrange(m_pLag,m_nLag,30);
m_nLag=0;
}
}
else if(m_MenuTool==BEZIERN)
{
if(m_numBezierN!=0)
{
pDoc->Add_BezierN_Line(m_Bezier,m_numBezierN-1,RGB(0,255,125));
m_numBezierN=0;
Invalidate();
}
}
ReleaseCapture();
CView::OnRButtonDown(nFlags, point);
}
void CGraphExpView::OnClipShlinel()
{
// TODO: Add your command handler code here
m_MenuTool=CLIPSHLINELEFT;
}
void CGraphExpView::OnClipShliner()
{
// TODO: Add your command handler code here
m_MenuTool=CLIPSHLINERIGHT;
}
void CGraphExpView::OnClipShlineu()
{
// TODO: Add your command handler code here
m_MenuTool=CLIPSHLINEUP;
}
void CGraphExpView::OnClipShlined()
{
// TODO: Add your command handler code here
m_MenuTool=CLIPSHLINEDOWN;
}
void CGraphExpView::OnClipShrect()
{
// TODO: Add your command handler code here
m_MenuTool=CLIPSHRECT;
}
void CGraphExpView::Lugrange(CPoint *aa, int k, int l_section)
{
CDC *pDC;
pDC=GetDC();
float blend[4][100],f_blend[4][100],l_blend[4][100];
float u,v,w;
CPoint sm[4];
int x,y;
for(int i=0;i<l_section;i++)
{
u=float(i)/float (l_section);
blend[0][i]=u*(u-1)*(u-2)/(-6);
blend[1][i]=(u+1)*(u-1)*(u-2)/2;
blend[2][i]=(u+1)*u*(u-2)/(-2);
blend[3][i]=(u+1)*u*(u-1)/6;
v=u-1;
f_blend[0][i]=v*(v-1)*(v-2)/(-6);
f_blend[1][i]=(v+1)*(v-1)*(v-2)/2;
f_blend[2][i]=(v+1)*v*(v-2)/(-2);
f_blend[3][i]=(v+1)*v*(v-1)/6;
w=u+1;
l_blend[0][i]=w*(w-1)*(w-2)/(-6);
l_blend[1][i]=(w+1)*(w-1)*(w-2)/2;
l_blend[2][i]=(w+1)*w*(w-2)/(-2);
l_blend[3][i]=(w+1)*w*(w-1)/6;
}
for(i=0;i<4;i++)
{
sm[i].x=aa[i].x;
sm[i].y=aa[i].y;
}
pDC->MoveTo(aa[0].x,aa[0].y);
for(int j=0;j<l_section;j++)
{
x=y=0;
for(i=0;i<4;i++)
{
x=x+sm[i].x*f_blend[i][j];
y=y+sm[i].y*f_blend[i][j];
}
pDC->LineTo(x,y);
}
for(int m=4;m<k;m++)
{
for(j=0;j<l_section;j++)
{
x=y=0;
for(i=0;i<4;i++)
{
x=x+sm[i].x*blend[i][j];
y=y+sm[i].y*blend[i][j];
}
pDC->LineTo(x,y);
}
for(i=0;i<3;i++)
{
sm[i].x=sm[i+1].x;
sm[i].y=sm[i+1].y;
}
sm[3].x=aa[m].x;
sm[3].y=aa[m].y;
}
for(j=0;j<l_section;j++)
{
x=y=0;
for(i=0;i<4;i++)
{
x=x+sm[i].x*l_blend[i][j];
y=y+sm[i].y*l_blend[i][j];
}
pDC->LineTo(x,y);
}
pDC->LineTo(sm[3].x,sm[3].y);
pDC->DeleteDC();
}
void CGraphExpView::OnCurveLugrange()
{
// TODO: Add your command handler code here
m_nLag=0;
m_MenuTool=CURVELUGRANGE;
}
void CGraphExpView::OnCurveB2()
{
// TODO: Add your command handler code here
m_nB=0;
m_MenuTool=CURVEB2;
}
void CGraphExpView::OnCurveB3()
{
// TODO: Add your command handler code here
m_nB=0;
m_MenuTool=CURVEB3;
}
void CGraphExpView::OnCurevBezier2()
{
// TODO: Add your command handler code here
m_MenuTool=BEZIER2;
}
void CGraphExpView::OnCurevBezier3()
{
// TODO: Add your command handler code here
m_MenuTool=BEZIER3;
}
void CGraphExpView::OnCurevBeziern()
{
// TODO: Add your command handler code here
m_numBezierN=0;
m_MenuTool=BEZIERN;
}
void CGraphExpView::OnFillEdge()
{
// TODO: Add your command handler code here
m_MenuTool=EDGEFILL;
}
void CGraphExpView::OnFillScan()
{
// TODO: Add your command handler code here
m_MenuTool=SCANFILL;
}
void CGraphExpView::OnFillFlood()
{
// TODO: Add your command handler code here
m_MenuTool=FLOODFILL;
}
void CGraphExpView::OnMoveX()
{
// TODO: Add your command handler code here
m_MenuTool=MOVEX;
}
void CGraphExpView::OnMoveY()
{
// TODO: Add your command handler code here
m_MenuTool=MOVEY;
}
void CGraphExpView::OnTransX()
{
// TODO: Add your command handler code here
m_MenuTool=TRANSX;
}
void CGraphExpView::OnTransY()
{
// TODO: Add your command handler code here
m_MenuTool=TRANSY;
}
void CGraphExpView::OnTrans()
{
// TODO: Add your command handler code here
m_MenuTool=TRANS;
}
void CGraphExpView::OnDrawCuboid()
{
// TODO: Add your command handler code here
m_MenuTool=DRAWCUBOID;
}
void CGraphExpView::OnTranCuboid()
{
// TODO: Add your command handler code here
CThreeDimDlg dlg;
if(dlg.DoModal()==IDOK)
{
thx=dlg.m_roundX;//向X轴旋转的角度
thy=dlg.m_roundY;
thz=dlg.m_roundZ;
x=dlg.m_moveX; //向X轴移动的长度
y=dlg.m_moveY;
z=dlg.m_moveZ;
ThreeDimChange();
}
}
void CGraphExpView::ThreeDimChange()
{
//获取图形环境
CDC*pDC;
pDC=GetDC();
CRect3D rect(RGB(50,50,150),Lrecord,Rrecord);
//设置长方体的参数
rect.SetRect3d();
CPen Newpen1(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen1=pDC->SelectObject(&Newpen1);
rect.RoundY(pi*thy/180+0.2); //////实现绕Y轴旋转
rect.RoundX(thx*pi/180+0.2);//////实现绕X轴旋转
rect.RoundZ(pi*thz/180);//////////实现绕Z轴旋转
rect.DrawRect3d(pDC);////////////////画出旋转后的长方体
rect.Reset3D(); ////////////////恢复旋转前的长方体
/////实现长方体的平移//////////
pDC->SelectObject(pOldPen1);
CPen Newpen2(PS_SOLID,1,RGB(0,255,0));
CPen *pOldPen2=pDC->SelectObject(&Newpen2);
rect.MoveX(x); //////////沿X轴平移
rect.MoveY(y); //////////沿Y轴平移
rect.MoveZ(z); //////////沿Z轴平移
////////实现长方体的几何观察////////////////
rect.RoundY(0.2);
rect.RoundX(0.2);
rect.DrawRect3d(pDC); //////////画出平移后的长方体
rect.Reset3D(); //////////恢复平移前的长方体
pDC->SelectObject(pOldPen2); ////////返回画笔
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -