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

📄 convexhulldoc.cpp

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

#include "stdafx.h"
#include "ConvexHull.h"

#include <istream>
#include <fstream>
#include <sstream>

#include "ConvexHullDoc.h"
#include "ConvexHullView.h"
#include "MainFrm.h"

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

/////////////////////////////////////////////////////////////////////////////
// CConvexHullDoc

IMPLEMENT_DYNCREATE(CConvexHullDoc, CDocument)

BEGIN_MESSAGE_MAP(CConvexHullDoc, CDocument)
	//{{AFX_MSG_MAP(CConvexHullDoc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CConvexHullDoc construction/destruction

//##ModelId=443378C90037
CConvexHullDoc::CConvexHullDoc()
{
	// TODO: add one-time construction code here
}

//##ModelId=443378C9004F
CConvexHullDoc::~CConvexHullDoc()
{
}

//##ModelId=443378C9004A
BOOL CConvexHullDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

    m_ContexHull.clear();
#if 0
    m_ContexHull.add_point(20,0);
    m_ContexHull.add_point(10,0);
    m_ContexHull.add_point(0,10);
    m_ContexHull.add_point(60,20);
    m_ContexHull.add_point(40,30);
    m_ContexHull.add_point(50,60);
    m_ContexHull.add_point(10,10);
    m_ContexHull.add_point(20,20);
    m_ContexHull.add_point(0,0);
    m_ContexHull.add_point(5,5);
#elif 0
    m_ContexHull.add_point(10,10);
    m_ContexHull.add_point(10,20);
    m_ContexHull.add_point(10,30);
    m_ContexHull.add_point(10,40);
#endif
    m_ContexHull.solve();

	return TRUE;
}

//从文本流添加点坐标,支持两种格式
//格式一:第一行一个整数n,指明总共有多少个点,以后n行以 x,y 的形式给出,为各个点的坐标
//格式二:每行都以 x,y 的形式给出各个点的坐标
//##ModelId=443378C90045
void CConvexHullDoc::AddPointsByTextStream(std::istream &is)
{
    std::string s;
    std::getline(is, s);
    std::istringstream iss(s);
    double a,b;
    int n;

    
    iss >> a;
    skip_to_next_number(iss);
    if(! (iss >> b) )
    {
        //第一行只有一个数,是总共点数
        n = int(a);
    }
    else
    {
        //第一行有两个数,是一个坐标
        m_ContexHull.add_point(a, b);
        n = -1;
    }
    while(n != 0 && is)
    {
        is >> a;
        skip_to_next_number(is);
        if(! (is >> b) )
            break;
        m_ContexHull.add_point(a, b);
        n--;
    }
}

//##ModelId=443378C90038
BOOL CConvexHullDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
	if (IsModified())
		TRACE0("Warning: OnOpenDocument replaces an unsaved document.\n");

	DeleteContents();
	SetModifiedFlag();  // dirty during de-serialize

    
    m_ContexHull.clear();
    std::ifstream ifs(lpszPathName);
    AddPointsByTextStream(ifs);
    m_ContexHull.solve();
	SetModifiedFlag(FALSE);     // start off with unmodified

    ((CMainFrame *)AfxGetMainWnd())->GetActiveConvexHullView()->ZoomAdjust();
	return TRUE;
}

//##ModelId=443378C90041
BOOL CConvexHullDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
    dse::size_t i;
    std::ofstream ofs(lpszPathName);
    for(i = 0; i < m_ContexHull.get_points_count(); i++)
    {
        dse::point2d &p = m_ContexHull.get_point(i);
        ofs << p.x << " " << p.y << std::endl;
    }
    ofs.close();
    
	SetModifiedFlag(FALSE);     // back to unmodified

	return TRUE;        // success
}
/////////////////////////////////////////////////////////////////////////////
// CConvexHullDoc serialization

//##ModelId=443378C9004C
void CConvexHullDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CConvexHullDoc diagnostics

#ifdef _DEBUG
//##ModelId=443378C90051
void CConvexHullDoc::AssertValid() const
{
	CDocument::AssertValid();
}

//##ModelId=443378C90055
void CConvexHullDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CConvexHullDoc commands

⌨️ 快捷键说明

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