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