?? sgaview.cpp
字號(hào):
// SGAView.cpp : implementation of the CSGAView class
//
#include "stdafx.h"
#include "SGA.h"
#include "SGADoc.h"
#include "SGAView.h"
#include "math.h"
#include <stdlib.h>
#include <string.h>
#define Pi 3.1415926
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSGAView
IMPLEMENT_DYNCREATE(CSGAView, CScrollView)
BEGIN_MESSAGE_MAP(CSGAView, CScrollView)
//{{AFX_MSG_MAP(CSGAView)
ON_COMMAND(ID_INPUTPARAM, OnInputParam)
ON_COMMAND(ID_RUNGA, OnRunGA)
ON_COMMAND(ID_FIMAGE, OnFimage)
ON_UPDATE_COMMAND_UI(ID_FIMAGE, OnUpdateFimage)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CSGAView construction/destruction
CSGAView::~CSGAView()
{
}
BOOL CSGAView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSGAView drawing
void CSGAView::OnDraw(CDC* pDC)
{
CSGADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
pDC->SetBkMode(TRANSPARENT);
POSITION pos=MyGA.lsRptData.GetHeadPosition();
UINT ntxt=0;
for(int i=0;i<MyGA.lsRptData.GetCount();i++)
{
pDC->TextOut(0,ntxt+=tm.tmHeight,MyGA.lsRptData.GetNext(pos));
}
OnFimage();
}
void CSGAView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CSGAView printing
BOOL CSGAView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CSGAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CSGAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CSGAView diagnostics
#ifdef _DEBUG
void CSGAView::AssertValid() const
{
CScrollView::AssertValid();
}
void CSGAView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CSGADoc* CSGAView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSGADoc)));
return (CSGADoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSGAView message handlers
void CSGAView::OnInputParam()
{
// TODO: Add your command handler code here
if(ParDlg.DoModal()==IDOK)
MyGA.InitData(ParDlg.m_nPopSize,ParDlg.m_nChromLen,ParDlg.m_nMaxGen,ParDlg.m_fPc,ParDlg.m_fPm);
}
void CSGAView::OnRunGA()
{
float oldmaxfit;
int oldmaxpp;
if(!MyGA.lsRptData.IsEmpty())
MyGA.InitData();
MyGA.InitPop();
MyGA.InitReport();
MyGA.pPop=MyGA.pNewPop;
MyGA.pNewPop=MyGA.pOldPop;
MyGA.StatPop(MyGA.pNewPop);
MyGA.Report(MyGA.nGen);
MyGA.pNewPop=MyGA.pPop;
do
{
MyGA.nGen++;
oldmaxfit=MyGA.fMaxFit;
oldmaxpp=MyGA.nMaxPop;
MyGA.UpdateGen();
MyGA.StatPop(MyGA.pNewPop);
if(MyGA.fMaxFit<oldmaxfit)
{
for(unsigned i=0;i<MyGA.nChromLen;i++)
MyGA.pNewPop[MyGA.nMinPop].chrom[i]=MyGA.pOldPop[oldmaxpp].chrom[i];
MyGA.pNewPop[MyGA.nMinPop].x=MyGA.pOldPop[oldmaxpp].x;
MyGA.pNewPop[MyGA.nMinPop].fitness=MyGA.pOldPop[oldmaxpp].fitness;
MyGA.StatPop(MyGA.pNewPop);
}
MyGA.Report(MyGA.nGen);
MyGA.pPop=MyGA.pOldPop;
MyGA.pOldPop=MyGA.pNewPop;
MyGA.pNewPop=MyGA.pPop;
}while(MyGA.nGen<MyGA.nMaxGen);
FILE *fp;
if((fp=fopen("SGAReport.txt","w"))==NULL)
MessageBox("Cannot Open File for Report !");
POSITION pos=MyGA.lsRptData.GetHeadPosition();
for(int i=0;i<MyGA.lsRptData.GetCount();i++)
fprintf(fp,"%s\n",(LPCTSTR)MyGA.lsRptData.GetNext(pos));
fclose(fp);
TEXTMETRIC tm;
CDC *pDC=GetDC();
pDC->GetTextMetrics(&tm);
SetScrollSizes(MM_TEXT,CSize(1000,MyGA.lsRptData.GetCount()*tm.tmHeight));
Invalidate();
}
void CSGAView::OnFimage()
{
// TODO: Add your command handler code here
//CClientDC dc(this);//獲取設(shè)備環(huán)境
//CRect rect;
//POINT Sin[200]; //定義正弦曲線的點(diǎn)坐標(biāo)
//GetClientRect(&rect);
//dc.SetMapMode(MM_ISOTROPIC/*MM_ANISOTROPIC MM_LOMETRIC*/);//設(shè)置映象模式0.1mm
//dc.SetWindowOrg(1600,1000);//設(shè)置窗口原點(diǎn)(即窗口的中心點(diǎn))
//dc.SetViewportOrg(rect.right/2,rect.bottom/2);//設(shè)置視口原點(diǎn)
//dc.DPtoLP(&rect);//按0.1mm比例的倒數(shù)放大了
//dc.FillSolidRect(rect,RGB(127,127,127));//設(shè)置背景色
//畫(huà)網(wǎng)格
/*CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(222,222,222)); //PS_SOLID為實(shí)線
CPen* pOldPen=dc.SelectObject(&pen);
//網(wǎng)格的創(chuàng)建;
for(int i=0;i<=10000;i+=100)
{
dc.MoveTo(0,i);
dc.LineTo(10000,i);
dc.MoveTo(i,0);
dc.LineTo(i,10000);
}
CPen pen2;
pen2.CreatePen(PS_SOLID,1,RGB(252,0,0)); //PS_SOLID為實(shí)線
pOldPen=dc.SelectObject(&pen2);
//畫(huà)出正弦曲線;
dc.SetWindowOrg(0,0);
for (int j=-100;j<100;j++)
{
Sin[j+100].x=(long)(100*j*Pi/180*5);
Sin[j+100].y=(long)((j*sin((j*10)*Pi/180)+1.0)*5);
}
dc.Polyline(Sin,200);
//建立坐標(biāo)系
CPen pen1;
pen1.CreatePen(PS_SOLID,1,RGB(0,0,0)); //PS_SOLID為實(shí)線
pOldPen=dc.SelectObject(&pen1);
dc.MoveTo(Sin[100].x,500);
dc.LineTo(Sin[100].x,-500);
dc.MoveTo(-1000,-100);
dc.LineTo (1000,-100);
//確定顯示刻度個(gè)數(shù)
const int count=5;
//確定每個(gè)顯示刻度之間的寬度
long spaceX=100;
//繪制X,Y軸的變量名
dc.TextOut(-100,200,"Y");
dc.TextOut(350,-150,"X");*/
////////////////////////////////////////////////////////////////
// 畫(huà)出正弦曲線的另一種方法 //
///////////////////////////////////////////////////////////////
/*dc.SetWindowOrg(0,0);
for (int j=0;j<1440;j++)//生成正弦曲線的點(diǎn)坐標(biāo).
{
Sin[j].x=(long)(100*j*Pi/180);
Sin[j].y=(long)((j*sin((j*10)*Pi/180)+1.0)/2);
}
dc.Polyline(Sin,1440);
for(i=0;i<1440;i++)
{
Sin2[i].y=Sin[i].y;
Sin2[i].x=-Sin[i].x;
}
dc.SetWindowOrg(0,0);
dc.Polyline(Sin2,1440); */
////////////////////////////////////////////////////////////////
//下面的代碼是建立一個(gè)坐標(biāo)系 //
///////////////////////////////////////////////////////////////
//分別取得X與Y最大值、最小值
/*long maxX=Sin[0].x;
long minX=Sin[0].x;
long maxY=Sin[0].y;
long minY=Sin[0].y;
for (int k=-100;k<100;k++)
{
if (Sin[k+100].x>maxX)
maxX=Sin[k+10].x;
if (Sin[k+100].x<minX)
minX=Sin[k+100].x;
if (Sin[k+100].y>maxY)
maxY=Sin[k+10].y;
if (Sin[k+100].y<minY)
minY=Sin[k+100].y;
}
//確定圖象顯示大小
int width=2000;
int height=1000;
//確定坐標(biāo)圖四周預(yù)留的空白大小
const int mytop=10;
const int mybottom=10;
const int myleft=10;
const int myright=10;
//確定X,Y軸每單位顯示寬度
long intervalX=(width-myleft-myright)/(maxX-minX);
long intervalY=(height-mybottom-mytop)/(maxY-minY);
//繪制曲線。由于繪圖坐標(biāo)的Y軸是向下延升,所以這里每個(gè)點(diǎn)的Y值是用
//圖象高度減去y值大小。
dc.MoveTo(int(myleft+(Sin[0].x-minX)*intervalX),
int(height-(mybottom+(Sin[0].y-minY)*intervalY)));
for(int m=-100;m<100;m++)
{
dc.LineTo(int(myleft+(Sin[m+100].x-minX)*intervalX),
int(height-(mybottom+(Sin[m+100].y-minY)*intervalY)));
}
//繪制X,Y軸
//X軸從圖形區(qū)域最左端到最右端
long bottomY=0;
long leftX=0;
//bottomY表示X軸的y值,leftX表示Y軸的x值
if(minY>0)
bottomY=minY;
if(minX>0)
leftX=minX;
dc.MoveTo(int(myleft),int(height-(mybottom+(bottomY-minY)*intervalY)));
dc.LineTo(int(width-myright),int(height-(mybottom+(bottomY-minY)*intervalY)));
//Y軸從圖形區(qū)域最底端到最頂端
dc.MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom));
dc.LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop));
//確定顯示刻度個(gè)數(shù)
const int count=10;
//確定每個(gè)顯示刻度之間的寬度
long spaceX=(width-myleft-myright)/count;
long spaceY=(height-mybottom-mytop)/count;
//繪制刻度和刻度值
CString str;
//X軸
for(i=0;i<=count;i++)
{
str.Format("%.1f",minX+i*(maxX-minX)/count);
dc.MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));
dc.LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY)));
dc.TextOut(int(myleft+spaceX*i-10),
int(height-(mybottom+(bottomY-minY)*intervalY-5)),str);
}
//Y軸
for(i=0;i<=count;i++)
{
str.Format("%.1f",minY+i*(maxY-minY)/count);
dc.MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-(mybottom+spaceY*i)));
dc.LineTo(int(myleft+(leftX-minX)*intervalX+1),int(height-(mybottom+spaceY*i)));
dc.TextOut(int(myleft+(leftX-minX)*intervalX-30),
int(height-(mybottom+spaceY*i+8)),str);
}
//繪制X,Y軸的變量名
dc.TextOut(width/2,-100,"X");
dc.TextOut(-100,height/2,"Y");*/
}
void CSGAView::OnUpdateFimage(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio(TRUE);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -