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

📄 paintchord.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PaintChord.cpp: implementation of the CPaintChord class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "const.h"
#include "painted.h"
#include "paintobj.h"
#include "paintdoc.h"
#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "PaintChord.h"
#include "math.h"
#include "FillColorStatic.h"
#include "ChordAttrDlg.h"
#include "DeviceChordAttrDlg.h"

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

extern void DPtoVP(CPnt pnt,CPoint& point);
extern void VPtoDP(CPoint point,CPnt& pnt);
//////////////////////////////////////////////////////////////////////

IMPLEMENT_SERIAL(CPaintChord, CObject, VERSIONABLE_SCHEMA)
// Construction/Destruction
CPaintChord::CPaintChord()
{
	m_bFilled=TRUE;
	m_rgbInside=RGB(125,125,125);	
}

CPaintChord::~CPaintChord()
{

}
void CPaintChord::Draw(CDC* pDC)
{
	pDC->SetROP2(R2_COPYPEN);
	CPen*	pOldPen;
	CPen	DrawPen;
	CBrush*	pOldBrush;
	CBrush	DrawBrush;
	DrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&DrawPen);
	if (m_bFilled)
	{
		DrawBrush.CreateSolidBrush(m_rgbInside);
		pOldBrush = pDC->SelectObject(&DrawBrush);
	}
	else
	{
		pOldBrush = (CBrush *) pDC->SelectStockObject(WHITE_BRUSH);
	}
	CPoint m_pupperleft1;
	CPoint m_plowerright1;
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;

	DPtoVP(m_pupperleft,m_pupperleft1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(m_plowerright,m_plowerright1);
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);

	pDC->Chord(m_pupperleft1.x,m_pupperleft1.y,m_plowerright1.x,m_plowerright1.y,m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);
	
	pDC->SelectObject(pOldPen);
}

void CPaintChord::DragDraw(CDC* pDC, CPnt& pointDragged)
{
	pDC->SetROP2(R2_NOT);//R2_XORPEN	R2_NOT
	CPen*	pOldPen;
	CPen	pDrawPen;
	CPoint m_pupperleft1;
	CPoint m_plowerright1;
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
		
	pDC->SelectStockObject(HOLLOW_BRUSH);
	pDrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth)>2? 1:1, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	Calculate(m_pointEnd);
	DPtoVP(m_pupperleft,m_pupperleft1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(m_plowerright,m_plowerright1);
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);
	pDC->Chord(m_pupperleft1.x,m_pupperleft1.y,m_plowerright1.x,m_plowerright1.y,m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);
	
	m_pointEnd.x=pointDragged.x;
	m_pointEnd.y=pointDragged.y;

	Calculate(m_pointEnd);
	DPtoVP(m_pupperleft,m_pupperleft1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(m_plowerright,m_plowerright1);
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);
	pDC->Chord(m_pupperleft1.x,m_pupperleft1.y,m_plowerright1.x,m_plowerright1.y,m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);

	pDC->SelectObject(pOldPen);
}

void CPaintChord::Move(double x_Move,double y_Move)
{	
	//移动起点终点左上角右下角及圆心坐标
	m_pointPrimary.x+=x_Move;
	m_pointEnd.x+=x_Move;
	m_pupperleft.x+=x_Move;
	m_plowerright.x+=x_Move;
	m_pcirclecenter.x+=x_Move;

	m_pointPrimary.y+=y_Move;
	m_pointEnd.y+=y_Move;
	m_pupperleft.y+=y_Move;
	m_plowerright.y+=y_Move;
	m_pcirclecenter.y+=y_Move;
}

void CPaintChord::MoveDraw(CDC* pDC, CPnt& p1,CPnt& p2)
{
	pDC->SetROP2(R2_XORPEN);//R2_XORPEN	
	CPen*	pOldPen;
	CPen	pDrawPen;
	CPoint m_pp1;
	CPoint m_pp2;
	CPoint pp1;
	CPoint pp2;
	DPtoVP(m_p1,m_pp1);
	DPtoVP(m_p2,m_pp2);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(p1,pp1);
	DPtoVP(p2,pp2);
	pDrawPen.CreatePen(PS_DOT, 0, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);
	if(m_bFirstMove)//第一次移动
	{
		m_bFirstMove=FALSE;
		pDC->MoveTo(pp1.x,pp1.y);
		pDC->LineTo(pp2.x,pp2.y);
	}
	else
	{
		pDC->MoveTo(m_pp1.x,m_pp1.y);
		pDC->LineTo(m_pp2.x,m_pp2.y);
		pDC->MoveTo(pp1.x,pp1.y);
		pDC->LineTo(pp2.x,pp2.y);
	}
	m_p1=p1;
	m_p2=p2;
	pDC->SelectObject(pOldPen);
}

