⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphexpview.cpp

📁 实现了区域填充已经其他画线功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -