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

📄 cdaview.cpp

📁 Sutherland-Hodgeman多边形裁剪算法:
💻 CPP
字号:
// CDAView.cpp : implementation of the CCDAView class
//

#include "stdafx.h"
#include "CDA.h"

#include "malloc.h"

#include "CDADoc.h"
#include "CDAView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CCDAView

IMPLEMENT_DYNCREATE(CCDAView, CView)

BEGIN_MESSAGE_MAP(CCDAView, CView)
	//{{AFX_MSG_MAP(CCDAView)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_Polygon, OnPolygon)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CCDAView construction/destruction

CCDAView::CCDAView()
{
	// TODO: add construction code here

	nvert = 0;
	//l = 0 ;
	//r = 0;
	//b = 0;
	t = 0;
}

CCDAView::~CCDAView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCDAView drawing

void CCDAView::OnDraw(CDC* pDC)
{
	CCDADoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CCDAView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCDAView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCDAView message handlers
void CCDAView::draw_polygon()
{
	CClientDC dc(this);
	CPen  *OldPen,RedPen(PS_SOLID,1,RGB(255,0,0));
	OldPen = dc.SelectObject(&RedPen);
	dc.MoveTo(vert[0]);
	for ( int i = 0; i<nvert - 1;i ++)
	{
		dc.LineTo (vert[i+1]);
	}
	dc.SelectObject(OldPen);
}
void CCDAView::draw_win()
{
    CClientDC dc(this);
	CPen  *OldPen,GreenPen(PS_SOLID,1,RGB(0,255,0));
	OldPen = dc.SelectObject(&GreenPen);
	dc.MoveTo(150,150);
	dc.LineTo(150,300);
	dc.LineTo(300,300);
	dc.LineTo(300,150);
	dc.LineTo(150,150);
	dc.SelectObject(OldPen);
}
void CCDAView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	vert[nvert] = point;
	nvert ++;
	draw_polygon();
	CView::OnLButtonDown(nFlags, point);
}

void CCDAView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	draw_win();
	CClientDC dc(this);
	CPen  *OldPen,RedPen(PS_SOLID,1,RGB(255,0,0));
	OldPen = dc.SelectObject(&RedPen);
	dc.MoveTo(vert[0]);
	dc.LineTo(vert[nvert-1]);
	CView::OnRButtonDown(nFlags, point);
}

