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