ewaveDlg.cpp
上传用户:mayisishi
上传日期:2007-08-08
资源大小:80k
文件大小:13k
开发平台:

Visual C++

  1. // ewaveDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ewave.h"
  5. #include "ewaveDlg.h"
  6. #include "math.h"
  7. #include "fstream.h"
  8. double adAg[2000],adt[2000],amax,tmax,dOpx=65,dOpy=220,adAgtemp[2000];
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CAboutDlg dialog used for App About
  16. class CAboutDlg : public CDialog
  17. {
  18. public:
  19. CAboutDlg();
  20. // Dialog Data
  21. //{{AFX_DATA(CAboutDlg)
  22. enum { IDD = IDD_ABOUTBOX };
  23. //}}AFX_DATA
  24. // ClassWizard generated virtual function overrides
  25. //{{AFX_VIRTUAL(CAboutDlg)
  26. protected:
  27. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  28. //}}AFX_VIRTUAL
  29. // Implementation
  30. protected:
  31. //{{AFX_MSG(CAboutDlg)
  32. //}}AFX_MSG
  33. DECLARE_MESSAGE_MAP()
  34. };
  35. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  36. {
  37. //{{AFX_DATA_INIT(CAboutDlg)
  38. //}}AFX_DATA_INIT
  39. }
  40. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  41. {
  42. CDialog::DoDataExchange(pDX);
  43. //{{AFX_DATA_MAP(CAboutDlg)
  44. //}}AFX_DATA_MAP
  45. }
  46. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  47. //{{AFX_MSG_MAP(CAboutDlg)
  48. // No message handlers
  49. //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CEwaveDlg dialog
  53. CEwaveDlg::CEwaveDlg(CWnd* pParent /*=NULL*/)
  54. : CDialog(CEwaveDlg::IDD, pParent)
  55. {
  56. //{{AFX_DATA_INIT(CEwaveDlg)
  57. m_dAmax = 0.08;
  58. m_dTg = 0.65;
  59. m_pd = 35;
  60. //}}AFX_DATA_INIT
  61. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  62. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  63. }
  64. void CEwaveDlg::DoDataExchange(CDataExchange* pDX)
  65. {
  66. CDialog::DoDataExchange(pDX);
  67. //{{AFX_DATA_MAP(CEwaveDlg)
  68. DDX_Text(pDX, IDC_AMAX, m_dAmax);
  69. DDX_Text(pDX, IDC_TG, m_dTg);
  70. DDX_Text(pDX, IDC_PD, m_pd);
  71. //}}AFX_DATA_MAP
  72. }
  73. BEGIN_MESSAGE_MAP(CEwaveDlg, CDialog)
  74. //{{AFX_MSG_MAP(CEwaveDlg)
  75. ON_WM_SYSCOMMAND()
  76. ON_WM_PAINT()
  77. ON_WM_QUERYDRAGICON()
  78. ON_BN_CLICKED(IDOK, OnSTART)
  79. ON_BN_CLICKED(IDC_OUTPUT, OnOutput)
  80. ON_BN_CLICKED(IDC_INPUT, OnInput)
  81. //}}AFX_MSG_MAP
  82. END_MESSAGE_MAP()
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CEwaveDlg message handlers
  85. BOOL CEwaveDlg::OnInitDialog()
  86. {
  87. CDialog::OnInitDialog();
  88. // Add "About..." menu item to system menu.
  89. // IDM_ABOUTBOX must be in the system command range.
  90. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  91. ASSERT(IDM_ABOUTBOX < 0xF000);
  92. CMenu* pSysMenu = GetSystemMenu(FALSE);
  93. if (pSysMenu != NULL)
  94. {
  95. CString strAboutMenu;
  96. strAboutMenu.LoadString(IDS_ABOUTBOX);
  97. if (!strAboutMenu.IsEmpty())
  98. {
  99. pSysMenu->AppendMenu(MF_SEPARATOR);
  100. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  101. }
  102. }
  103. // Set the icon for this dialog.  The framework does this automatically
  104. //  when the application's main window is not a dialog
  105. SetIcon(m_hIcon, TRUE); // Set big icon
  106. SetIcon(m_hIcon, FALSE); // Set small icon
  107. // TODO: Add extra initialization here
  108. return TRUE;  // return TRUE  unless you set the focus to a control
  109. }
  110. void CEwaveDlg::OnSysCommand(UINT nID, LPARAM lParam)
  111. {
  112. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  113. {
  114. CAboutDlg dlgAbout;
  115. dlgAbout.DoModal();
  116. }
  117. else
  118. {
  119. CDialog::OnSysCommand(nID, lParam);
  120. }
  121. }
  122. // If you add a minimize button to your dialog, you will need the code below
  123. //  to draw the icon.  For MFC applications using the document/view model,
  124. //  this is automatically done for you by the framework.
  125. void CEwaveDlg::OnPaint() 
  126. {
  127. if (IsIconic())
  128. {
  129. CPaintDC dc(this); // device context for painting
  130. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  131. // Center icon in client rectangle
  132. int cxIcon = GetSystemMetrics(SM_CXICON);
  133. int cyIcon = GetSystemMetrics(SM_CYICON);
  134. CRect rect;
  135. GetClientRect(&rect);
  136. int x = (rect.Width() - cxIcon + 1) / 2;
  137. int y = (rect.Height() - cyIcon + 1) / 2;
  138. // Draw the icon
  139. dc.DrawIcon(x, y, m_hIcon);
  140. }
  141. else
  142. {
  143. if(adt[0]==0)
  144. {
  145.     CPaintDC dcb(this);
  146.      CBrush br(RGB(0,0,0));
  147.      CBrush * pOldBr;
  148.      pOldBr=dcb.SelectObject(&br);
  149.      dcb.Rectangle(dOpx-50,dOpy-70,dOpx+420,dOpy+70);
  150.      dcb.SelectObject(pOldBr);
  151.      CClientDC dc(this);
  152.         CPen pen(PS_SOLID,1,RGB(0,255,0));
  153.          CPen *pOldPen;
  154.         pOldPen=dc.SelectObject(&pen);
  155.          dc.MoveTo(dOpx,dOpy-40);
  156.         dc.LineTo(dOpx,dOpy+40);
  157.          dc.MoveTo(dOpx+100,dOpy-40);
  158.         dc.LineTo(dOpx+100,dOpy+40);
  159.          dc.MoveTo(dOpx+200,dOpy-40);
  160.         dc.LineTo(dOpx+200,dOpy+40);
  161.          dc.MoveTo(dOpx+300,dOpy-40);
  162.         dc.LineTo(dOpx+300,dOpy+40);
  163.      dc.MoveTo(dOpx+400,dOpy-40);
  164.         dc.LineTo(dOpx+400,dOpy+40);
  165.      dc.MoveTo(dOpx,dOpy-40);
  166.         dc.LineTo(dOpx+400,dOpy-40);
  167.      dc.MoveTo(dOpx,dOpy);
  168.         dc.LineTo(dOpx+400,dOpy);
  169.      dc.MoveTo(dOpx,dOpy+40);
  170.         dc.LineTo(dOpx+400,dOpy+40);
  171.         dc.SelectObject(pOldPen);
  172. CClientDC dcf(this);
  173. CFont font,font1;
  174. font.CreateFont(15,0,0,0,560,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
  175. OUT_DEFAULT_PRECIS,PROOF_QUALITY,FF_ROMAN,"a");
  176. font1.CreateFont(17,0,0,0,0,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
  177.         OUT_DEFAULT_PRECIS,PROOF_QUALITY,FF_ROMAN,"a1");
  178. CFont * pOldFont;
  179.     pOldFont=dcf.SelectObject(&font);
  180. dcf.SetBkMode(TRANSPARENT);
  181. dcf.SetTextColor(RGB(255,255,0));
  182. dcf.TextOut(dOpx+5,dOpy+40,"0");
  183. dcf.TextOut(dOpx+95,dOpy+40,"10");
  184. dcf.TextOut(dOpx+195,dOpy+40,"20");
  185. dcf.TextOut(dOpx+295,dOpy+40,"30");
  186. dcf.TextOut(dOpx+395,dOpy+40,"40");
  187.             dcf.TextOut(dOpx-10,dOpy-6,"0");
  188. dcf.TextOut(dOpx+193,dOpy+53,"t(s)");
  189. dcf.TextOut(dOpx-45,dOpy-6,"a(gal)");
  190. pOldFont=dcf.SelectObject(&font1);
  191.         dcf.SetBkMode(TRANSPARENT);
  192.         dcf.SetTextColor(RGB(255,255,0));
  193.         dcf.TextOut(dOpx+105,dOpy-63,"人工地震波加速度时程曲线");
  194. dcf.SelectObject(pOldFont);
  195. }
  196. else
  197. {
  198. Wavedrawing();
  199. }
  200. CDialog::OnPaint();
  201. }
  202. }
  203. // The system calls this to obtain the cursor to display while the user drags
  204. //  the minimized window.
  205. HCURSOR CEwaveDlg::OnQueryDragIcon()
  206. {
  207. return (HCURSOR) m_hIcon;
  208. }
  209. void CEwaveDlg::Wavegener()
  210. {
  211. UpdateData(true);
  212. double dAmax=m_dAmax*9.8;
  213.     double adGpu[10000],adFpu[10000],ddOmiga=0.02,adOmiga[10000];
  214. double Omiga1=2*pi/(5*m_dTg),Omiga2=2*pi/m_dTg,Omiga3=20*pi;
  215. /////////////////////////////////////////////////////////////////////
  216. ///////得到反应谱
  217.     for(int loop=0;loop<10000;loop++)
  218. {
  219. adOmiga[loop]=(loop+1-0.5)*ddOmiga;
  220. if(adOmiga[loop]<=Omiga1)
  221. adFpu[loop]=pow(0.2,0.9)*dAmax-0.02*dAmax*(2*pi/adOmiga[loop]-5*m_dTg);
  222. else
  223. if(adOmiga[loop]>=Omiga1 && adOmiga[loop]<Omiga2)
  224. adFpu[loop]=pow(m_dTg*adOmiga[loop]/(2*pi),0.9)*dAmax;
  225. else
  226. if(adOmiga[loop]>=Omiga2 && adOmiga[loop]<Omiga3)
  227. adFpu[loop]=dAmax;
  228. else
  229. adFpu[loop]=11*dAmax*pi/adOmiga[loop]+0.45*dAmax;
  230. }
  231.     /////////////////////////////////////////////////////////////////////
  232. ///////得到功率谱
  233. for(loop=0;loop<10000;loop++)
  234. {
  235. if(adFpu[loop]<0)
  236. adFpu[loop]=0.0;
  237. adGpu[loop]=2*0.05*pow(adFpu[loop],2)/(-2*(pi*adOmiga[loop])*log(-pi*log(0.85)/(adOmiga[loop]*40)));
  238. }
  239. /////////////////////////////////////////////////////////////////////
  240. ///////生成地震波
  241. double adFi[10000];
  242. int i;
  243.     srand((unsigned)time( NULL ));
  244. for(loop=0;loop<10000;loop++)
  245. {
  246.         int temp=rand();
  247. temp=temp%6282+1;
  248.     adFi[loop]=double(temp)/1000;         //随机相位角
  249. }
  250. for(loop=0;loop<2000;loop++)
  251. adt[loop]=0.02*(loop+1);
  252. for(loop=0;loop<2000;loop++)
  253. {
  254. adAg[loop]=0;
  255. i=0;
  256. while(i<10000)
  257. {
  258. adAg[loop]+=pow(0.08*adGpu[i],0.5)*cos(adOmiga[i]*adt[loop]+adFi[i]);   //人工波地面加速度
  259. i++;
  260. }
  261. }
  262. for(loop=0;loop<200;loop++)
  263. adAg[loop]*=pow(adt[loop]/4,2);
  264. for(loop=750;loop<2000;loop++)
  265. adAg[loop]*=pow(2.71828,-0.15*(adt[loop]-15));  //乘包络线
  266. for(loop=0;loop<2000;loop++)
  267. adAg[loop]*=100;                            //转换单位
  268.     for(loop=0;loop<2000;loop++)
  269. {
  270. if(adAg[loop]<0)
  271. adAgtemp[loop]=-adAg[loop];
  272. else
  273. adAgtemp[loop]=adAg[loop];
  274. }
  275. amax=0;
  276. for(loop=0;loop<2000;loop++)
  277. {
  278. if(adAgtemp[loop]>amax)
  279. {amax=adAgtemp[loop];
  280. tmax=adt[loop];
  281. }
  282. }                                              //求峰值
  283. for(loop=0;loop<2000;loop++)
  284. adAg[loop]*=m_pd/amax;                     //修正峰值
  285. amax=0;
  286.  for(loop=0;loop<2000;loop++)
  287. {
  288. if(adAg[loop]<0)
  289. adAgtemp[loop]=-adAg[loop];
  290. else
  291. adAgtemp[loop]=adAg[loop];
  292. }
  293. for(loop=0;loop<2000;loop++)
  294. {
  295. if(adAgtemp[loop]>amax)
  296. {amax=adAgtemp[loop];
  297. tmax=adt[loop];
  298. }
  299. }
  300.     UpdateData(false);
  301. }
  302.     /////////////////////////////////////////////////////////////////////
  303. ///////绘制地震波加速度时程曲线
  304. void CEwaveDlg::Wavedrawing()
  305. {
  306. Invalidate();
  307. CPaintDC dcb(this);
  308. CBrush br(RGB(0,0,0));
  309. CBrush * pOldBr;
  310. pOldBr=dcb.SelectObject(&br);
  311. dcb.Rectangle(dOpx-50,dOpy-70,dOpx+420,dOpy+70);
  312. dcb.SelectObject(pOldBr);
  313. CClientDC dc(this);
  314. CPen pen(PS_SOLID,1,RGB(255,0,0));
  315. CPen *pOldPen;
  316. CPen pen1(PS_SOLID,1,RGB(0,255,0));
  317.     
  318. pOldPen=dc.SelectObject(&pen);
  319. dc.MoveTo(dOpx,dOpy);
  320. for(int loop=0;loop<2000;loop++)
  321. dc.LineTo(dOpx+adt[loop]*10,dOpy-adAg[loop]*40/amax);
  322. pOldPen=dc.SelectObject(&pen1);
  323.     dc.MoveTo(dOpx,dOpy-40);
  324.     dc.LineTo(dOpx,dOpy+40);    
  325. dc.MoveTo(dOpx+100,dOpy-40);
  326. dc.LineTo(dOpx+100,dOpy+40);
  327.     dc.MoveTo(dOpx+200,dOpy-40);
  328. dc.LineTo(dOpx+200,dOpy+40);
  329.     dc.MoveTo(dOpx+300,dOpy-40);
  330.     dc.LineTo(dOpx+300,dOpy+40);
  331. dc.MoveTo(dOpx+400,dOpy-40);
  332.     dc.LineTo(dOpx+400,dOpy+40);
  333. dc.MoveTo(dOpx,dOpy-40);
  334.     dc.LineTo(dOpx+400,dOpy-40);
  335. dc.MoveTo(dOpx,dOpy);
  336.     dc.LineTo(dOpx+400,dOpy);
  337. dc.MoveTo(dOpx,dOpy+40);
  338.     dc.LineTo(dOpx+400,dOpy+40);
  339. dc.SelectObject(pOldPen);
  340. CString str,str1;
  341. str.Format("%3.0f",amax);
  342.     str1.Format("%3.0f",-amax);
  343. CClientDC dcf(this);
  344. CFont font,font1;
  345. font.CreateFont(15,0,0,0,560,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
  346. OUT_DEFAULT_PRECIS,PROOF_QUALITY,FF_ROMAN,"a");
  347. font1.CreateFont(17,0,0,0,0,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
  348. OUT_DEFAULT_PRECIS,PROOF_QUALITY,FF_ROMAN,"a1");
  349. CFont * pOldFont;
  350.     pOldFont=dcf.SelectObject(&font);
  351. dcf.SetBkMode(TRANSPARENT);
  352. dcf.SetTextColor(RGB(255,255,0));
  353. dcf.TextOut(dOpx+5,dOpy+40,"0");
  354. dcf.TextOut(dOpx+95,dOpy+40,"10");
  355. dcf.TextOut(dOpx+195,dOpy+40,"20");
  356. dcf.TextOut(dOpx+295,dOpy+40,"30");
  357. dcf.TextOut(dOpx+395,dOpy+40,"40");
  358.     dcf.TextOut(dOpx-10,dOpy-6,"0");
  359. dcf.TextOut(dOpx+193,dOpy+53,"t(s)");
  360. dcf.TextOut(dOpx-45,dOpy-6,"a(gal)");
  361. dcf.TextOut(dOpx-25,dOpy-45,str);
  362.     dcf.TextOut(dOpx-25,dOpy+35,str1);
  363. pOldFont=dcf.SelectObject(&font1);
  364. dcf.SetBkMode(TRANSPARENT);
  365. dcf.SetTextColor(RGB(255,255,0));
  366. dcf.TextOut(dOpx+105,dOpy-63,"人工地震波加速度时程曲线");
  367.     dcf.SelectObject(pOldFont);
  368.     UpdateWindow();
  369. }
  370. void CEwaveDlg::OnSTART() 
  371. {
  372. // TODO: Add your control notification handler code here
  373. Wavegener();
  374. Wavedrawing();
  375. }
  376.     /////////////////////////////////////////////////////////////////////
  377. ///////数据输出
  378. void CEwaveDlg::OnOutput() 
  379. {
  380. // TODO: Add your control notification handler code here
  381. CString sFileName;
  382. ofstream fout;
  383. CFileDialog dlg(false);
  384. char sFilter[]="All file(*.*)*.*";
  385. dlg.m_ofn.lpstrFilter=sFilter;
  386. if(dlg.DoModal()==IDOK)
  387. {
  388. sFileName=dlg.GetPathName();
  389. if(sFileName.GetLength()==0)return;
  390. fout.open(sFileName);
  391. }
  392. fout<<"t"<<" "<<tmax<<"    "<<"a"<<" "<<amax<<endl;
  393. for(int loop=0;loop<2000;loop++)
  394. fout<<adt[loop]<<" "<<adAg[loop]<<endl;
  395. fout.close();
  396. }
  397.     /////////////////////////////////////////////////////////////////////
  398. ///////数据输入
  399. void CEwaveDlg::OnInput() 
  400. {
  401. // TODO: Add your control notification handler code here
  402. CString sFileName;
  403. ifstream fin;
  404. char tempt,tempa;
  405. double temptmax,tempamax;
  406. CFileDialog dlg(true);
  407. char sFilter[]="All file(*.*)*.*";
  408. dlg.m_ofn.lpstrFilter=sFilter;
  409. if(dlg.DoModal()==IDOK)
  410. {
  411. sFileName=dlg.GetPathName();
  412. if(sFileName.GetLength()==0)return;
  413. fin.open(sFileName);
  414. }
  415.     fin>>tempt>>temptmax>>tempa>>tempamax;
  416. for(int loop=0;loop<2000;loop++)
  417. fin>>adt[loop]>>adAg[loop];
  418. fin.close();
  419.  for(loop=0;loop<2000;loop++)
  420. {
  421. if(adAg[loop]<0)
  422. adAgtemp[loop]=-adAg[loop];
  423. else
  424. adAgtemp[loop]=adAg[loop];
  425. }
  426.  
  427.  amax=0;
  428. for(loop=0;loop<2000;loop++)
  429. {
  430. if(adAgtemp[loop]>amax)
  431. {amax=adAgtemp[loop];
  432. tmax=adt[loop];
  433. }
  434. }
  435. Wavedrawing();
  436. UpdateData(false);
  437. }