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

📄 mainfrm.cpp

📁 Gramham法求解凸包。从最基本数据结构定义开始实现
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "ConvexHull.h"
#include "ConvexHullDoc.h"
#include "ConvexHullView.h"
#include "DlgAddRandomPoints.h"
#include "DlgInputPoints.h"

#include "MainFrm.h"

#include <sstream>
#include <fstream>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_UPDATE_COMMAND_UI(ID_ZOOM_ADJUST, OnUpdateZoomAdjust)
	ON_COMMAND(ID_ZOOM_ADJUST, OnZoomAdjust)
	ON_COMMAND(ID_DEMO_RUN, OnDemoRun)
	ON_UPDATE_COMMAND_UI(ID_DEMO_RUN, OnUpdateDemoRun)
	ON_COMMAND(ID_ZOOM_IN, OnZoomIn)
	ON_UPDATE_COMMAND_UI(ID_ZOOM_IN, OnUpdateZoomIn)
	ON_COMMAND(ID_ZOOM_OUT, OnZoomOut)
	ON_UPDATE_COMMAND_UI(ID_ZOOM_OUT, OnUpdateZoomOut)
	ON_COMMAND(ID_PUT_POINT, OnPutPoint)
	ON_UPDATE_COMMAND_UI(ID_PUT_POINT, OnUpdatePutPoint)
	ON_COMMAND(ID_GET_CONVEX_HULL, OnGetConvexHull)
	ON_UPDATE_COMMAND_UI(ID_GET_CONVEX_HULL, OnUpdateGetConvexHull)
	ON_COMMAND(ID_DEMO_PAUSE, OnDemoPause)
	ON_UPDATE_COMMAND_UI(ID_DEMO_PAUSE, OnUpdateDemoPause)
	ON_UPDATE_COMMAND_UI(ID_DELETE_POINT, OnUpdateDeletePoint)
	ON_COMMAND(ID_DELETE_POINT, OnDeletePoint)
	ON_COMMAND(ID_ADD_RANDOM_POINTS, OnAddRandomPoints)
	ON_UPDATE_COMMAND_UI(ID_ADD_RANDOM_POINTS, OnUpdateAddRandomPoints)
	ON_COMMAND(ID_ERASE_POINTS, OnErasePoints)
	ON_UPDATE_COMMAND_UI(ID_ERASE_POINTS, OnUpdateErasePoints)
	ON_COMMAND(ID_INPUT_POINTS, OnInputPoints)
	ON_UPDATE_COMMAND_UI(ID_INPUT_POINTS, OnUpdateInputPoints)
	ON_UPDATE_COMMAND_UI(ID_ERASE_ALL_POINTS, OnUpdateEraseAllPoints)
	ON_COMMAND(ID_ERASE_ALL_POINTS, OnEraseAllPoints)
	ON_UPDATE_COMMAND_UI(ID_FILE_EXPORT, OnUpdateFileExport)
	ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

//##ModelId=443378C70265
CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

//##ModelId=443378C70273
CMainFrame::~CMainFrame()
{
}

//##ModelId=443378C702A5
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

//##ModelId=443378C70270
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{    
    cs.style &= ~WS_SIZEBOX;
    cs.style &= ~WS_MAXIMIZEBOX;
    
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
//##ModelId=443378C70278
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

//##ModelId=443378C7027A
void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


//##ModelId=443378C702AA
void CMainFrame::OnUpdateZoomAdjust(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(TRUE);
    //pCmdUI->SetCheck(1);
}

//##ModelId=443378C702AD
void CMainFrame::OnZoomAdjust() 
{
	// TODO: Add your command handler code here
	GetActiveConvexHullView()->ZoomAdjust();
}

//##ModelId=443378C702B5
void CMainFrame::OnDemoRun() 
{
	// TODO: Add your command handler code here
    if(GetActiveConvexHullView()->IsClientStatus_None())
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_DEMO);
    }
    else
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
    }
}

//##ModelId=443378C702B7
void CMainFrame::OnUpdateDemoRun(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
                    || GetActiveConvexHullView()->IsClientStatus_Demo());

    if(GetActiveConvexHullView()->IsClientStatus_Demo())
        pCmdUI->SetCheck(1);
    else
        pCmdUI->SetCheck(0);
}

//##ModelId=443378C702BF
void CMainFrame::OnZoomIn() 
{
	// TODO: Add your command handler code here
	GetActiveConvexHullView()->ZoomIn(1.5);
}

//##ModelId=443378C702C1
void CMainFrame::OnUpdateZoomIn(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(TRUE);
}

//##ModelId=443378C702C9
void CMainFrame::OnZoomOut() 
{
	// TODO: Add your command handler code here
	GetActiveConvexHullView()->ZoomOut(1.5);
}

//##ModelId=443378C702CB
void CMainFrame::OnUpdateZoomOut(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(TRUE);
}

//##ModelId=443378C702D3
void CMainFrame::OnPutPoint() 
{
	// TODO: Add your command handler code here
    if(GetActiveConvexHullView()->IsClientStatus_None())
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_PUT_POINT);
    }
    else
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
    }

}

