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

📄 cmeanview.cpp

📁 用cmean方法做的模式识别聚类程序.通过测量各点之间的距离来确定类别数
💻 CPP
字号:
// CmeanView.cpp : implementation of the CCmeanView class
//

#include "stdafx.h"
#include "Cmean.h"

#include "CmeanDoc.h"
#include "CmeanView.h"

#include <cmath>

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

#define PI 3.1415926535
/////////////////////////////////////////////////////////////////////////////
// CCmeanView

IMPLEMENT_DYNCREATE(CCmeanView, CView)

BEGIN_MESSAGE_MAP(CCmeanView, CView)
	//{{AFX_MSG_MAP(CCmeanView)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_CHECK_POINTNUM, OnCheckPointnum)
	ON_COMMAND(ID_CLASS_CMEAN, OnClassCmean)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCmeanView construction/destruction

COLORREF HSI2RGB(unsigned int iH,double dS,double dI)
{
	ASSERT(iH>=0 && iH<=360 && dS>=0 && dS<=1 && dI>=0 && dS<=1);
	double cR,cG,cB;
	if(iH>=0 && iH <120)
	{
		iH=iH*PI/180;
		cB=dI*(1-dS);
		cR=dI*(1+dS*cos(iH)/cos(PI/3-iH));
		cG=1-(cR+cB);
	}
	else if(iH>=120 && iH<240)
	{
		iH-=120;
		iH=iH*PI/180;
		cR=dI*(1-dS);
		cG=dI*(1+dS*cos(iH)/cos(PI/3-iH));
		cB=1-(cR+cG);
	}
	else
	{
		iH-=240;
		iH=iH*PI/180;
		cG=dI*(1-dS);
		cB=dI*(1+dS*cos(iH)/cos(PI/3-iH));
		cR=1-(cG+cB);
	}
	return RGB((char)(cR*255),(char)(cG*255),(char)(cB*255));
}

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

}

CCmeanView::~CCmeanView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCmeanView drawing

void CCmeanView::OnDraw(CDC* pDC)
{
	CCmeanDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	int LENGTH=pDoc->GetDataLength();

	int PatternNum=pDoc->GetCenterListNum();

	pSample s;
	if(LENGTH>0 && PatternNum>0)
	{
		for(int i=0;i<LENGTH;i++)
		{
			s=pDoc->GetSample(i);
			CPen pen(PS_SOLID,3,HSI2RGB((360/PatternNum)*(s->pattern),1,0.5));
			CPen *pOldPen=pDC->SelectObject(&pen);

			pDC->MoveTo(s->point.x-1,s->point.y);
			pDC->LineTo(s->point.x+1,s->point.y);
			pDC->SelectObject(pOldPen);
		}
	}
	else if(LENGTH>0)
	{
		for(int i=0;i<LENGTH;i++)
		{
			s=pDoc->GetSample(i);
			CPen pen(PS_SOLID,3,RGB(255,0,0));
			CPen *pOldPen=pDC->SelectObject(&pen);

			pDC->MoveTo(s->point.x-1,s->point.y);
			pDC->LineTo(s->point.x+1,s->point.y);
			pDC->SelectObject(pOldPen);
		}
	}
	
}

/////////////////////////////////////////////////////////////////////////////
// CCmeanView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CCmeanView message handlers

void CCmeanView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	//每次在窗口上点一下,就代表取了一个点
	CView::OnLButtonDown(nFlags, point);
	CDC * pDC=GetDC();
	int i,j;

	for(i=-1;i<=1;i++)
	{
		for(j=-1;j<=1;j++)
		{
			pDC->SetPixel(point.x+i,point.y+j,RGB(255,0,0));
		}
	}

	
	Sample s;
	s.point=point;
	s.pattern=0;//初始化的点不属于任何一个类别
	s.centerflag=0;//初始化的点不是聚类中心

	CCmeanDoc *pDoc=GetDocument();
	pDoc->SetSample(&s);
}

void CCmeanView::OnCheckPointnum() 
{
	// TODO: Add your command handler code here
	CCmeanDoc * pDoc=GetDocument();
	pDoc->mlmsDistance();
}

void CCmeanView::OnClassCmean() 
{
	// TODO: Add your command handler code here
	CCmeanDoc * pDoc=GetDocument();
	if(pDoc->cmean())
	{
		InvalidateRect( NULL, TRUE );
		UpdateWindow();
	}
}

⌨️ 快捷键说明

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