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

📄 fiveview.cpp

📁 五点光滑法的MFC实现
💻 CPP
字号:
// FiveView.cpp : implementation of the CFiveView class
//

#include "stdafx.h"
#include "Five.h"

#include "FiveDoc.h"
#include "FiveView.h"
#include <math.h>

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

/////////////////////////////////////////////////////////////////////////////
// CFiveView

IMPLEMENT_DYNCREATE(CFiveView, CView)

BEGIN_MESSAGE_MAP(CFiveView, CView)
	//{{AFX_MSG_MAP(CFiveView)
	ON_COMMAND(ID_BUTTON_LIAN, OnButtonLian)
	ON_WM_LBUTTONDOWN()
	ON_WM_CANCELMODE()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CFiveView construction/destruction

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

}

CFiveView::~CFiveView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFiveView drawing

void CFiveView::OnDraw(CDC* pDC)
{
	CFiveDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	//CString str="Point";LPRECT lp;

	std::list<CPoint>::iterator it1;
	it1 = points.begin();
	
	for(;it1!=points.end();it1++)
	{
		pDC->MoveTo(*it1);
		pDC->Ellipse(it1->x-5,it1->y-5,it1->x+5,it1->y+5);
		//pDC->DrawText(str,lp,DT_BOTTOM);
	}
	
	if(Lian==1&&points.size()!=0){
		it1 = points.begin();
		std::list<CPoint>::iterator it2;
		std::list<CS>::iterator p_cs;
		it2 = it1;
		it2++;
		p_cs = this->cs.begin();
		
		
		for(;p_cs!=cs.end()&&it2!=points.end();){    //画一小段光滑曲线
			drawpartofthecurve(*p_cs,pDC,*it1,*it2);
			p_cs++;
			it1++;
			it2++;
		}
	}
	
}

void CFiveView::drawpartofthecurve(CS cs,CDC* pDC,CPoint pt1,CPoint pt2)
{
	double x,y;
	for(x=pt1.x;x<=pt2.x;x++){
		CPoint temp_pt;
		y = cs.a0 + cs.a1*(x - pt1.x) + cs.a2*(x - pt1.x)*(x - pt1.x) +cs.a3*(x - pt1.x)*(x - pt1.x)*(x - pt1.x);
		temp_pt.x = x;
		temp_pt.y = y;
		pDC->SetPixel(temp_pt,RGB(0,0,0));
	}
}

/////////////////////////////////////////////////////////////////////////////
// CFiveView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CFiveView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CFiveView message handlers

void CFiveView::OnButtonLian() 
{
	// TODO: Add your command handler code here
	Lian = 1;
	

	if(points.size()>=3)
		{
			this->k.clear();
			this->t.clear();
			figure_k_t(points,k,t);
			guanghua(points,cs);
		} 

	this->Invalidate();	
	
}

void CFiveView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	this->points.push_back(point);
	CView::OnLButtonDown(nFlags, point);
	this->Invalidate();
}

void CFiveView::OnCancelMode() 
{
	CView::OnCancelMode();
	
	// TODO: Add your message handler code here
	
}

void CFiveView::figure_k_t(std::list<CPoint>& points,std::list<double>& k,std::list<double>& t)
{
	std::list<CPoint>::iterator pt1;
	std::list<CPoint>::iterator pt2;
	pt1 = points.begin();         
	pt2 = points.begin();                   
    pt2++;                      
	
	int i,n;
	double temp_k;
	double temp_t;
	n = points.size();
	
	//得到k
	for(i=1;i<n;i++){
		temp_k = double(pt2->y - pt1->y)/(pt2->x- pt1->x);
		k.push_back(temp_k);
		pt1++;
		pt2++;
	}
	
	std::list<double>::iterator pk_1;
	std::list<double>::iterator pk_2;
	/*
	//开曲线前面补充两个端点,得到相应的ki,k.insert(position,ki)
	
	pk_1 = k.begin();
	pk_2 = pk_1;
	pk_2++;
	
	double a,b;
	b = 2*(*pk_1) - *pk_2;
	a = 2*b - *pk_1;
	
	k.insert(k.begin(),b);
	k.insert(k.begin(),a);
	
	
	//开曲线后面补充两个端点,得到相应的ki, k.push_back(ki)
	for(i=0; i<n-2; i++){
		pk_1++;
	}
	for(i=1; i<n-1; i++){
		pk_2++;
	}
	double c,d;
	
	c = 2*(*pk_2) - *pk_1;
	d = 2*c - *pk_2;
	k.push_back(c);
	k.push_back(d);
	
    //链表中总共的k有 n+3 个
	*/

	//得到t
	std::list<double>::iterator pk1;
	std::list<double>::iterator pk2;
	std::list<double>::iterator pk3;
	std::list<double>::iterator pk4;
	std::list<double>::iterator pktemp;
	pk1 = k.begin();
	pk2 = pk1;
	pk3 = pk1;
	pk4 = pk1;
	pktemp=pk1;
	
	pk2++;
	pk3++;
	pk3++;
	pk4++;
	pk4++;
	pk4++;
	
	
	for(i=0;i<n;i++){
		temp_t = double(fabs(*pk4 - *pk3)*(*pk2) + fabs(*pk2 + *pk1)*(*pk3))
			/(fabs(*pk4 - *pk3) + fabs(*pk2 + *pk1));
		t.push_back(temp_t);
		pk1++;
		pk2++;
		pk3++;
		pk4++;
	}
	//k.pop_front();
	//k.pop_front();
}

void CFiveView::guanghua(std::list<CPoint>& points,std::list<CS>& cs)
{
	//得到分段光滑的三次多项式参数
	int i=0,n;
	n = points.size();
	
	std::list<CPoint>::iterator it1;
	std::list<CPoint>::iterator it2;
	std::list<double>::iterator pt1;
	std::list<double>::iterator pt2;
	std::list<double>::iterator pk;
	it1 = points.begin();
	it2 = it1;
	it2++;
	pt1 = t.begin();
	pt2 = pt1;
	pt2++;
	pk = k.begin();
	CS temp_cs;
	for(i=0; i<n; i++){
		temp_cs.a0 = it1->y;
		temp_cs.a1 = *pt1;
		temp_cs.a2 = double(3*(*pk) - 2*(*pt1) - *pt2)/(it2->x - it1->x);
		temp_cs.a3 = double(*pt2 + *pt1 - 2*(*pk))/((it2->x - it1->x)*(it2->x - it1->x));
		
		cs.push_back(temp_cs);
		it1++;
		it2++;
		pt1++;
		pt2++;
		pk++;
	}
	
}

⌨️ 快捷键说明

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