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