Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Рандомизированный алгоритм построения выпуклой оболочки / program / RandchView
.cpp//************** 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