⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shiview.cpp

📁 本程序是进行路径的寻找的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -