📄 shiview.cpp
字号:
// shiView.cpp : implementation of the CShiView class
//
#include "stdafx.h"
#include "shi.h"
#include "shiDoc.h"
#include "shiView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "math.h"
/////////////////////////////////////////////////////////////////////////////
// CShiView
IMPLEMENT_DYNCREATE(CShiView, CView)
BEGIN_MESSAGE_MAP(CShiView, CView)
//{{AFX_MSG_MAP(CShiView)
ON_COMMAND(IDD_LOADMAP, OnLoadmap)
ON_COMMAND(IDD_GETSHI, OnGetshi)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_WAY2, OnWay2)
ON_COMMAND(ID_WAY3, OnWay3)
ON_COMMAND(ID_WAY4, OnWay4)
ON_COMMAND(IDD_WAY5, OnWay5)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CShiView construction/destruction
CShiView::CShiView()
{
// TODO: add construction code here
T0=1000000;
int i;
for(i=0;i<100;i++)
{
xstack[i]=-10;
ystack[i]=-10;
}
}
CShiView::~CShiView()
{
}
BOOL CShiView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CShiView drawing
void CShiView::OnDraw(CDC* pDC)
{
CShiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CShiView printing
BOOL CShiView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CShiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CShiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CShiView diagnostics
#ifdef _DEBUG
void CShiView::AssertValid() const
{
CView::AssertValid();
}
void CShiView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CShiDoc* CShiView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShiDoc)));
return (CShiDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CShiView message handlers
void CShiView::OnLoadmap()
{
CFileDialog tdlg(true);
tdlg.DoModal();
CFile tfile;
tfile.Open(tdlg.GetPathName(),CFile::modeRead);
tdib.Read(&tfile);
}
void CShiView::OnGetshi()
{
way1();
}
double CShiView::getmindis(int tdata[WIDTH][HEIGHT],int x, int y)
{
double dmax=31;
double d0;
double sita;
int tx,ty;
for(d0=1;d0<dmax;d0++)
{
for(sita=0;sita<2*3.1416;sita+=0.1)
{
tx=(int)(x+d0*cos(sita)+0.5+WIDTH)%WIDTH;
ty=(int)(y+d0*sin(sita)+0.5+HEIGHT)%HEIGHT;
if(tdata[tx][ty]==1)
return d0;
}
}
return dmax;
}
double CShiView::getoneshi(int tdata[WIDTH][HEIGHT],int x, int y)
{
int enx=WIDTH/2;
int eny=HEIGHT-1;
double d0=25;
double ctd=getmindis(tdata,x,y);
double shi1,shi2;
double a=1,b=1;
if(ctd>d0)
shi1=0;
else
{
shi1=b*(1.0/ctd-1/d0)*(1.0/ctd-1/d0)*500;
}
//////////////////////////////
double dg=sqrt((x-enx)*(x-enx)+(y-eny)*(y-eny));
dg/=30;
shi2=a*dg*dg;
//////////////////////////
return shi1+shi2;
//return getmindis(tdata,x,y);
}
void CShiView::searchnext(int tdata[WIDTH][HEIGHT],int &x, int &y)
{
int i,j;
int tx=x,ty=y;
double minshi=1000;
for(i=-1;i<=1;i++)
for(j=-1;j<=1;j++)
{
if(x+i>=0&&x+i<WIDTH&&y+j>=0&&y+j<HEIGHT)
{
if(getoneshi(tdata,x+i,y+j)<minshi)
{
minshi=getoneshi(tdata,x+i,y+j);
tx=x+i;
ty=y+j;
}
}
}
x=tx;
y=ty;
}
void CShiView::searchnext2(int tdata[WIDTH][HEIGHT],int &x, int &y)
{
int i,j;
int tx=x,ty=y;
double minshi=1000;
double dx=(2.0*rand()/RAND_MAX-1.0);
double dy=(2.0*rand()/RAND_MAX-1.0);
if(dx>0.5)tx++;
if(dx<-0.5)tx--;
if(dy>0.5)ty++;
if(dy<-0.5)ty--;
T0*=0.985;
double k=0.001;
if(getoneshi(tdata,tx,ty)<getoneshi(tdata,x,y))
{
x=tx;
y=ty;
}
else
{
double td=getoneshi(tdata,tx,ty)-getoneshi(tdata,x,y);
double posb=pow(2.7128,-td*1.0/(k*T0));
double randp=rand()*1.0/RAND_MAX;
if(posb>randp)
{
x=tx;
y=ty;
}
}
}
void CShiView::OnLButtonDown(UINT nFlags, CPoint point)
{
int dataimg[WIDTH][HEIGHT];
CClientDC dc(this);
//////////////////////////////
{
CPoint tpos(1,1);
CSize tsize(WIDTH,HEIGHT);
tdib.Draw(GetDC(),tpos,tsize);
}
////////////////////////////////////////
{
int i,j;
for(i=0;i<300;i++)
for(j=0;j<300;j++)
{
if(dc.GetPixel(i+1,j+1)%256>100)
dataimg[i][j]=0;
else
dataimg[i][j]=1;
}
}
///////////////////////////////////////////////
{
int stx=WIDTH/2,sty=0,enx=WIDTH/2,eny=HEIGHT-1;
dc.FillSolidRect(stx,sty,3,3,RGB(255,0,0));
dc.FillSolidRect(enx,eny,3,3,RGB(0,0,255));
}
//////////////////////////////////////////////////
///////////////test//////////////////////////
double co;
co=(getoneshi(dataimg,point.x,point.y));
CString tstr;
tstr.Format("%d,%d,color is:%f",point.x,point.y,co);
AfxMessageBox(tstr);
/////////////////////////////////////////////////
CView::OnLButtonDown(nFlags, point);
}
void CShiView::OnInitialUpdate()
{
CView::OnInitialUpdate();
srand((unsigned)time(NULL));
}
int CShiView::gerrecentchange(int x, int y)
{
int i;
static int ctpt=0;
xstack[ctpt]=x;
ystack[ctpt]=y;
ctpt=(ctpt+1)%50;
//int lapt=(ctpt+47)%50;
for(i=0;i<49;i++)
{
if(xstack[i]!=xstack[i+1]||ystack[i]!=ystack[i+1])
return 1;
}
return 0;
/*
if(abs(x-xstack[lapt])+abs(y-ystack[lapt])==0)
return 0;
else return 1;
*/
}
void CShiView::way1()
{
////////////////////////////////////////
int dataimg[WIDTH][HEIGHT];
CClientDC dc(this);
//////////////////////////////
{
CPoint tpos(1,1);
CSize tsize(WIDTH,HEIGHT);
tdib.Draw(GetDC(),tpos,tsize);
}
////////////////////////////////////////
{
int i,j;
for(i=0;i<300;i++)
for(j=0;j<300;j++)
{
if(dc.GetPixel(i+1,j+1)%256>100)
dataimg[i][j]=0;
else
dataimg[i][j]=1;
}
}
///////////////////////////////////////////////
{
int stx=WIDTH/2,sty=0,enx=WIDTH/2,eny=HEIGHT-1;
dc.FillSolidRect(stx,sty,3,3,RGB(255,0,0));
dc.FillSolidRect(enx,eny,3,3,RGB(0,0,255));
while(1)
{
/////////////////////////////
static long ctcounter=0;
ctcounter++;
if(ctcounter>1000)
break;
//////////////////////////////
static int ctclo=0;
ctclo++;
searchnext(dataimg,stx,sty);
dc.FillSolidRect(stx,sty,3,3,
RGB(255*(ctclo%2),120*(ctclo%3),255*((ctclo+1)%2)));
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
if(stx==enx&&sty==eny)
break;
}
}
return;
//////////////////////////////////////////////////
///////////////test//////////////////////////
{
int i,j;
int co=0;
for(i=0;i<300;i++)
for(j=0;j<300;j++)
{
co=(int)(getoneshi(dataimg,i,j));
if(co>254)
co=254;
dc.SetPixel(i+400,j,RGB(co,co,co));
}
}
/////////////////////////////////////////////////
}
void CShiView::way2()
{
////////////////////////////////////////
int dataimg[WIDTH][HEIGHT];
CClientDC dc(this);
//////////////////////////////
{
CPoint tpos(1,1);
CSize tsize(WIDTH,HEIGHT);
tdib.Draw(GetDC(),tpos,tsize);
}
////////////////////////////////////////
{
int i,j;
for(i=0;i<300;i++)
for(j=0;j<300;j++)
{
if(dc.GetPixel(i+1,j+1)%256>100)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -