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

📄 geopolygon.cpp

📁 软件参考Windows操作系统下的画图程序
💻 CPP
字号:
// GeoPolygon.cpp: implementation of the GeoPolygon class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Drawing.h"
#include "GeoPolygon.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

GeoPolygon::GeoPolygon()
{

}

GeoPolygon::GeoPolygon(PointVector pt)
{
	for(int i=0; i<pt.size(); i++)
		point.push_back(CPoint(pt[i].x, pt[i].y));
}

GeoPolygon::~GeoPolygon()
{

}

//point私有,因此必须提供相关接口
void GeoPolygon::AddPoint(CPoint pt)//点从后面加
{
	point.push_back(pt);
}

void GeoPolygon::Draw(CDC &dc)
{
	CPen pen(PS_SOLID, m_nWidth, m_color);
	CPen *oldpen = dc.SelectObject(&pen);

	if(m_nMode==0)//线框模式
	{
		dc.Polyline(&point[0], point.size());
	}
	else//填充模式
	{
		CBrush bru(m_color);
		CBrush *oldbru = dc.SelectObject(&bru);	
		dc.Polygon(&point[0],point.size());
		dc.SelectObject(oldbru);
	}
	dc.SelectObject(oldpen);
}

//判断该多边形是否封闭?
BOOL GeoPolygon::IsClose()
{
	if(point.size()>2)
	{
		//如果最后一点离起始点3个象素范围,可以认为封闭
		if(abs(point[0].x-point[point.size()-1].x)<=3 && abs(point[0].y-point[point.size()-1].y)<=3)
		{
			point.pop_back();//除去最后一点,因为它虽然可以认为"等于"起始点,但是毕竟可能相差3个象素范围
			point.push_back(point[0]);//把起始点作为最后一点加到数组中
			return TRUE;
		}
		else
			return FALSE;
	}
	else
		return FALSE;
}

//去除数组所有元素,使得为空
void GeoPolygon::Reset()
{
	int count = point.size();
	for(int i=0; i<count; i++)
		point.pop_back();
}

//使该多边形封闭
void GeoPolygon::SetClose()
{
	if(point.size()<1)
		return;
	if(point[0].x==point[point.size()-1].x && point[0].y==point[point.size()-1].y)
		return;
	point.push_back(point[0]);
}

//不执行上述封闭操作,恢复原来的状态
void GeoPolygon::UndoSetClose()
{
	if(point.size()<1)
		return;
	if(point[0].x==point[point.size()-1].x && point[0].y==point[point.size()-1].y)
		point.pop_back();
}

//不执行上述增加元素操作
void GeoPolygon::UndoAdd()
{
	if(point.size()<1)
		return;
	point.pop_back();
}

⌨️ 快捷键说明

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