📄 sgaview.cpp
字号:
// 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);//获取设备环境
//CRect rect;
//POINT Sin[200]; //定义正弦曲线的点坐标
//GetClientRect(&rect);
//dc.SetMapMode(MM_ISOTROPIC/*MM_ANISOTROPIC MM_LOMETRIC*/);//设置映象模式0.1mm
//dc.SetWindowOrg(1600,1000);//设置窗口原点(即窗口的中心点)
//dc.SetViewportOrg(rect.right/2,rect.bottom/2);//设置视口原点
//dc.DPtoLP(&rect);//按0.1mm比例的倒数放大了
//dc.FillSolidRect(rect,RGB(127,127,127));//设置背景色
//画网格
/*CPen pen;
pen.CreatePen(PS_SOLID,1,RGB(222,222,222)); //PS_SOLID为实线
CPen* pOldPen=dc.SelectObject(&pen);
//网格的创建;
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为实线
pOldPen=dc.SelectObject(&pen2);
//画出正弦曲线;
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);
//建立坐标系
CPen pen1;
pen1.CreatePen(PS_SOLID,1,RGB(0,0,0)); //PS_SOLID为实线
pOldPen=dc.SelectObject(&pen1);
dc.MoveTo(Sin[100].x,500);
dc.LineTo(Sin[100].x,-500);
dc.MoveTo(-1000,-100);
dc.LineTo (1000,-100);
//确定显示刻度个数
const int count=5;
//确定每个显示刻度之间的宽度
long spaceX=100;
//绘制X,Y轴的变量名
dc.TextOut(-100,200,"Y");
dc.TextOut(350,-150,"X");*/
////////////////////////////////////////////////////////////////
// 画出正弦曲线的另一种方法 //
///////////////////////////////////////////////////////////////
/*dc.SetWindowOrg(0,0);
for (int j=0;j<1440;j++)//生成正弦曲线的点坐标.
{
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); */
////////////////////////////////////////////////////////////////
//下面的代码是建立一个坐标系 //
///////////////////////////////////////////////////////////////
//分别取得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;
//确定坐标图四周预留的空白大小
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);
//绘制曲线。由于绘图坐标的Y轴是向下延升,所以这里每个点的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轴从图形区域最左端到最右端
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轴从图形区域最底端到最顶端
dc.MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom));
dc.LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop));
//确定显示刻度个数
const int count=10;
//确定每个显示刻度之间的宽度
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -