Скачиваний:
19
Добавлен:
01.05.2014
Размер:
13.51 Кб
Скачать
//************** RandchView.cpp ***************
// randchView.cpp : implementation ofthe CRandchView class

#include "stdafx.h" 
#include"randch.h"
#include "randchDoc.h" 
#include "randchView.h" 
#include "Generation.h" 
#include <math.h> 
#include <time.h> 
#include <sys/timeb.h>
#include ".\randchview.h"
//#include "CHList.cpp" 
//#include "CHPoint.h" 
//#include <conio.h> 
//#include <afx.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#include <afxwin.h>
///////////////////////////////////////////////////////////////////////////// // CRandchView
IMPLEMENT_DYNCREATE(CRandchView,CView)
BEGIN_MESSAGE_MAP(CRandchView,CView)
	//{{AFX_MSG_MAP(CRandchView)
	ON_COMMAND(ID_STEP, OnStep)
	ON_UPDATE_COMMAND_UI(ID_STEP,OnUpdateStep)
	ON_COMMAND(ID_TEST, OnTest)
	ON_COMMAND(ID_GEN, OnGen)
	ON_COMMAND(ID_GO, OnGo)
	ON_UPDATE_COMMAND_UI(ID_GO,OnUpdateGo)
	ON_UPDATE_COMMAND_UI (ID_INDICATOR_MY, OnUpdatePane )
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_SIZE()
	ON_COMMAND(ID_Start_again,OnStartagain)
	ON_UPDATE_COMMAND_UI(ID_Start_again,OnUpdateStartagain)
	//}}AFX_MSG_MAP 	
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
END_MESSAGE_MAP()

CRandchView::CRandchView() 
{
	num_of_st = 0;
}

CRandchView::~CRandchView()
{
}

void CRandchView::displayAll(CRandchDoc *pDoc)
{		
	InvalidateRect(NULL);
}

void CRandchView::displayL(CDC* pDC, CCHList lst, COLORREF p, COLORREF l, bool edg)
{
	CBrush brush(/*RGB(0, 0, 255)*/p);	
	CBrush* pOldBrush = pDC->SelectObject(&brush);

	// create and select a thick, black pen
	CPen pen;

	pen.CreatePen(PS_SOLID, 1, l/*RGB(0, 0, 0)*/);
	CPen* pOldPen = pDC->SelectObject(&pen);

	if(!lst.data.empty())
	{
		int count = (int) (lst.data.size() + 1);
		CPoint *points = new CPoint[count];
		list<CCHPoint*>::iterator i = lst.data.begin();

		points[count - 1] = CPoint((int)(*i)->p.x, (int)(*i)->p.y);						
		for(int n = 0; !(i==lst.data.end()); i++, n++) 
		{
			points[n] = CPoint((int)(*i)->p.x, (int)(*i)->p.y);
			//pDC->LineTo((int) (*i)->p.x, (int) (*i)->p.y);		
		}
		pDC->Polyline(points, (int) count);
		delete []points;
	}

	CPen pointPen;
	pointPen.CreatePen(PS_SOLID, 3, p/*RGB(0, 0, 0)*/);
	pDC->SelectObject(&pointPen);

	for(list<CCHPoint*>::iterator i = lst.data.begin(); !(i==lst.data.end()); i++) 
	{
		displayP(pDC, (*i)->p.x, (*i)->p.y, p);
	}		

	// put back the old objects
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);		
}

void CRandchView::displayP(CDC* pDC, float x, float y, COLORREF p)
{		
	CBrush brush(p);
	CBrush* pOldBrush = pDC->SelectObject(&brush);
	
	CPen pen;
	pen.CreatePen(PS_SOLID, 1, p);

	CPen* pOldPen = pDC->SelectObject(&pen);

	float radius = 2;
	pDC->Ellipse((int)(x - radius), (int)(y - radius), (int)(x + radius), (int)(y + radius));
	
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

void CRandchView::displayVeer(CDC* pDC, CCHList lst, int count, COLORREF p, COLORREF l, bool bDrawLines)
{
	CPen pen;
	pen.CreatePen(PS_SOLID, 1, l);
	CPen* pOldPen = pDC->SelectObject(&pen);

	for(list<CCHPoint*>::iterator i = lst.data.begin(); count > 0 && !(i==lst.data.end()); i++, count--) 
	{		
		if (bDrawLines) 
		{
			pDC->MoveTo(CPoint((int)(*i)->p.x, (int)(*i)->p.y));
			pDC->LineTo(CPoint((int)CP.x, (int)CP.y));
		}
		displayP(pDC, (*i)->p.x, (*i)->p.y, p);
	}

	pDC->SelectObject(pOldPen);
}

void CRandchView::displayR(CDC* pDC, float x, float y, COLORREF p)
{		
	CBrush brush;
	brush.CreateStockObject(NULL_BRUSH);
	CBrush* pOldBrush = pDC->SelectObject(&brush);

	CPen pen;
	pen.CreatePen(PS_SOLID, 2, p);
	CPen* pOldPen = pDC->SelectObject(&pen);

	float radius = 4;
	pDC->Ellipse((int)(x - radius), (int)(y - radius), (int)(x + radius), (int)(y + radius));
	
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

void CRandchView::displayBaseLine(CDC* pDC, float x, float y, COLORREF p, COLORREF l)
{	
	displayR(pDC, x, y, p);
	
	CPen pen;
	pen.CreatePen(PS_DASH, 1, l);
	CPen* pOldPen = pDC->SelectObject(&pen);
	pDC->MoveTo((int) cur_p.x, (int) cur_p.y);
	pDC->LineTo((int) x, (int) y);
	pDC->SelectObject(pOldPen);
}

////////////////////////////////////////////////////////////////// 
// CRandchView message handlers
void CRandchView::OnTest()
{
}

BOOL CRandchView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

// CSupportView drawing

void CRandchView::OnDraw(CDC* pDC)
{
	CRandchDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	//рисуем текущую оболочку
	displayL(pDC, ch, RGB(0, 0, 255), RGB(220, 109, 10), true);	
	//рисуем лучи
	displayVeer(pDC, pDoc->S, pDoc->n, RGB(0, 127, 0), RGB(127, 127, 127), pDoc->St > 3);	
	if(pDoc->St > 2) 
	{		
		//рисуем центральную точку
		displayP(pDC, CP.x, CP.y, RGB(255, 0, 0));
		if(pDoc->St > 4)
		{
			// рисуем выбраную точку
			displayR(pDC, cur_p.x, cur_p.y, RGB(0, 0, 0));
			if(pDoc->St > 5)
			{
				// рисуем левую точку
				displayBaseLine(pDC, first_p.x, first_p.y, RGB(18, 211, 62), RGB(0, 0, 0));
				if(pDoc->St > 6)			{
					// рисуем правую точку
					displayBaseLine(pDC, second_p.x, second_p.y, RGB(18, 211, 62), RGB(0, 0, 0));
				}
			}
		}	
	}
}

void CRandchView::OnStep()
{
	CRandchDoc* pDoc = GetDocument();
	int k, count;
	div_t div_res;
	srand((unsigned)time(NULL));
	switch (pDoc->St)
	{
	case 1:
		ch = pDoc->S.RandCH3(pDoc->n); //         ch=pDoc->S.BuildCH(pDoc->n);
		pDoc->St = 2;		
		break; 
	case 2:
		if(pDoc->n !=0)
		{
			CP=pDoc->S.CentrPoint(ch);			
			pDoc->S.Pointers(CP, pDoc->n, ch, count); 
			num_of_st+=count;

			pDoc->St = 3; 			
		}
		break;
	case 3:
		k=rand();
		div_res=div(k,pDoc->n);
		cur_i=pDoc->S.data.begin();
		for(k=1;k<div_res.rem+1;k++) 
		{
			cur_i++;
		}
		cur_p.x=(*cur_i)->p.x;
		cur_p.y=(*cur_i)->p.y;
		pDoc->St=5;		
		break; 
	case 4:
		k = rand();
		div_res = div(k, pDoc->n);
		cur_i = pDoc->S.data.begin();
		for (k=1;k<div_res.rem+1;k++) 
		{
			cur_i++;
		}
		cur_p.x=(*cur_i)->p.x;
		cur_p.y=(*cur_i)->p.y;		
		pDoc->St=5;
		break; 
	case 5:
		lft_i = pDoc->S.LeftAdjInCH(cur_i,ch,recheck);
		pDoc -> St = 6;
		first_p = (*lft_i)->p;		
		break; 
	case 6:
		rt_i = pDoc->S.RightAdjInCH(cur_i,lft_i,ch,recheck);
		pDoc -> St = 7;
		second_p = (*rt_i)->p;		
		break; 
	case 7:
		(*cur_i)->l_i.clear();
		ch.data.insert(rt_i,(*cur_i));
		rt_i++;
		pDoc->S.NewPointers(cur_i,lft_i,CP,pDoc->n,ch,recheck,count);
		num_of_st+=count;
		pDoc->St=4;		
		break;
	} 
	displayAll(pDoc);
}

void CRandchView::OnUpdateStep(CCmdUI* pCmdUI)
{
	CRandchDoc* pDoc = GetDocument();
	if((pDoc->n == 0 || pDoc->S.data.size() < 5) || (pDoc->St==0)) 
		pCmdUI->Enable(FALSE); 
	else 
		pCmdUI->Enable(TRUE);

}
void CRandchView::OnGen()
{
	CGeneration Dlg;
	int nRet = -1;
	CRandchDoc* pDoc = GetDocument();
	list<CCHPoint*>::iterator it;
	int k,i;
	float x,y,N,Pi = (float) acos(-1.);
	div_t d;
	nRet = (int) Dlg.DoModal();
	switch ( nRet)
	{
	case -1:
		AfxMessageBox("Dialog box could not be created!");
		break;
	case IDOK:
		pDoc->Clear();		
		srand((unsigned)time(NULL));
		if(Dlg.raspr==1)
		{
			for (i= 1; i<=Dlg.NumP; ++i)    
			{
				CCHPoint* p_pnt = new CCHPoint();
				k=rand();
				d=div(k,vx-20);
				p_pnt->p.x = (float) d.rem+10;
				k=rand();
				d=div(k,vy-20);
				p_pnt->p.y = (float) d.rem + 10;
				pDoc->S.data.push_back(p_pnt);
			}
		}
		else if(Dlg.raspr==2)
		{
			for (i = 1; i<=Dlg.NumP; ++i)
			{
				CCHPoint* p_pnt = new CCHPoint;
				k=rand(); 
				d=div(k,1001); 
				x=float(d.rem+1)/1002; 
				k=rand(); 
				d=div(k,1001);
				y=float(d.rem)/1001; 
				N = (float)(sqrt(-2.0*log(x))*cos(2.0*Pi*y)); 
				N*=Dlg.Sigma; 
				p_pnt->p.x=vx/2+N;
				k=rand(); 
				d=div(k,1001); 
				x=float(d.rem + 1)/1002;

				k=rand();
				d=div(k, 1001);
				y=float(d.rem)/1001;
				N=(float) (sqrt(-2.0*log(x))*sin(2.0*Pi*y));
				N*=Dlg.Sigma;
				p_pnt->p.y=vy/2+N;
				pDoc->S.data.push_back(p_pnt);
			} 
		}
		else
		{
			for (i = 1; i<=Dlg.NumP;++i)
			{
				CCHPoint* p_pnt = new CCHPoint;
				k=rand(); 
				d=div(k,vx); 
				p_pnt->p.x = (float) d.rem; 
				k=rand();

				d=div(k,vy); 
				p_pnt->p.y = (float) d.rem;
				while((p_pnt->p.x-vx/2)*(p_pnt->p.x-vx/2)+(p_pnt->p.y-vy/2)*(p_pnt->p.y-vy/2)>Dlg.Rad*Dlg.Rad)
				{
					k=rand(); 
					d=div(k,vx-20); 
					p_pnt->p.x = (float) d.rem;
					k=rand(); 
					d=div(k,vy-20); 
					p_pnt->p.y = (float) d.rem;
				} pDoc->S.data.push_back(p_pnt);
			} 
		}
		pDoc->St = 1;
		pDoc->n = (int) pDoc->S.data.size(); 
		displayAll(pDoc);
		break;
	case IDCANCEL:
		break;
	}; 
}

void CRandchView::OnGo()
{
	CRandchDoc* pDoc = GetDocument();
	int k,count; 
	div_t div_res; 
	SYSTEMTIME st_t, f_t;

	num_of_st = 1;
	srand((unsigned)time(NULL));
	GetSystemTime(&st_t);
	switch (pDoc->St)
	{
	case 1: 
		//         ch=pDoc->S.RandCH3(pDoc->n);
		ch=pDoc->S.BuildCH(pDoc->n); 
		pDoc->St=2;
	case 2: 
		if(pDoc->n !=0)
		{
			//CP=pDoc->S.CentrPoint(ch);
			CP=pDoc->S.InPoint(ch);
			pDoc->S.Pointers(CP,pDoc->n,ch,count);
			num_of_st+=count;
			pDoc->St=3;
		}
		else 
			break;
	case 3: 
		if(pDoc->n != 0) {
			k=rand();
			div_res = div(k, pDoc->n);
			cur_i=pDoc->S.data.begin();
			for (k=1;k<div_res.rem+1;k++) cur_i++;
			cur_p.x=(*cur_i)->p.x; 
			cur_p.y=(*cur_i)->p.y; 
			pDoc->St=5; 
		}
	}
	while (pDoc->n!=0)
	{
		switch (pDoc->St)
		{
		case 4:
			k=rand();
			div_res=div(k,pDoc->n);
			cur_i=pDoc->S.data.begin();
			for (k=1;k<div_res.rem+1;k++) cur_i++;
			cur_p.x=(*cur_i)->p.x;
			cur_p.y=(*cur_i)->p.y;
			pDoc->St=5;
		case 5:
			lft_i=pDoc->S.LeftAdjInCH(cur_i,ch,recheck);
			pDoc->St=6;
		case 6:
			rt_i=pDoc->S.RightAdjInCH(cur_i,lft_i,ch,recheck);
			pDoc->St = 7;
		case 7:
			(*cur_i)->l_i.clear();
			ch.data.insert(rt_i,(*cur_i));
			rt_i++;
			pDoc->S.NewPointers(cur_i,lft_i,CP,pDoc->n,ch,recheck,count); 
			num_of_st+=count;
			pDoc->St=4;
		}	
	}	
	GetSystemTime(&f_t);
	int el_t;
	el_t = (int) ((f_t.wHour-st_t.wHour)*3.6*1000000+(f_t.wMinute-st_t.wMinute)*60000+ (f_t.wSecond-st_t.wSecond)* 1000); 
	el_t += (f_t.wMilliseconds-st_t.wMilliseconds);
	CString T,St;
	T.Format("Время: %d мс.", el_t); 
	St.Format("Число шагов: %d ", num_of_st); 
	displayAll(pDoc); 
	AfxMessageBox(T); 
	AfxMessageBox(St);
	//fclose(fout);
}

void CRandchView::OnUpdateGo(CCmdUI* pCmdUI)
{
	CRandchDoc* pDoc = GetDocument();
	if((pDoc->n == 0 || pDoc->S.data.size() < 5) || (pDoc->St==0)) pCmdUI->Enable(FALSE);
	else pCmdUI->Enable(TRUE); 
}

void CRandchView::OnLButtonDown(UINT nFlags, CPoint point)
{
	CRandchDoc* pDoc = GetDocument();
	if((pDoc->St==0) || (pDoc->St==1))
	{
		CCHPoint* p_pnt = new CCHPoint;
		p_pnt->p.x = (float) point.x;
		p_pnt->p.y = (float) point.y;
		pDoc->S.data.push_back(p_pnt);
		pDoc->n = (int) pDoc->S.data.size();
		pDoc->St = 1;
		displayAll(pDoc);
		if(pDoc->n<3) 
			pDoc->St=0;
	}
	CView::OnLButtonDown(nFlags, point);
}

void CRandchView::OnUpdatePane (CCmdUI *pCmdUI)
{ 
	pCmdUI->Enable();
}

void CRandchView::OnMouseMove(UINT nFlags, CPoint point) {
	//SB
	CView::OnMouseMove(nFlags, point);
}

void CRandchView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);
	vx=cx; 
	vy=cy; 
}

void CRandchView::OnStartagain()
{  
	CRandchDoc* pDoc = GetDocument(); 
	list<CCHPoint*>::iterator i;
	for(i=pDoc->S.data.begin(); i != pDoc->S.data.end(); ++i)
	{
		(*i)->l_i.clear();
	}
	ch.data.clear();

	pDoc->St = 1; 
	pDoc->n = (int) pDoc->S.data.size();
	num_of_st = 0;
	displayAll(pDoc); 
}

void CRandchView::OnUpdateStartagain(CCmdUI* pCmdUI)
{
	CRandchDoc* pDoc = GetDocument();
	if (pDoc->St<2) pCmdUI->Enable(FALSE);
	else pCmdUI->Enable(TRUE); 
}

#ifdef _DEBUG
void CRandchView::AssertValid() const
{
	CView::AssertValid();
}

void CRandchView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CRandchDoc* CRandchView::GetDocument() const // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRandchDoc)));
	return (CRandchDoc*)m_pDocument;
}
#endif //_DEBUG


void CRandchView::OnFileOpen()
{
	list<CCHPoint*>::iterator i,i1 ,i2;	
	char szFilters[]= "DAT Files (*.dat)|*.dat|All Files (*.*)|*.*||"; 
	CFileDialog fileDlg (TRUE, "dat", "*.dat", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, NULL); 
	CString fileName; 
	if( fileDlg.DoModal()==IDOK )
	{
		if(GetDocument()->OnOpenDocument(fileDlg.GetFileName()))
		{
			OnStartagain();
			InvalidateRect(NULL);			
		}
	}
}

void CRandchView::OnFileSave()
{
	char szFilters[]= "DAT Files (*.dat)|*.dat|All Files (*.*)|*.*||"; 
	CFileDialog fileDlg (FALSE, "dat", "*.dat",	OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, NULL);
	CString fileName; 
	if( fileDlg.DoModal() == IDOK)
	{
		if(GetDocument()->OnSaveDocument(fileDlg.GetFileName()))
		{			
			InvalidateRect(NULL);
		}
	}
}

void CRandchView::OnFileNew()
{	
	GetDocument()->OnNewDocument();
	OnStartagain();
	InvalidateRect(NULL);
}
Соседние файлы в папке program