//##ModelId=443378C702D5
void CMainFrame::OnUpdatePutPoint(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
                    || GetActiveConvexHullView()->IsClientStatus_PutPoint());
    if(GetActiveConvexHullView()->IsClientStatus_PutPoint())
        pCmdUI->SetCheck(1);
    else
        pCmdUI->SetCheck(0);
}

//##ModelId=443378C702DD
void CMainFrame::OnGetConvexHull() 
{
	// TODO: Add your command handler code here
    if(GetActiveConvexHullView()->GetDocument()->GetConvexHull().get_points_count() >= 200000)
    {
        if(AfxMessageBox("您要处理的点太多,有可能超出本程序的处理能力。本程序对这种情况下发生的意外情况将不负责。确认要继续吗?", MB_ICONQUESTION + MB_YESNO) != IDYES)
            return;
    }

    CWaitCursor c;
	GetActiveConvexHullView()->GetDocument()->GetConvexHull().solve();
    GetActiveConvexHullView()->Invalidate(FALSE);
}

//##ModelId=443378C702DF
void CMainFrame::OnUpdateGetConvexHull(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}

//##ModelId=443378C702E7
void CMainFrame::OnDemoPause() 
{
	// TODO: Add your command handler code here
	GetActiveConvexHullView()->PauseDemo(!GetActiveConvexHullView()->IsDemoPaused());
}

//##ModelId=443378C702E9
void CMainFrame::OnUpdateDemoPause(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_Demo());
    if(GetActiveConvexHullView()->IsDemoPaused())
        pCmdUI->SetCheck(1);
    else
        pCmdUI->SetCheck(0);
}

//##ModelId=443378C702F0
void CMainFrame::OnUpdateDeletePoint(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
                    || GetActiveConvexHullView()->IsClientStatus_DeletePoint());
    if(GetActiveConvexHullView()->IsClientStatus_DeletePoint())
        pCmdUI->SetCheck(1);
    else
        pCmdUI->SetCheck(0);
}

//##ModelId=443378C702F3
void CMainFrame::OnDeletePoint() 
{
	// TODO: Add your command handler code here
    if(GetActiveConvexHullView()->IsClientStatus_None())
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_DELETE_POINT);
    }
    else
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
    }

}

//##ModelId=443378C702FA
void CMainFrame::OnAddRandomPoints() 
{
	// TODO: Add your command handler code here
	CDlgAddRandomPoints dlg;
    if(dlg.DoModal() == IDOK)
    {
        GetActiveConvexHullView()->AddRandomPoints(dlg.m_PointCount);

    }
}

//##ModelId=443378C702FC
void CMainFrame::OnUpdateAddRandomPoints(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}

//##ModelId=443378C70304
void CMainFrame::OnErasePoints() 
{
	// TODO: Add your command handler code here
    if(GetActiveConvexHullView()->IsClientStatus_None())
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_ERASE_POINTS);
    }
    else
    {
        GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
    }
}

//##ModelId=443378C70306
void CMainFrame::OnUpdateErasePoints(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
                    || GetActiveConvexHullView()->IsClientStatus_ErasePoints());
    if(GetActiveConvexHullView()->IsClientStatus_ErasePoints())
        pCmdUI->SetCheck(1);
    else
        pCmdUI->SetCheck(0);
}

//##ModelId=443378C7030E
void CMainFrame::OnInputPoints() 
{
	// TODO: Add your command handler code here
	CDlgInputPoints dlg;
    if(dlg.DoModal() == IDOK)
    {
        //GetActiveConvexHullView()->AddRandomPoints(dlg.m_PointCount);
        std::istringstream iss((LPCTSTR)dlg.m_strPoints);
        ((CConvexHullDoc *) GetActiveDocument())->AddPointsByTextStream(iss);
        GetActiveConvexHullView()->ZoomAdjust();
    }
}

//##ModelId=443378C70310
void CMainFrame::OnUpdateInputPoints(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}

//##ModelId=443378C70313
void CMainFrame::OnUpdateEraseAllPoints(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}

//##ModelId=443378C7031A
void CMainFrame::OnEraseAllPoints() 
{
	// TODO: Add your command handler code here
    if(AfxMessageBox("您真的要清除所有的点吗?", MB_YESNO | MB_ICONQUESTION) == IDYES)
    {
        ((CConvexHullDoc *) GetActiveDocument())->GetConvexHull().clear();
        ((CConvexHullDoc *) GetActiveDocument())->SetModifiedFlag(TRUE);
        GetActiveConvexHullView()->Invalidate(FALSE);
    }
}

//##ModelId=443378C7031C
void CMainFrame::OnUpdateFileExport(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(((CConvexHullDoc *) GetActiveDocument())->GetConvexHull().finished());
}

//##ModelId=443378C70323
void CMainFrame::OnFileExport() 
{
	// TODO: Add your command handler code here
	CFileDialog dlg(FALSE);
    
    if(dlg.DoModal() == IDOK)
    {
        std::ofstream ofs((LPCTSTR)dlg.GetFileName());
        dse::convex_hull &ch = ((CConvexHullDoc *) GetActiveDocument())->GetConvexHull();
        for(dse::size_t i = 0; i < ch.get_convex_points_count(); i++ )
        {
            ofs << ch.get_convex_point(i).x << " " << ch.get_convex_point(i).y << std::endl;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -