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

📄 bangyongview.cpp

📁 K均值和ISODATA分类两种算法
💻 CPP
字号:
// BangYongView.cpp : implementation of the CBangYongView class
//

#include "stdafx.h"
#include "BangYong.h"

#include "BangYongDoc.h"
#include "BangYongView.h"
#include "KCanShuDlg.h"
#include "ISODCanShuDlg.h"
#include "ShuoMingDlg.h"

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

//引用声明全局变量,用于在右下角显示坐标
extern CStatusBar  m_wndStatusBar;

/////////////////////////////////////////////////////////////////////////////
// CBangYongView

IMPLEMENT_DYNCREATE(CBangYongView, CView)

BEGIN_MESSAGE_MAP(CBangYongView, CView)
	//{{AFX_MSG_MAP(CBangYongView)
	ON_COMMAND(ID_READFILE, OnReadfile)
	ON_COMMAND(ID_KJUNZHI, OnKjunzhi)
	ON_COMMAND(ID_ISODATA, OnIsodata)
	ON_COMMAND(ID_SHUAXIN, OnShuaxin)
	ON_COMMAND(ID_SHUOMING, OnShuoming)
	ON_WM_MOUSEMOVE()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CBangYongView construction/destruction

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

}

CBangYongView::~CBangYongView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CBangYongView drawing

void CBangYongView::OnDraw(CDC* pDC)
{
	CBangYongDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	//定义坐标系及显示范围框架坐标点
	CPoint zuobiao[9];
	zuobiao[0].x=0;zuobiao[0].y=0;
	zuobiao[1].x=-10;zuobiao[1].y=0;
	zuobiao[2].x=10;zuobiao[2].y=0;
	zuobiao[3].x=0;zuobiao[3].y=-10;
	zuobiao[4].x=0;zuobiao[4].y=10;
	zuobiao[5].x=-10;zuobiao[5].y=-10;
	zuobiao[6].x=-10;zuobiao[6].y=10;
	zuobiao[7].x=10;zuobiao[7].y=10;
	zuobiao[8].x=10;zuobiao[8].y=-10;
	
    //  显示作者信息
	pDC->SetTextColor(RGB(150,180,200));  //设置文本颜色为青灰色
	pDC->TextOut(25,190,"*****************************************");
	pDC->TextOut(27,200,"鼠标停在某处,右下角显示该点坐标");
	pDC->TextOut(25,220,"*****************************************");
	pDC->TextOut(50,300,"这是一个非监督法分类函数");
	pDC->TextOut(50,350,"作者:覃帮勇");
	pDC->TextOut(50,400,"学号:200532590013");
	pDC->TextOut(50,450,"完成时间:25/11/2007");

	//	绘制绘图坐标系
	CPoint p;
	p=dbhuan(zuobiao[0]);
	pDC->Ellipse(p.x-2,p.y-2,p.x+2,p.y+2);//原点
	pDC->MoveTo(dbhuan(zuobiao[1]));
	pDC->LineTo(dbhuan(zuobiao[2]));
	p.x=dbhuan(zuobiao[2]).x-5;
	p.y=dbhuan(zuobiao[2]).y-5;
	pDC->LineTo(p);
	pDC->MoveTo(dbhuan(zuobiao[2]));
	p.y=p.y+10;
	pDC->LineTo(p);
	pDC->TextOut(p.x+10,p.y-15,"X1");//水平坐标轴
	
	pDC->MoveTo(dbhuan(zuobiao[3]));
	pDC->LineTo(dbhuan(zuobiao[4]));
	p.x=dbhuan(zuobiao[4]).x-5;
	p.y=dbhuan(zuobiao[4]).y+5;
	pDC->LineTo(p);
	pDC->MoveTo(dbhuan(zuobiao[4]));
	p.x=p.x+10;
	pDC->LineTo(p);
	pDC->TextOut(p.x-5,p.y-25,"X2");//垂直坐标轴

	CString str;
	int i,j;

	//绘制横坐标值
	p.x=-9;p.y=0;
	for(i=-9;i<10;i++){
		str.Format("%d",i);
		if(i!=0){
			if(i>0){
				pDC->TextOut(dbhuan(p).x-3,dbhuan(p).y+2,str);
			}
			else{
				pDC->TextOut(dbhuan(p).x-7,dbhuan(p).y+2,str);
			}
			pDC->MoveTo(dbhuan(p).x,dbhuan(p).y+1);
			pDC->LineTo(dbhuan(p).x,dbhuan(p).y-2);
		}
		p.x++;
		
	}

	//绘制纵坐标值
	p.x=0;p.y=-9;
	for(i=-9;i<10;i++){
		str.Format("%d",i);
		if(i==0){
			pDC->TextOut(dbhuan(p).x-10,dbhuan(p).y+1,str);
		}
		else if(i<0){
			pDC->TextOut(dbhuan(p).x-14,dbhuan(p).y-7,str);
		}
		else{
			pDC->TextOut(dbhuan(p).x-10,dbhuan(p).y-7,str);
		}
		pDC->MoveTo(dbhuan(p).x-1,dbhuan(p).y);
		pDC->LineTo(dbhuan(p).x+2,dbhuan(p).y);
		p.y++;
	}


	
	//定义新画笔(灰色虚线)
	CPen * pPenOld,PenNew;
	PenNew.CreatePen(PS_DASH,0,RGB(192,192,192));
	pPenOld=pDC->SelectObject(&PenNew);
	//绘制绘图坐标系范围
	pDC->MoveTo(dbhuan(zuobiao[5]));
	pDC->LineTo(dbhuan(zuobiao[6]));
	pDC->LineTo(dbhuan(zuobiao[7]));
	pDC->LineTo(dbhuan(zuobiao[8]));
	pDC->LineTo(dbhuan(zuobiao[5]));
	pDC->SelectObject(pPenOld);
	PenNew.DeleteObject();

	//预设10种类别的颜色
	int x[KINDMAX][3]={{255,0,0},{0,255,0},{0,0,255},{255,200,0},{255,0,250}
	                   ,{0,255,250},{180,0,0},{0,120,0},{200,255,0},{0,0,0}};

    //绘出待分类样本点(灰色)
	if(pDoc->m_flag==1){
		PenNew.CreatePen(PS_SOLID,2,RGB(192,192,192));
		pPenOld=pDC->SelectObject(&PenNew);
		for(i=0;i<pDoc->m_pointnum;i++){
			p=dbhuan(pDoc->m_point[i]);
			pDC->Ellipse(p.x-2,p.y-2,p.x+2,p.y+2);
		}
		
		pDC->SelectObject(pPenOld);
		PenNew.DeleteObject();
	}
	//分不同颜色绘出各类样本点及聚类中心
	else if(pDoc->m_flag==2){
		for(i=0;i<pDoc->m_kindnum;i++){
			//绘制第n类点
			PenNew.CreatePen(PS_SOLID,2,RGB(x[i][0],x[i][1],x[i][2]));
			pPenOld=pDC->SelectObject(&PenNew);
			for(j=0;j<pDoc->m_inkindnum[i];j++){
				p=dbhuan(pDoc->m_point[(pDoc->m_kind[i][j])]);
				pDC->Ellipse(p.x-2,p.y-2,p.x+2,p.y+2);
			}
			pDC->SelectObject(pPenOld);
			PenNew.DeleteObject();
            //绘制聚类中心
			PenNew.CreatePen(PS_SOLID,0,RGB(x[i][0],x[i][1],x[i][2]));
			pPenOld=pDC->SelectObject(&PenNew);
			p.x=(long)500+20*pDoc->m_kindcentre[i][0];
			p.y=(long)300-20*pDoc->m_kindcentre[i][1];
			pDC->MoveTo(p.x-3,p.y);
			pDC->LineTo(p.x+3,p.y);
			pDC->MoveTo(p.x,p.y-3);
			pDC->LineTo(p.x,p.y+3);
			pDC->SelectObject(pPenOld);
			PenNew.DeleteObject();
		}
	}
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CBangYongView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CBangYongView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CBangYongView message handlers

//用于屏幕坐标系与绘图坐标系的坐标变换
CPoint CBangYongView::dbhuan(CPoint p)
{
	p.x=20*p.x+500;
	p.y=300-20*p.y;
	return p;
}


/////////////////////////////////////////////
//菜单响应函数:读文件

void CBangYongView::OnReadfile() 
{
	CBangYongDoc *pDoc=GetDocument();
	ASSERT_VALID(pDoc);

	pDoc->ReadFile();
	Invalidate();

}


//////////////////////////////////////////////
//菜单响应函数:k均值分类

void CBangYongView::OnKjunzhi() 
{
	CBangYongDoc* pDoc=GetDocument();
	ASSERT_VALID(pDoc);

	if(pDoc->m_flag==0){
		MessageBox("请先读入文件","提示信息",MB_OK);
		return;
	}

	else{
		CKCanShuDlg dlg;
		dlg.m_k=3;
		dlg.m_i=5;
		if(dlg.DoModal()==IDOK){
			pDoc->m_kindnum=dlg.m_k;
			pDoc->m_I=dlg.m_i;
			//调用K均值算法进行分类
			pDoc->K_FenLei();
			Invalidate();
		}

	}

	Invalidate();

}


///////////////////////////////////////////////
//菜单响应函数:ISODATA分类

void CBangYongView::OnIsodata() 
{
	CBangYongDoc *pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_flag==0){
		MessageBox("请先读入文件","提示信息",MB_OK);
		return;
	}
	else if(pDoc->m_flag==1||pDoc->m_flag==2){
		//定义对话框对象并对参数赋初值
		CISODCanShuDlg dlg;
		dlg.m_k=4;
		dlg.m_n=1;
		dlg.m_s=2;
		dlg.m_c=2;
		dlg.m_l=2;
		dlg.m_i=10;
		
		//接收对话框中参数值
		if(dlg.DoModal()==IDOK){
			pDoc->m_K=dlg.m_k;
			pDoc->m_N=dlg.m_n;
			pDoc->m_S=dlg.m_s;
			pDoc->m_C=dlg.m_c;
			pDoc->m_L=dlg.m_l;
			pDoc->m_I=dlg.m_i;
			pDoc->m_iterativetime=0;
			pDoc->ISOD_ChuShiHua();
		    Invalidate();
		}
	}

	
}


/////////////////////////////////////////////////
//菜单响应函数:刷新屏幕

void CBangYongView::OnShuaxin() 
{
	CBangYongDoc *pDoc=GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->m_flag=0;
	Invalidate();
	
}


////////////////////////////////////////////////
//菜单响应函数:说明数据文件格式

void CBangYongView::OnShuoming() 
{
	CShuoMingDlg dlg;
	if(dlg.DoModal()==IDOK){

	}
	
}


///////////////////////////////////////////////
//鼠标响应函数:鼠标移动,显示当前点的绘图坐标系坐标

void CBangYongView::OnMouseMove(UINT nFlags, CPoint point) 
{
	int xx,yy;
	double xy;
	char p1[20];
	xy=(point.x-500)/20.0; //取出坐标信息,并转化为绘图坐标
	if(xy<0)    xx=(int)(xy-0.5);
	else        xx=(int)(xy+0.5);           
        xy=(300-point.y)/20.0;
	if(xy<0)    yy=(int)(xy-0.5);
	else        yy=(int)(xy+0.5);
	
	sprintf(p1,"该点对应的坐标为:");
	m_wndStatusBar.SetPaneText(1,p1,TRUE);
	if(xx>=-10&&xx<=10&&yy>=-10&&yy<=10){
		sprintf(p1,"%4d",xx);                     //转化为字符串
		m_wndStatusBar.SetPaneText(2,p1,TRUE); //在第2个区域显示x坐标
		sprintf(p1,"%4d",yy);
		m_wndStatusBar.SetPaneText(3,p1,TRUE); //在第3个区域显示y坐标
	}
	
	//超限显示
	else{
		if(xx>10||xx<-10){
			sprintf(p1,"x越界");
			m_wndStatusBar.SetPaneText(2,p1,TRUE); //在第2个区域显示x坐标
		}
		if(yy>10||yy<-10){
			sprintf(p1,"y越界");
			m_wndStatusBar.SetPaneText(3,p1,TRUE); //在第2个区域显示x坐标
		}
	}
	
	CView::OnMouseMove(nFlags, point);
}


//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// the end 

⌨️ 快捷键说明

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