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

📄 200622130035view.cpp

📁 现代地理学方面分析
💻 CPP
字号:
// 200622130035View.cpp : implementation of the CMy200622130035View class
//

#include "stdafx.h"
#include "200622130035.h"

#include "200622130035Doc.h"
#include "200622130035View.h"

#define initRow 21
#define initCol 9
#define DistRow 21
#define DistCol 21

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

/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View

IMPLEMENT_DYNCREATE(CMy200622130035View, CScrollView)

BEGIN_MESSAGE_MAP(CMy200622130035View, CScrollView)
	//{{AFX_MSG_MAP(CMy200622130035View)
	ON_COMMAND(IDM_ANALYSIS_READDATA, OnAnalysisReaddata)
	ON_COMMAND(IDM_ANALYSIS_BZC, OnAnalysisBzc)
	ON_COMMAND(IDM_ANALYSIS_DISTANCE, OnAnalysisDistance)
	ON_COMMAND(IDM_ANALYSIS_JL, OnAnalysisJl)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View construction/destruction

CMy200622130035View::CMy200622130035View()
{
	// TODO: add construction code here
   initData=NULL;
   DataTrans=NULL;
   DataDist=NULL;
   PreData=NULL;
   Disp_Init=FALSE;
   Disp_Trans=FALSE;
   Disp_Dist=FALSE;
   Disp_PXT=FALSE;
}

CMy200622130035View::~CMy200622130035View()
{
	delete []initData;
	delete []DataTrans;
	delete []DataDist;
	delete []PreData;
}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View drawing

void CMy200622130035View::OnDraw(CDC* pDC)
{
	CMy200622130035Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(Disp_Init==TRUE||Disp_Trans==TRUE||Disp_Dist==TRUE)
	{
		CSize sizeTotal;
		sizeTotal.cx = 1500;
		sizeTotal.cy = 800;
		SetScrollSizes(MM_TEXT, sizeTotal);
	}
	if(Disp_Init==TRUE)
	{ 
		if(initData!=NULL)
		{
		  pDC->TextOut(0,0,"原始数据:");
		  DisplayData(pDC,initData,initRow,initCol);
		}
		else 
		  MessageBox("请读取数据");
	}
	else if(Disp_Trans==TRUE)
	{
		pDC->TextOut(0,0,"标准差标准化后的数据:");
		DisplayData(pDC,DataTrans,initRow,initCol);
	}
	else if(Disp_Dist==TRUE)
	{
		pDC->TextOut(0,0,"欧氏距离:");
		DisplayData(pDC,DataDist,DistRow,DistCol);
	}
	else if(Disp_PXT==TRUE)
	{
		m_nPosY = 30;
     	CPoint RootPos = Postrav(bootNode,pDC);
	}
	else
		pDC->TextOut(0,0,"请打开数据文件!");
}

void CMy200622130035View::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View diagnostics

#ifdef _DEBUG
void CMy200622130035View::AssertValid() const
{
	CScrollView::AssertValid();
}

void CMy200622130035View::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View message handlers

void CMy200622130035View::OnAnalysisReaddata() 
{
	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"txt files(.txt)|*.txt||",NULL);
	CString sFilePath;
	
	if(IDOK==dlg.DoModal())
	{
		sFilePath=dlg.GetPathName();
		initData=new float[initRow*initCol];
		ReadDataToArray(sFilePath,initData,initRow,initCol);
		Disp_Init=TRUE;
		Disp_Trans=FALSE;
		Disp_Dist=FALSE;
		Invalidate();
	}
}

//从文件中读数据
void CMy200622130035View::ReadDataToArray(CString sFilePath,float* initData,int Row,int Col)
{
    ifstream fin;
	fin.open(sFilePath);
	float temp;
	for(int i=0;i<Row;i++)
	{
		for(int j=0;j<Col;j++)
		{
			fin>>temp;
			*(initData+i*Col+j)=temp;
		}
	}
	fin.close();
}



//显示数据
void CMy200622130035View::DisplayData(CDC* pDC,float *Data, int Row, int Col)
{
	CString str;
	int XOffset=70,YOffset=20;
	int X=20,Y=20;
	for(int i=0;i<Row;i++)
	{
		for(int j=0;j<Col;j++)
		{
			str.Format("%.3f",*(Data+i*Col+j));
		
			  pDC->TextOut(X+XOffset*j,Y+YOffset*i,str);
		}
	}
}

//将数据进行标准差标准化
void CMy200622130035View::OnAnalysisBzc() 
{
	if(initData==NULL)
	{
	  MessageBox("请打开数据文件!");
	  return;
	}
	DataTrans=new float[initRow*initCol];
	TransData(DataTrans,initData,initRow,initCol);
	Disp_Init=FALSE;
	Disp_Trans=TRUE;
	Disp_Dist=FALSE;
	Invalidate();
}


//原始数据某一列的标准差
float CMy200622130035View::GetStdDeviationOfCol(float *initData, int Col,int Row,int c)
{
	float Average=GetAverageOfCol(initData,Col,Row,c);
	float sum=0;
	for(int i=0;i<Row;i++)
	{
		sum+=(*(initData+i*Col+c-1)-Average)*(*(initData+i*Col+c-1)-Average);
	}
	sum=sum/Row;
    return (float)sqrt(sum);;
}

//原始数据某一列的平均值
float CMy200622130035View::GetAverageOfCol(float *initData, int Col,int Row,int c)
{
	float sum=0;
	for(int i=0;i<Row;i++)
	{
	  for(int j=0;j<Col;j++)
	  {
		if(j==c-1)
			sum+=*(initData+i*Col+j);
	  }
	}
	
	return sum/Row;
}

//利用标准差标准化数据
void CMy200622130035View::TransData(float *DataTrans, float *initData, int Row, int Col)
{
	int i,j;
	for(i=0;i<Row;i++)
	{
		for(j=0;j<Col;j++)
		{
			*(DataTrans+i*Col+j)=(*(initData+i*Col+j)-GetAverageOfCol(initData,Col,Row,j+1))/GetStdDeviationOfCol(initData,Col,Row,j+1);
		}
	}
}

//计算距离
void CMy200622130035View::OnAnalysisDistance() 
{
	// TODO: Add your command handler code here
	DataDist=new float[DistRow*DistCol];
	for(int i=0;i<DistRow;i++)
	{
		for(int j=0;j<DistCol;j++)
		{
		    *(DataDist+i*DistCol+j)=GetEuclideanDistance(DataTrans,initRow,initCol,i,j);
		}
	}
	Disp_Init=FALSE;
    Disp_Trans=FALSE;
    Disp_Dist=TRUE;
	Invalidate();
}

//计算欧氏距离
float CMy200622130035View::GetEuclideanDistance(float *DataTrans, int Row, int Col, int Row1, int Row2)
{
	float sum=0;
	for(int i=0;i<Col;i++)
	{
		sum+=(*(DataTrans+Row1*Col+i)-*(DataTrans+Row2*Col+i))*(*(DataTrans+Row1*Col+i)-*(DataTrans+Row2*Col+i));
	}
	return (float)sqrt(sum);
}

void CMy200622130035View::OnAnalysisJl() 
{
	// TODO: Add your command handler code here
	int initUnitNum=21;
	PreData=new float[DistRow*DistCol];
	InitCluster(DataDist,PreData,initUnitNum);
	CClusterStdDlg dlg;
	float Distance;
	if(IDOK==dlg.DoModal())
	{
		Distance=dlg.m_distance;
	}
	
	int nodeNum=initUnitNum+initUnitNum-1;
	nodes=new btnode[nodeNum];
	for(int n=0;n<nodeNum;n++)
	{
		nodes[n].id=n;
		nodes[n].dis=0;
		nodes[n].lchild=NULL;
		nodes[n].rchild=NULL;
	}

	float value;
	int row,col;
	ofstream fout;
	fout.open("cls.txt");
	int i=0;
	while(1)
	{
		GetMinimumDistance(PreData,initUnitNum+i,initUnitNum+i,&value,&row,&col);
		if(value<=Distance)
		{
			fout<<col+1<<' '<<row+1<<' '<<value<<' '<<initUnitNum+i+1<<endl;
			nodes[initUnitNum+i].dis=value;
			nodes[initUnitNum+i].lchild=nodes+row;
			nodes[initUnitNum+i].rchild=nodes+col;
			PreData=NewData(PreData,initUnitNum+i,row,col);
		}
		else
			break;
		i++;
	}
	fout.close();

	bootNode=&nodes[nodeNum-1];
	Disp_Init=FALSE;
    Disp_Trans=FALSE;
    Disp_Dist=FALSE;
    Disp_PXT=TRUE;

	Invalidate();
}

//获得矩阵中最小值
//value 最小值 r 最小值所在行 c 最小值所在列(从0起始)
void CMy200622130035View::GetMinimumDistance(float *DistData, int Row, int Col, float* value, int* r, int* c)
{
	int i,j;
	float min;
	min=*(DistData+Col);
	for(i=0;i<Row;i++)
	{
		for(j=0;j<Col;j++)
		{
			if(i>j)
			{
				if(*(DistData+i*Col+j)<=min)
				{
					min=*(DistData+i*Col+j);
					*r=i;
					*c=j;
				}
			}
		}
	}
	*value=min;
}

//获得某个类别中的单元数
int CMy200622130035View::GetUnitNumOfCls(CString sFilePath, int Cls, int initUnitNum)
{
	if(Cls<=initUnitNum)
		return 1;
	else
	{
		ifstream fin;
		fin.open(sFilePath);
		int row,col;
		float value;
		int c;
		while(!fin.eof())
		{
			fin>>row>>col>>value>>c;
			if(c==Cls)
			{
				return GetUnitNumOfCls(sFilePath,row,initUnitNum)+GetUnitNumOfCls(sFilePath,col,initUnitNum);	
			}
		}		
	}
	return 0;
}


void CMy200622130035View::InitCluster(float *initDataDist, float *PreData, int initUnitNum)
{
	for(int i=0;i<initUnitNum;i++)
	{
		for(int j=0;j<initUnitNum;j++)
		{
			*(PreData+i*initUnitNum+j)=*(initDataDist+i*initUnitNum+j);
		}
	}	
}

float* CMy200622130035View::NewData(float *PreData, int PreDataUnitNum,int minRow,int minCol)
{
	float* temp=new float[(PreDataUnitNum+1)*(PreDataUnitNum+1)];
	for(int i=0;i<PreDataUnitNum+1;i++)
	{
		for(int j=0;j<PreDataUnitNum+1;j++)
		{
			if(i!=PreDataUnitNum&&j!=PreDataUnitNum)
			{
				if(i!=minRow&&j!=minRow&&i!=minCol&&j!=minCol)
					*(temp+i*(PreDataUnitNum+1)+j)=*(PreData+i*PreDataUnitNum+j);
				else
					*(temp+i*(PreDataUnitNum+1)+j)=100;
			}	
			else
			{
				if(i==PreDataUnitNum&&j==PreDataUnitNum)
					*(temp+i*(PreDataUnitNum+1)+j)=0;
				else
				{
					int tt;
					if(i<j)
						tt=i;
					else tt=j;
					if(tt==minRow||tt==minCol)
						*(temp+i*(PreDataUnitNum+1)+j)=100;
					else
						*(temp+i*(PreDataUnitNum+1)+j)=GetDistance(PreData,PreDataUnitNum,minRow,minCol,tt);
				}
			}
		}
	}
	return temp;
}

float CMy200622130035View::GetDistance(float* PreData,int PreDataUnitNum,int minRow, int minCol, int Cur)
{
	CString str="cls.txt";
	int initUnitNum=21;
	float Np=(float)GetUnitNumOfCls(str,minRow+1,initUnitNum);
	float Nq=(float)GetUnitNumOfCls(str,minCol+1,initUnitNum);
	return (float)sqrt((*(PreData+minRow*PreDataUnitNum+Cur))*(*(PreData+minRow*PreDataUnitNum+Cur))*Np/(Np+Nq)+(*(PreData+minCol*PreDataUnitNum+Cur))*(*(PreData+minCol*PreDataUnitNum+Cur))*Nq/(Np+Nq));

}


CPoint CMy200622130035View::Postrav(btnode *pBoot, CDC *pDC)
{
	CPoint lPt,rPt,mPt;
	if(pBoot->lchild != NULL && pBoot->rchild != NULL)
	{
		lPt = Postrav(pBoot->lchild,pDC);
		rPt = Postrav(pBoot->rchild,pDC);
		mPt.y = (lPt.y + rPt.y) / 2;
		mPt.x = (pBoot->id - 21) * 45 + 60;
		pDC->MoveTo(lPt);
		pDC->LineTo(mPt.x,lPt.y);
		pDC->LineTo(mPt.x,rPt.y);
		pDC->LineTo(rPt);
		CString str;
		str.Format("%.4f",pBoot->dis);
		pDC->TextOut(mPt.x+1,mPt.y,str);
	}
	else
	{
		CString str;
		str.Format("%d",pBoot->id+1);
		pDC->TextOut(5,m_nPosY-8,str);
		pDC->Ellipse(22,m_nPosY-4,30,m_nPosY+4);
		mPt = CPoint(30,m_nPosY);
		m_nPosY += 30;
	}
	return mPt;
}

⌨️ 快捷键说明

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