void CPaintChord::DrawSelected(CDC* pDC, void* pTemp)
{	 
	pDC->SetROP2(R2_COPYPEN);		
	CBrush 	DrawBrush;
	CBrush* pOldBrush;
	CPen*	pOldPen;
	CPen	pDrawPen;	

	DrawBrush.CreateHatchBrush(HS_FDIAGONAL, 0);
	pOldBrush = pDC->SelectObject(&DrawBrush);

	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	CPoint m_pupperleft1;
	CPoint m_plowerright1;
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	DPtoVP(m_pupperleft,m_pupperleft1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(m_plowerright,m_plowerright1);
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);	

	pDC->Chord(m_pupperleft1.x,m_pupperleft1.y,m_plowerright1.x,m_plowerright1.y,m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);
	
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}
/*
void CPaintChord::DrawSpecialNode(CDC* pDC)//显示断点非相切点
{
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush*	pOldBrush;		
	pOldBrush = (CBrush *) pDC->SelectStockObject(WHITE_BRUSH);
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);	
	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
	//起点状态0=相切点1=非相切点2=断点
	if(m_uStartNodeState==2)//断点
	{
		pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y-3);
		pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y+4);
		pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y+3);
		pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y-4);
	}
	else if(m_uStartNodeState==1)//非相切点
	{
		pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
	}
	//终点状态0=相切点1=非相切点2=断点
	if(m_uEndNodeState==2)//断点
	{
		pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y-3);
		pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y+4);
		pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y+3);
		pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y-4);
	}
	else if(m_uEndNodeState==1)//非相切点
	{
		pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
	}
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}
*/
void CPaintChord::OnDown(CPnt& pointDown)
{
	m_pointEnd.x = m_pointPrimary.x = pointDown.x;
	m_pointEnd.y = m_pointPrimary.y = pointDown.y;
	m_pdiscirclecenter.x=pointDown.x;
	m_pdiscirclecenter.y=pointDown.y;
}
/*
void CPaintChord::ChangeOrigin(CPnt pnt)//改变坐标原点
{	
	m_pointPrimary.x=m_pointPrimary.x-pnt.x;
	m_pointPrimary.y=m_pointPrimary.y-pnt.y;
	m_pointEnd.x=m_pointEnd.x-pnt.x;
	m_pointEnd.y=m_pointEnd.y-pnt.y;
}
*/
void CPaintChord::OnDown2(CPnt& pointDown)
{
	m_pcirclecenter.x=pointDown.x;
	m_pcirclecenter.y=pointDown.y;
}
void CPaintChord::OnUp(CPnt& pointUp, CWnd* pWnd)
{
	CClientDC tempDC(pWnd);
	Draw(&tempDC);
}
/*
//
//判断是否点击了某节点
//返回0==没击中,1==击中起点,2==击中终点
UINT CPaintChord::IsHit1(CPnt& pointBang)
{
	UINT forreturn=0;
	CPoint m_pointPrimary1;	
	CPoint m_pointEnd1;
	CPoint m_pointBang1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);	
	DPtoVP(m_pointEnd,m_pointEnd1);
	DPtoVP(pointBang,m_pointBang1);
	if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointPrimary1.x,m_pointPrimary1.y)<4)
	{
		forreturn=1;
	}
	else if(Distance(m_pointBang1.x,m_pointBang1.y,m_pointEnd1.x,m_pointEnd1.y)<4)
	{
		forreturn=2;
	}
	return forreturn;
}
*/

void CPaintChord::IsDblClk(void* pTemp1,void* pTemp2)//是否被双击选中
{
	if(m_uObjectType==1)//地图对象的类型0=路径1=建筑2=设备
		IsDblClkBuilding(pTemp1,pTemp2);
	else if(m_uObjectType==2)
		IsDblClkDevice(pTemp1,pTemp2);
}

BOOL CPaintChord::IsHit(CPnt& pointBang)
{
	double xx,yy,x2,y2;
	double Angle,m_nrr;	
	POINT bbcc[3];
	CRgn rgn;	
	CPoint start,end,center,bang;	
	DPtoVP(m_pointPrimary,start);
	DPtoVP(m_pointEnd,end);
	DPtoVP(m_pcirclecenter,center);
	DPtoVP(pointBang,bang);
	bbcc[0]=start;
	bbcc[1]=end;
	bbcc[2]=center;
	rgn.CreatePolygonRgn(bbcc,3,ALTERNATE);

	xx=m_pcirclecenter.x;
	yy=m_pcirclecenter.y;
	x2=pointBang.x;
	y2=pointBang.y;
	m_nrr=sqrt((xx-x2)*(xx-x2)+(yy-y2)*(yy-y2));
	//得到点相对圆心的弧度
	double yh=(x2-xx)/m_nrr;
	if(yh<-1) yh=-1;
	if(yh>1) yh=1;
	Angle=acos(yh);
	if(y2-yy<0)	
		Angle=(pi*2-Angle);		

	if(m_Angle2>m_Angle1)//结束弧度大于起始弧度
	{
		if(m_Angle2-m_Angle1>=pi)//优弧
		{
			if(Angle<=m_Angle2 && Angle>=m_Angle1 && m_nrr<=m_nr)
			{rgn.DeleteObject(); return TRUE;}			
			if(rgn.PtInRegion(bang.x,bang.y)!=0)
			{rgn.DeleteObject(); return TRUE;}
		}
		else//劣弧
		{
			if(Angle<=m_Angle2 && Angle>=m_Angle1 && m_nrr<=m_nr && (rgn.PtInRegion(bang.x,bang.y)==0))
			{rgn.DeleteObject(); return TRUE;}			
		}		
	}
	else//结束弧度小于起始弧度
	{
		if(m_Angle1-m_Angle2<pi)//优弧
		{
			if(!(Angle>=m_Angle2 && Angle<=m_Angle1) && m_nrr<=m_nr)
			{rgn.DeleteObject(); return TRUE;}					
			if(rgn.PtInRegion(bang.x,bang.y)!=0)
			{rgn.DeleteObject(); return TRUE;}
		}
		else//劣弧
		{
			if(!(Angle>=m_Angle2 && Angle<=m_Angle1) && m_nrr<=m_nr && (rgn.PtInRegion(bang.x,bang.y)==0))
			{rgn.DeleteObject(); return TRUE;}
		}		
	}
	rgn.DeleteObject();
	return FALSE;
}

void CPaintChord::GetBoundingRect(double &minx,double &miny,double &maxx,double &maxy)
{
	double x,y,x1,y1,x2,y2,an1,an2;
	int i,pb;
	an1=m_Angle1;
	an2=m_Angle2;
	
	//得到圆弧起点坐标m_pointPrimary
	x=m_pointPrimary.x;
	y=m_pointPrimary.y;

	x1=x;y1=y;x2=x;y2=y;//矩形边界初始化
	//得到圆弧终点坐标m_pointEnd
	x=m_pointEnd.x;
	y=m_pointEnd.y;

	//得到最小和最大坐标
	x1=min(x,x1);x2=max(x,x2);y1=min(y,y1);y2=max(y,y2);
	if(an1<an2) pb=1;//圆弧不经过x轴正向
	else						//与x轴正向相交
	{
		x=m_pcirclecenter.x+m_nr;y=m_pcirclecenter.y;//与x轴正向交点坐标
		//得到最小和最大坐标
		x1=min(x,x1);x2=max(x,x2);y1=min(y,y1);y2=max(y,y2);
		pb=2;					//表示跨过x轴正向
	}
	for(i=1;i<4;i++)//对另外三坐标轴循环
	{
		//如果坐标轴与弧相交
		if(pb==1 && pi/2*i>an1 && pi/2*i<an2 ||
		   pb==2 && !(pi/2*i>an2 && pi/2*i<an1))
		{
			if(i==1)//与y轴正向相交
			{
				x=m_pcirclecenter.x;y=m_pcirclecenter.y+m_nr;//交点坐标
			}
			if(i==2)//与x轴负向相交
			{
				x=m_pcirclecenter.x-m_nr;y=m_pcirclecenter.y;//交点坐标
			}
			if(i==3)//与y轴负向相交
			{
				x=m_pcirclecenter.x;y=m_pcirclecenter.y-m_nr;//交点坐标
			}
			//得到最小和最大坐标
			x1=min(x,x1);x2=max(x,x2);y1=min(y,y1);y2=max(y,y2);		
		}
	}
	minx= x1;
	miny= y1;
	maxx= x2;
	maxy= y2;
}

void CPaintChord::Serialize(CArchive& ar)
{	
	CPainted::Serialize(ar);
	if (ar.IsStoring())
	{		
		ar << m_pointEnd;
		ar << m_nr;
		ar << m_pupperleft;
		ar << m_plowerright;
		ar << m_pcirclecenter;		
		ar <<m_Angle1;
		ar <<m_Angle2;
		ar <<m_rgbInside;
		ar <<m_bFilled;
	}
	else
	{		
		ar >> m_pointEnd;
		ar >> m_nr;
		ar >> m_pupperleft;
		ar >> m_plowerright;
		ar >> m_pcirclecenter;		
		ar >>m_Angle1;
		ar >>m_Angle2;
		ar >>m_rgbInside;
		ar >>m_bFilled;
	}
}


void CPaintChord::onup1(CPnt& point1, CPnt& point2, CPnt& point3,CWnd *pWnd)
{	m_pointPrimary=point1;
	m_pointEnd=point2;
}

CPnt CPaintChord::returnattr1()
{
	return m_pointPrimary;
}
CPnt CPaintChord::returnattr2()
{
	return	m_pointEnd;
}
//得到绘制起点
//pnt1 为传递的鼠标点坐标,m_EllipsePaintMode==1时
//修改pnt1为人工输入的端点坐标
//pnt2无意义
//返回值无意义

⌨️ 快捷键说明

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