void CCDAView::draw_clip() 
{
	//left.............
	CPoint lvert[300];
	int l = 0;
	for( int i = 0;i<nvert-1 ;i++)
	{
		if(vert[i].x<150){
			if(vert[i+1].x>=150){
				lvert[l].x = 150;
			    lvert[l].y = vert[i].y+(vert[i+1].y - vert[i].y)*(150 - vert[i].x)/(vert[i+1].x-vert[i].x);
			    l++;
				lvert[l] = vert[i+1];
				l++;
			}
		}
		else if(vert[i+1].x>=150){
			lvert[l] = vert[i+1];
			l++;
		}
		else {
			lvert[l].x = 150;
			lvert[l].y = vert[i].y+(vert[i+1].y -vert[i].y)*(150 - vert[i].x)/(vert[i+1].x - vert[i].x);
		    l++;
		}
	}
	if(vert[nvert-1].x<150){
		if(vert[0].x>=150){
			lvert[l].x = 150;
		    lvert[l].y = vert[nvert-1].y+(vert[0].y - vert[nvert-1].y)*(150 - vert[nvert-1].x)/(vert[0].x-vert[nvert-1].x);
		    l++;
		    lvert[l] = vert[0];
		}
	}
	else if(vert[0].x>=150)
	{ 
		lvert[l] = vert[0];
	}
	else{
		lvert[l].x = 150;
		lvert[l].y = vert[nvert-1].y+(vert[0].y -vert[nvert-1].y)*(150 - vert[nvert-1].x)/(vert[0].x - vert[nvert-1].x);
	}
	//right..............
	CPoint rvert[300];
	int r = 0;
	for(int j = 0; j <l;j++)
	{
		if(lvert[j].x>300){
		    if(lvert[j+1].x<=300)
			{
				rvert[r].x = 300;
			    rvert[r].y = lvert[j].y + (lvert[j+1].y - lvert[j].y)*(300 - lvert[j].x)/(lvert[j+1].x - lvert[j].x);
			    r++;
				rvert[r] = lvert[j+1];
				r++;
			}
		}
		else if(lvert[j+1].x>300)
		{
			rvert[r].x = 300;
			rvert[r].y = lvert[j].y + (lvert[j+1].y - lvert[j].y)*(300 - lvert[j].x)/(lvert[j+1].x - lvert[j].x);
		    r++;
		}
		else{
			rvert[r] = lvert[j+1];
		    r++;
		}		
	}
	if(lvert[l].x>300){
		if(lvert[0].x<=300)
		{
			rvert[r].x = 300;
		    rvert[r].y = lvert[l].y + (lvert[0].y - lvert[l].y)*(300 - lvert[l].x)/(lvert[0].x - lvert[l].x);
		    r++;
		    rvert[r] = lvert[0];
		}
	}
	else if(lvert[0].x>300)
	{
		rvert[r].x = 300;
		rvert[r].y = lvert[l].y + (lvert[0].y - lvert[l].y)*(300 - lvert[l].x)/(lvert[0].x - lvert[l].x);
	}
	else{
		rvert[r] = lvert[0];
	}

	
	//bottom...............
	CPoint bvert[300];
	int b = 0;
	for(int k = 0;k < r;k++)
	{
		if(rvert[k].y < 150){
			if(rvert[k+1].y>=150)
			{
				bvert[b].y = 150;
			    if(rvert[k].x != rvert[k+1].x)
				{ 
			       bvert[b].x = (150-rvert[k].y)*(rvert[k+1].x-rvert[k].x)/(rvert[k+1].y-rvert[k].y)+rvert[k].x;
				}
                else{
				   bvert[b].x = rvert[k].x;
				}
				b++;
			    bvert[b] = rvert[k+1];
				b++;
			}
		}
		else if(rvert[k+1].y<150)
		{
			bvert[b].y = 150;
			if(rvert[k].x != rvert[k+1].x)
			{
			bvert[b].x = (150-rvert[k].y)*(rvert[k+1].x-rvert[k].x)/(rvert[k+1].y-rvert[k].y)+rvert[k].x;
			}
			else{
				bvert[b].x = rvert[k].x;
			}
			b++;
		}
		else{
			bvert[b] = rvert[k+1];
			b++;
		}
	}
	if(rvert[r].y<150){
		if(rvert[0].y>=150)
		{
			bvert[b].y = 150;
		    if(rvert[r].x != rvert[0].x)
			{
		       bvert[b].x = (150-rvert[r].y)*(rvert[0].x-rvert[r].x)/(rvert[0].y-rvert[r].y)+rvert[r].x;
			}
			else{
		       bvert[b].x = rvert[r].x;
			}
		    b++;
		    bvert[b] = rvert[0];
		}
	}
	else if(rvert[0].y<150)
	{   
		bvert[b].y = 150;
		if(rvert[r].x != rvert[0].x)
		{		
		   bvert[b].x = (150-rvert[r].y)*(rvert[0].x-rvert[r].x)/(rvert[0].y-rvert[r].y)+rvert[r].x;
		}
        else		
		{
		   bvert[b].x = rvert[r].x;
		}
	}
	else{
		bvert[b] = rvert[0];
	}
	
	//top..............
	for(int n = 0; n<b;n++)
	{
		if(bvert[n].y>300){
			if(bvert[n+1].y<=300)
			{
				tvert[t].y = 300;
			    if(bvert[n].x !=bvert[n+1].x)
				{
			       tvert[t].x = (300 - bvert[n].y)*(bvert[n+1].x-bvert[n].x)/(bvert[n+1].y-bvert[n].y)+bvert[n].x;
				}
			    else
				{
				   tvert[t].x = bvert[n].x;
				}
				t++;
			    tvert[t] = tvert[n+1];
				t++;
			}
		}
		else if(bvert[n+1].y>300)
		{
			tvert[t].y = 300;
			if(bvert[n].x != bvert[n+1].x)
			{
			tvert[t].x = (300 - bvert[n].y)*(bvert[n+1].x-bvert[n].x)/(bvert[n+1].y-bvert[n].y)+bvert[n].x;
			}
			else
				tvert[t].x = bvert[n].x;
			t++;
		}
		else {
			tvert[t] = bvert[n+1];
		    t++;
		}
	}
	if(bvert[b].y>300){
		if(bvert[0].y<=300)
		{
			tvert[t].y = 300;
            if(bvert[b].x != bvert[0].x)
			{
		       tvert[t].x = (300 - bvert[b].y)*(bvert[0].x-bvert[b].x)/(bvert[0].y-bvert[b].y)+bvert[b].x;
			}
		    else
			   tvert[t].x = bvert[b].x;
		    t++;
		    tvert[t] = tvert[0];	
		}
	}
	else if(bvert[0].y>300)
	{
		tvert[t].y = 300;
		if(bvert[b].x != bvert[0].x)
		{
		tvert[t].x = (300 - bvert[b].y)*(bvert[0].x-bvert[b].x)/(bvert[0].y-bvert[b].y)+bvert[b].x;
		}else
             tvert[t].x = bvert[b].x;
	}
	else {
		tvert[t] = bvert[0];
	}
}
void CCDAView::OnPolygon() 
{
	// TODO: Add your command handler code here
	draw_clip();
	CClientDC dc(this);
    CPen  *OldPen,BulePen(PS_SOLID,1,RGB(0,0,255));
	OldPen = dc.SelectObject(&BulePen);
	dc.MoveTo(tvert[0]);
	for(int i=0;i<t;i++)
	{
		dc.LineTo(tvert[i+1]);
	}
	dc.MoveTo(tvert[0]);
	dc.LineTo(tvert[t]);
	dc.SelectObject(OldPen);
}

⌨️ 快捷键说明

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