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

📄 dynamicclouddialog.cpp

📁 这是一个很好的学习VC数据库的原马 大家可以参考以下 会收益非前的
💻 CPP
字号:
// DynamicCloudDialog.cpp : implementation file
//

#include "stdafx.h"
#include "DynamicCloud.h"
#include "DynamicCloudDialog.h"
#include "MainFrm.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDynamicCloudDialog

IMPLEMENT_DYNCREATE(CDynamicCloudDialog, CFormView)

CDynamicCloudDialog::CDynamicCloudDialog()
	: CFormView(CDynamicCloudDialog::IDD)
{
	//{{AFX_DATA_INIT(CDynamicCloudDialog)
	m_dStartHE = 0.0;
	m_dStartEN = 0.0;
	m_uFrameCount = 60;//动画帧数
	m_dEndHE = 20.0;
	m_dEndEN = 50.0;
	m_uDropCount = 5000; //云滴数目
	//}}AFX_DATA_INIT
	this->m_dEntropyStride = 0.0 ;
	this->m_dHEntropyStride = 0.0 ;
	n = 0 ;//记录数据点数
	count = 0 ;//记录计时器的响应次数
}

CDynamicCloudDialog::~CDynamicCloudDialog()
{
}

void CDynamicCloudDialog::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDynamicCloudDialog)
	DDX_Control(pDX, IDC_CLOUD_PANEL, m_panel);
	DDX_Text(pDX, IDC_START_H__ENTROPY, m_dStartHE);
	DDX_Text(pDX, IDC_START_ENTROPY, m_dStartEN);
	DDX_Text(pDX, IDC_FRAME_COUNT, m_uFrameCount);
	DDX_Text(pDX, IDC_END_H__ENTROPY, m_dEndHE);
	DDX_Text(pDX, IDC_END_ENTROPY, m_dEndEN);
	DDX_Text(pDX, IDC_DROP_COUNT, m_uDropCount);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDynamicCloudDialog, CFormView)
	//{{AFX_MSG_MAP(CDynamicCloudDialog)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_GEN_CLOUD, OnGenCloud)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_OPERATION_HELP, OnOperationHelp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDynamicCloudDialog diagnostics

#ifdef _DEBUG
void CDynamicCloudDialog::AssertValid() const
{
	CFormView::AssertValid();
}

void CDynamicCloudDialog::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDynamicCloudDialog message handlers

void CDynamicCloudDialog::OnDestroy() 
{
	CFormView::OnDestroy();

	((CMainFrame*)AfxGetMainWnd())->m_pdynamicCloud=NULL;	
}

void CDynamicCloudDialog::OnGenCloud() 
{
	UpdateData();
	if(m_uFrameCount == 0 )
	{
		MessageBox("动画帧数不能为0!") ;
		return ;
	}
    //获得期望,熵, 超熵
	double EX = this->m_panel.GetProperEX() ;
	double EN = this->m_dStartEN ;
	double HE = this->m_dStartHE ;
	double endEN = this->m_dEndEN  ;
	double endHE = this->m_dEndHE ;

	/*
	 *对动画帧的处理
	 */
	int timeStride = 1000/this->m_uFrameCount  ;
	SetTimer(1,timeStride,NULL) ;
    this->m_dEntropyStride = fabs(EN-endEN)*1./this->m_uFrameCount  ;
	this->m_dHEntropyStride = fabs(HE-endHE)*1./this->m_uFrameCount ;

	//启动计时器
	SetTimer(1,timeStride,NULL) ;
	count = 0 ;


    n = this->m_uDropCount ;//获取所要画的数据点数
	m_panel.m_iDropSize = n ;
	/*
	*初始化存储数据点的数组
	*/
	if(m_panel.m_dDrops != NULL) {
		
		delete[] m_panel.m_dDrops  ;
	}
	m_panel.m_dDrops = new double* [n] ;
	for( int i = 0 ; i < n ; i++ ){
		m_panel.m_dDrops[i] = new double[2] ;
		m_panel.m_dDrops[i][0] = 0.0;
		m_panel.m_dDrops[i][1] = 0.0 ;
	}

	
	//产生数据
	Cloud(EX,EN,HE,n) ;
	
	//作图
    m_panel.Invalidate()  ;
	m_panel.UpdateWindow() ;
	  
	UpdateData(FALSE);		
}

void CDynamicCloudDialog::Cloud(double EX, double EN, double HE, int n)
{
	double Enn, x, y ;
	srand((unsigned)time(NULL)) ;
	double pi = 3.1415926 ;
	for( int i = 0 ; i < n ; i ++) {

		Enn = (sqrt( -2* log(rand() * 1./RAND_MAX))*cos(2*pi*rand()*1./RAND_MAX))*HE + EN ;

		x = (sqrt( -2* log(rand() * 1./RAND_MAX))*cos(2*pi*rand()*1./RAND_MAX))*Enn + EX ;
		y = exp( -(x-EX) * (x-EX)/(2*Enn*Enn)) ;
        m_panel.m_dDrops[i][0] = x ;
		m_panel.m_dDrops [i][1] = y ;

	}

}

void CDynamicCloudDialog::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	count ++ ;
	double EN = 0.0 ;
	double HE = 0.0 ;
	double maxEN = 0.0 ;
	double maxHE = 0.0 ;
	/*
	 *判断熵或超熵是递增还是递减
	 */
	if(m_dStartEN > m_dEndEN) {
		
		EN = m_dStartEN - count * m_dEntropyStride ;
		maxEN = m_dStartEN ;
		if(EN < 0 ) {
			KillTimer(1) ;
			return ;
		}
	}else {
		EN = m_dStartEN + count * m_dEntropyStride ;
		maxEN = m_dEndEN ;
		if( EN > maxEN) {
	
			KillTimer(1) ;
		}
	}

	if( m_dStartHE > m_dEndHE) {
		
		HE = m_dStartHE- count * m_dHEntropyStride ;
		
		if(HE < 0 ) {
			KillTimer(1) ;
			return ;
		}

	}else {

		HE = m_dStartHE + count * m_dHEntropyStride ;
		maxHE = m_dEndHE ;
		if( HE >= maxHE ) {
	
			KillTimer(1) ;
		}
	}
	
	double EX = this->m_panel.GetProperEX() ;
	Cloud(EX,EN,HE,n) ;

	//作图
    m_panel.Invalidate()  ;
	m_panel.UpdateWindow() ;

	
	CFormView::OnTimer(nIDEvent);
}

void CDynamicCloudDialog::OnOperationHelp() 
{
CString str = "1. 设置熵,超熵变化范围。" ;
  str += "\n2. 填写动画帧数(每秒钟画面重绘次数)。" ;
  str += "\n3. 填写云滴的次数。";
  str += "\n4. 点击产生,可以查看熵超熵对云形状的影响。";

 

  MessageBox(str) ;		
}

⌨️ 快捷键说明

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