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

📄 graphexpview.cpp

📁 实现了区域填充已经其他画线功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GraphExpView.cpp : implementation of the CGraphExpView class
//

#include "stdafx.h"
#include "GraphExp.h"

#include "GraphExpDoc.h"
#include "GraphExpView.h"
#include "CB2Line.h"
#include "fill.h"
#include "Rect3D.h"
#include "ThreeDimDlg.h"
#include "GraphicDisp.h"

#include <math.h>

#define LineLine	1
#define LineDDA		2
#define LineBresenham	3
#define MIDDPOINTCIRCLE		4
#define PNARC		5
#define DRAWPOINT	6
#define SLIPPOINT	7
#define SLIPCOHEN	8
#define CLIPBARSKY	9
#define DRAWPLOYGON	10
#define CLIPSHLINELEFT		12
#define CLIPSHLINERIGHT	13
#define CLIPSHLINEUP	14
#define CLIPSHLINEDOWN	15
#define CLIPSHRECT	16
#define CURVELUGRANGE	17
#define CURVEB2	18
#define CURVEB3	19
#define BEZIER2	20
#define BEZIER3	21
#define BEZIERN	22
#define EDGEFILL	23
#define SCANFILL	24
#define FLOODFILL	25
#define MOVEX	26
#define MOVEY	27
#define TRANSX	28
#define TRANSY	29
#define TRANS	30
#define DRAWCUBOID	31
#define TRANCUBOID	32

/*
#define BEZIERN	17
*/

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGraphExpView

IMPLEMENT_DYNCREATE(CGraphExpView, CView)

BEGIN_MESSAGE_MAP(CGraphExpView, CView)
	//{{AFX_MSG_MAP(CGraphExpView)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
	ON_COMMAND(ID_DRAW_DDA, OnDrawDda)
	ON_COMMAND(ID_DRAW_BRESENHAM, OnDrawBresenham)
	ON_COMMAND(ID_DRAW_MIDPOINTCIRCLE, OnDrawMidpointcircle)
	ON_COMMAND(ID_DRAW_PNARC, OnDrawPnarc)
	ON_COMMAND(ID_DRAW_POINT, OnDrawPoint)
	ON_COMMAND(ID_SLIP_POINT, OnSlipPoint)
	ON_COMMAND(ID_SLIP_COHEN, OnSlipCohen)
	ON_COMMAND(ID_CLIP_BARSKY, OnClipBarsky)
	ON_COMMAND(ID_DRAW_PLOYGON, OnDrawPloygon)
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_CLIP_SHLINEL, OnClipShlinel)
	ON_COMMAND(ID_CLIP_SHLINER, OnClipShliner)
	ON_COMMAND(ID_CLIP_SHLINEU, OnClipShlineu)
	ON_COMMAND(ID_CLIP_SHLINED, OnClipShlined)
	ON_COMMAND(ID_CLIP_SHRECT, OnClipShrect)
	ON_COMMAND(ID_CURVE_LUGRANGE, OnCurveLugrange)
	ON_COMMAND(ID_CURVE_B2, OnCurveB2)
	ON_COMMAND(ID_CURVE_B3, OnCurveB3)
	ON_COMMAND(ID_CUREV_BEZIER2, OnCurevBezier2)
	ON_COMMAND(ID_CUREV_BEZIER3, OnCurevBezier3)
	ON_COMMAND(ID_CUREV_BEZIERN, OnCurevBeziern)
	ON_COMMAND(ID_FILL_EDGE, OnFillEdge)
	ON_COMMAND(ID_FILL_SCAN, OnFillScan)
	ON_COMMAND(ID_FILL_FLOOD, OnFillFlood)
	ON_COMMAND(ID_MOVE_X, OnMoveX)
	ON_COMMAND(ID_MOVE_Y, OnMoveY)
	ON_COMMAND(ID_TRANS_X, OnTransX)
	ON_COMMAND(ID_TRANS_Y, OnTransY)
	ON_COMMAND(ID_TRANS, OnTrans)
	ON_COMMAND(ID_DRAW_CUBOID, OnDrawCuboid)
	ON_COMMAND(ID_TRAN_CUBOID, OnTranCuboid)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGraphExpView construction/destruction

CGraphExpView::CGraphExpView()
{
	// TODO: add construction code here
	m_Drag=0;
	m_MenuTool=0;
	m_LineNum=0;
	m_slipPointNum=0;
	m_Ploygon=new CPoint[POINTSNUM];
	m_numPloy=0;
	m_nLag=0;
	m_pLag=new CPoint[POINTSNUM];
	m_nB=0;
	m_pB=new CPoint[POINTSNUM];
	m_Bezier=new CPoint[POINTSNUM];
	m_numBezierN=0;
	m_nEdgeFill=0;
	polypoints=new int[POINTSNUM];
	m_pntPrev=0;
	m_pntOrigin=0;
	m_markRect3D=0;
}

CGraphExpView::~CGraphExpView()
{
	delete [] m_Ploygon;
	delete [] m_pLag;
	delete [] m_pB;
	delete [] m_Bezier;
//	delete [] polypoints;
}

BOOL CGraphExpView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,(HBRUSH)::GetStockObject(WHITE_BRUSH),0);

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphExpView drawing

void CGraphExpView::OnDraw(CDC* pDC)
{
	CGraphExpDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CGraphicDisp mydisp(pDC);

	int index;
	index=pDoc->GetLineNumber();
	while(index--)
		pDoc->GetLine(index).DrawLine(pDC);

	index=pDoc->GetB2LineNumber();
	while(index--)
		pDoc->Get_B2_Line(index).B2_Line(pDC);

	index=pDoc->GetB3LineNumber();
	while(index--)
		pDoc->Get_B3_Line(index).B3_Line(pDC);

	index=pDoc->GetBezier2LineNumber();
	while(index--)
		pDoc->Get_Bezier2_Line(index).Bezier2(pDC);

	index=pDoc->GetBezier3LineNumber();
	while(index--)
		pDoc->Get_Bezier3_Line(index).Bezier3(pDC);

	index=pDoc->GetBezierNLineNumber();
	while(index--)
		pDoc->Get_BezierN_Line(index).BezierN(pDC);
 
	index=pDoc->GetRect3Number();
	while(index--)
	{
	    COLORREF cool=pDoc->GetRect3(index).c_color;//获取存储的颜色
		CPoint a=pDoc->GetRect3(index).pLeft;  //获取长方体的控制点
		CPoint b=pDoc->GetRect3(index).pRdown;//获取长方体的控制点
	    CRect3D rect(cool,a,b);    //重新建立长方体对象
		//重画长方体
	    rect.SetRect3d();
		rect.RoundY(0.2);
		rect.RoundX(0.2);
	    rect.DrawRect3d(pDC);
	}

	if(m_MenuTool==SLIPCOHEN||m_MenuTool==CLIPBARSKY||m_MenuTool==CLIPSHRECT)
	{
		CPen pen(1,0,RGB(255,125,0));
		CPen* pOldPen=pDC->SelectObject(&pen);
		pDoc->DrawRect(pDC);
		pDC->SelectObject(pOldPen);
	}
	else 
	{
		CPen pen(2,0,RGB(0,125,255));
		CPen* pOldPen=pDC->SelectObject(&pen);
		CPoint p1,p2;
		if(m_MenuTool==CLIPSHLINELEFT||m_MenuTool==CLIPSHLINERIGHT)
		{
			p1.x=m_ClipLine.x;
			p1.y=0;
			p2.x=m_ClipLine.x;
			p2.y=1000;
		}
		if(m_MenuTool==CLIPSHLINEUP||m_MenuTool==CLIPSHLINEDOWN)
		{
			p1.y=m_ClipLine.y;
			p1.x=0;
			p2.y=m_ClipLine.y;
			p2.x=1000;
		}
			pDC->MoveTo(p1);
			pDC->LineTo(p2);
		pDC->SelectObject(pOldPen);
	}

	pDoc->DrawPloygon(pDC);
	pDoc->DrawLineDDA(pDC);
	pDoc->DrawLineBresenham(pDC);
	pDoc->DrawMidpointCircle(pDC);
	pDoc->DrawPnarc(pDC);
	pDoc->DrawPoint(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CGraphExpView printing

BOOL CGraphExpView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CGraphExpView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CGraphExpView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CGraphExpView diagnostics

#ifdef _DEBUG
void CGraphExpView::AssertValid() const
{
	CView::AssertValid();
}

void CGraphExpView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CGraphExpDoc* CGraphExpView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphExpDoc)));
	return (CGraphExpDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGraphExpView message handlers

void CGraphExpView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CGraphExpDoc *pDoc=GetDocument();
	CClientDC dc(this);

	if(m_MenuTool==DRAWPOINT)
	{
		dc.SetPixel(point.x,point.y,RGB(255,0,0));
	}
	else if(m_MenuTool==SLIPPOINT)
	{
		if(m_slipPointNum==0)
		{
			m_RngLU=point;
			m_slipPointNum=1;
		}
		else if(m_slipPointNum==1)
		{
			if(point.x>m_RngLU.x)
			{
				m_RngRD.x=point.x;
			}
			else 
			{
				m_RngRD.x=m_RngLU.x;
				m_RngLU.x=point.x;
			}

			if(point.y>m_RngLU.y)
			{
				m_RngRD.y=point.y;
			}
			else 
			{
				m_RngRD.y=m_RngLU.y;
				m_RngLU.y=point.y;
			}
			m_slipPointNum=0;
			pDoc->SlipPoint(m_RngLU,m_RngRD);
			Invalidate();	
		}
	}	
	else if(m_MenuTool==SLIPCOHEN)
	{
		if(m_slipPointNum==0)
		{
			m_RngLU=point;
			m_slipPointNum=1;
		}
		else if(m_slipPointNum==1)
		{
			if(point.x>m_RngLU.x)
			{
				m_RngRD.x=point.x;
			}
			else 
			{
				m_RngRD.x=m_RngLU.x;
				m_RngLU.x=point.x;
			}

			if(point.y>m_RngLU.y)
			{
				m_RngRD.y=point.y;
			}
			else 
			{
				m_RngRD.y=m_RngLU.y;
				m_RngLU.y=point.y;
			}
			m_slipPointNum=0;
			pDoc->ClipCohen(m_RngLU,m_RngRD);
		}
		Invalidate();	
	}
	else if(m_MenuTool==CLIPBARSKY)
	{
		if(m_slipPointNum==0)
		{
			m_RngLU=point;
			m_slipPointNum=1;
		}
		else if(m_slipPointNum==1)
		{
			if(point.x>m_RngLU.x)
			{
				m_RngRD.x=point.x;
			}
			else 
			{
				m_RngRD.x=m_RngLU.x;
				m_RngLU.x=point.x;
			}

			if(point.y>m_RngLU.y)
			{
				m_RngRD.y=point.y;
			}
			else 
			{
				m_RngRD.y=m_RngLU.y;
				m_RngLU.y=point.y;
			}
			m_slipPointNum=0;
			pDoc->ClipBarskyLine(m_RngLU,m_RngRD);
		}
		Invalidate();	

	}
	else if(m_MenuTool==LineLine)
	{
		m_pntPrev=point;
		m_pntOrigin=point;
		m_Drag=1;
		SetCapture();

		RECT rect;
		GetClientRect(&rect);
		ClientToScreen(&rect);
		ClipCursor(&rect);
	}
	else if(m_MenuTool==LineDDA)
	{
		if(m_LineNum==0)
		{
			m_LineNum=1;
			m_pntOrigin=point;
		}
		else if(m_LineNum=1)
		{
			m_LineNum=2;
			m_pntPrev=point;
		}
	}
	else if(m_MenuTool==LineBresenham)
	{
		if(m_LineNum==0)
		{
			m_LineNum=1;
			m_pntOriginB=point;
		}
		else if(m_LineNum=1)
		{
			m_LineNum=2;
			m_pntPrevB=point;
		}
	}
	else if(m_MenuTool==MIDDPOINTCIRCLE||m_MenuTool==PNARC)
	{
		if(m_LineNum==0)
		{
			m_LineNum=1;
			m_pntCircle=point;
		}
		else if(m_LineNum=1)
		{
			m_LineNum=2;
			m_CircleR=sqrt((m_pntCircle.x-point.x)*(m_pntCircle.x-point.x)+(m_pntCircle.y-point.y)*(m_pntCircle.y-point.y));
		}
	}
	else if(m_MenuTool==DRAWPLOYGON)
	{
		m_Ploygon[m_numPloy]=point;
		m_numPloy++;
		m_Drag=1;
		if(m_numPloy==1)
		{
			SetCapture;
			mPointOrign=point;//原点等于点中点
			mPointOld=point;  //将前一个点设为点中点的坐标
		}
		else
		{
			mPointOrign=mPointOld; //将上一个点设为原点
			mPointOld=point;       //将点中点设为原点
			dc.Polyline(m_Ploygon,m_numPloy);
		}
	}
	else if(m_MenuTool==CLIPSHLINELEFT)
	{
		if(m_slipPointNum==1)
		{
		pDoc->ClipSHLineL(point);
		m_ClipLine=point;
		Invalidate();	
		m_slipPointNum=0;
		}
	}
	else if(m_MenuTool==CLIPSHLINERIGHT)
	{
		if(m_slipPointNum==1)
		{
			pDoc->ClipSHLineR(point);
			m_ClipLine=point;
			Invalidate();	
			m_slipPointNum=0;
		}
	}
	else if(m_MenuTool==CLIPSHLINEUP)
	{
		if(m_slipPointNum==1)
		{
			pDoc->ClipSHLineU(point);
			m_ClipLine=point;
			Invalidate();	
			m_slipPointNum=0;
		}
	}
	else if(m_MenuTool==CLIPSHLINEDOWN)
	{
		if(m_slipPointNum==1)
		{
			pDoc->ClipSHLineD(point);
			m_ClipLine=point;
			Invalidate();	
			m_slipPointNum=0;
		}
	}
	else if(m_MenuTool==CLIPSHRECT)
	{
		if(m_slipPointNum==0)
		{
			m_RngLU=point;
			m_slipPointNum=1;
		}
		else if(m_slipPointNum==1)
		{
			if(point.x>m_RngLU.x)
			{
				m_RngRD.x=point.x;
			}
			else 
			{
				m_RngRD.x=m_RngLU.x;
				m_RngLU.x=point.x;
			}

			if(point.y>m_RngLU.y)
			{
				m_RngRD.y=point.y;
			}
			else 
			{
				m_RngRD.y=m_RngLU.y;
				m_RngLU.y=point.y;
			}
			m_slipPointNum=0;
			pDoc->ClipSHRect(m_RngLU,m_RngRD);
			Invalidate();	
		}
	}
	else if(m_MenuTool==CURVELUGRANGE)
	{
		m_pLag[m_nLag]=point;
		m_nLag++; 
	}
	else if(m_MenuTool==CURVEB2)
	{
		m_pB[m_nB]=point;
		m_nB++; 
		if(m_nB==3)
		{
			pDoc->AddLine(m_pB[0],m_pB[1]);
			pDoc->AddLine(m_pB[1],m_pB[2]);
			pDoc->Add_B2_Line(m_pB[0],m_pB[1],m_pB[2],RGB(255,0,255));
			m_nB=0;
			Invalidate();	
		}
	}
	else if(m_MenuTool==CURVEB3)
	{
		m_pB[m_nB]=point;
		m_nB++; 
		if(m_nB==4)
		{
			pDoc->AddLine(m_pB[0],m_pB[1]);
			pDoc->AddLine(m_pB[1],m_pB[2]);
			pDoc->AddLine(m_pB[2],m_pB[3]);
			pDoc->Add_B3_Line(m_pB[0],m_pB[1],m_pB[2],m_pB[3],RGB(125,0,125));
			m_nB=0;
			Invalidate();	
		}
	}	else if(m_MenuTool==BEZIER2)
	{
		m_pB[m_nB]=point;
		m_nB++; 
		if(m_nB==3)
		{
			pDoc->AddLine(m_pB[0],m_pB[1]);
			pDoc->AddLine(m_pB[1],m_pB[2]);
			pDoc->Add_Bezier2_Line(m_pB[0],m_pB[1],m_pB[2],RGB(0,0,255));
			m_nB=0;
			Invalidate();	
		}
	}
	else if(m_MenuTool==BEZIER3)
	{
		m_pB[m_nB]=point;
		m_nB++; 
		if(m_nB==4)
		{
			pDoc->AddLine(m_pB[0],m_pB[1]);
			pDoc->AddLine(m_pB[1],m_pB[2]);
			pDoc->AddLine(m_pB[2],m_pB[3]);
			pDoc->Add_Bezier3_Line(m_pB[0],m_pB[1],m_pB[2],m_pB[3],RGB(0,125,125));
			m_nB=0;
			Invalidate();	
		}
	}
	else if(m_MenuTool==BEZIERN)
	{
		m_Bezier[m_numBezierN]=point;
		m_numBezierN++; 
	}
	else if(m_MenuTool==MOVEX)
	{
		if(m_pntPrev.x!=0&&m_pntPrev.y!=0&&m_pntOrigin.x!=0&&m_pntOrigin.y!=0)
		{
			m_temp.y=point.y;
			m_temp.x=(point.y-m_pntPrev.y)*(m_pntOrigin.x-m_pntPrev.x)/(m_pntOrigin.y-m_pntPrev.y)+m_pntPrev.x;
			m_temp1.x=(point.x-m_temp.x)+m_pntPrev.x;
			m_temp1.y=m_pntPrev.y;
			m_temp2.x=(point.x-m_temp.x)+m_pntOrigin.x;
			m_temp2.y=m_pntOrigin.y;
			pDoc->AddLineBresenham(m_temp1.x,m_temp1.y,m_temp2.x,m_temp2.y,RGB(0,0,125));
			Invalidate();	
		}
	}
	else if(m_MenuTool==MOVEY)
	{
		if(m_pntPrev.x!=0&&m_pntPrev.y!=0&&m_pntOrigin.x!=0&&m_pntOrigin.y!=0)
		{
			m_temp.x=point.x;
			m_temp.y=(point.x-m_pntPrev.x)*(m_pntOrigin.y-m_pntPrev.y)/(m_pntOrigin.x-m_pntPrev.x)+m_pntPrev.y;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -