📄 fiveview.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 + -