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

📄 paintchord.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
int CPaintChord::GetPathStartnode(CPnt& pnt1, CPnt& pnt2)
{
	if(m_pDoc->m_ChordPaintMode==2||m_pDoc->m_ChordPaintMode==3)//Ellipse的绘制模式
	{
		pnt1=m_pDoc->m_pPaintStartNode;//绘图时给定的起点
	}	
	return 1;
}
//得到绘制终点
//返回值无意义
//
BOOL CPaintChord::GetPathEndnode(CPnt& pnt1)
{	
	BOOL  forreturn=FALSE;
	double x1,y1,xx,yy,x2,y2;
	double rr,Angle,r;
	CPnt	circlecenter;
	CPnt	pointPrimary;
	pointPrimary=((CPaintChord*) m_pDoc->m_pSelectedTool)->m_pointPrimary;
	circlecenter=((CPaintChord*) m_pDoc->m_pSelectedTool)->m_pcirclecenter;
	xx=circlecenter.x;
	yy=circlecenter.y;
	x1=pointPrimary.x;
	y1=pointPrimary.y;
	x2=pnt1.x;
	y2=pnt1.y;
	r=sqrt((xx-x1)*(xx-x1)+(yy-y1)*(yy-y1));//半径
	rr=sqrt((xx-x2)*(xx-x2)+(yy-y2)*(yy-y2));//鼠标点到圆心距离
	//得到点相对圆心的弧度
	double x=(x2-xx)/rr;
	if(x<-1) x=-1;
	if(x>1) x=1;
	Angle=acos(x);
	if(y2-yy<0)	Angle=(pi*2-Angle);
	//准终点坐标
	pnt1.x=(double) (xx+r*cos(Angle));
	pnt1.y=(double) (yy+r*sin(Angle));
	if(m_pDoc->m_ChordPaintMode==3)
	{
		pnt1=m_pDoc->m_pPaintEndNode;//绘图时给定的终点		
	}
	return forreturn;
}
/*
double CPaintChord::Distance1(double x1, double y1, double x2, double y2)
{
return (double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

void CPaintChord::toChar(char *p_Char)
{
	double x1,y1,x2,y2,Speed,Length,Angle;
	UINT PathId,StartId,StartType,EndId,EndType,HeadDir,Guide,Obstacle;
	x1=m_pointPrimary.x;
	y1=m_pointPrimary.y;
	x2=m_pointEnd.x;
	y2=m_pointEnd.y;

	Speed=m_fPathLimit;//速度限制
	Length=m_flength;//直线长度
	Angle=m_fangle;//直线角度
	PathId=m_uPathId;//路径ID 5
	StartId=m_uStartNodeId;//起点ID 5
	StartType=m_uStartNodeType;//起点类型 2
	EndId=m_uEndNodeId;//终点ID 5
	EndType=m_uEndNodeType;//终点类型 2
	HeadDir=m_uPathHeading;//路径车头方向 2
	Guide=m_uPathGuideType;//导航方式 1
	Obstacle=m_uPathObstacle;//路径障碍物模式 4	
	char p1[126];
	//把格式化数据写到字符串
	sprintf(p1,"%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%5d,%5d,%2d,%5d,%2d,%2d,%1d,%4d\n",
		x1,y1,x2,y2,Speed,Length,Angle,PathId,StartId,
		StartType,EndId,EndType,HeadDir,Guide,Obstacle);
	p1[125]=0;
	lstrcat(p_Char,p1);//增加在p_Char字符串后
}

char * CPaintChord::toData(char *p_Char)
{
	float x1,y1,x2,y2,Speed,Length,Angle;
	UINT PathId,StartId,StartType,EndId,EndType,HeadDir,Guide,Obstacle;
	char p1[126];
	strncpy(p1,p_Char,125);	//拷贝一个125字节长度的字符串
	p_Char+=125;			//指向成员变量的字符串后的位置
	p1[125]=0;
	//从字符串读格式化数据
	sscanf(p1,"%f,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d,%d,%d,%d,%d\n",
		&x1,&y1,&x2,&y2,&Speed,&Length,&Angle,&PathId,&StartId,
		&StartType,&EndId,&EndType,&HeadDir,&Guide,&Obstacle);
	m_pointPrimary.x=x1;
	m_pointPrimary.y=y1;
	m_pointEnd.x=x2;
	m_pointEnd.y=y2;

	m_fPathLimit=Speed;//速度限制
	m_flength=Length;//直线长度
	m_fangle=Angle;//直线角度
	m_uPathId=PathId;//路径ID
	m_uStartNodeId=StartId;//起点ID
	m_uStartNodeType=StartType;//起点类型
	m_uEndNodeId=EndId;//终点ID
	m_uEndNodeType=EndType;//终点类型
	m_uPathHeading=HeadDir;//路径车头方向
	m_uPathGuideType=Guide;//导航方式
	m_uPathObstacle=Obstacle;//路径障碍物模式
	return p_Char;			//返回指向成员变量的字符串后的位置
}
void CPaintChord::Move(double x_Move,double y_Move)
{
	//移动直线的起点和终点坐标
	m_pointPrimary.x+=x_Move;
	m_pointEnd.x+=x_Move;
	m_pointPrimary.y+=y_Move;
	m_pointEnd.y+=y_Move;
}
void CPaintChord::DrawErase(CDC* pDC)//擦除图形WHITE_BRUSHHOLLOW_BRUSH
{	
	pDC->SetROP2(R2_COPYPEN);
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush*	pOldBrush;		
	pOldBrush = (CBrush *) pDC->SelectStockObject(HOLLOW_BRUSH);
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDrawPen.CreatePen(PS_SOLID, m_nWidth, RGB(255,255,255));
	pOldPen = pDC->SelectObject(&pDrawPen);	
	pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
	pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
	pDC->Ellipse(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
	pDC->Ellipse(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);

	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}
*/

//CPnt& pnt1代表鼠标点坐标,并作为圆心返回
int CPaintChord::GetChordCirclecenter(CPnt& pnt1,CPaintobjDoc* pDoc)
{
	int  forreturn=0;
	CPnt startnode;	
	startnode=((CPaintChord*) pDoc->m_pSelectedTool)->m_pointPrimary;

	//给定半径和起点画Chord
	if(pDoc->m_ChordPaintMode==1||pDoc->m_ChordPaintMode==2)
	{
		double x1,y1,xx,yy;
		double rr,Angle,m_nrr;
		xx=startnode.x;
		yy=startnode.y;
		x1=pnt1.x;
		y1=pnt1.y;			
		rr=sqrt((xx-x1)*(xx-x1)+(yy-y1)*(yy-y1));			
		m_nrr=pDoc->m_dPaintRadius;
		//得到鼠标按下点相对起点的弧度
		double x=(x1-xx)/rr;
		if(x<-1) x=-1;
		if(x>1) x=1;
		Angle=acos(x);
		if(y1-yy<0)	Angle=(pi*2-Angle);			
		//得到圆心坐标
		pnt1.x=xx+m_nrr*cos(Angle);
		pnt1.y=yy+m_nrr*sin(Angle);
		forreturn=1;		
	}
	//给定半径起点和终点画Chord
	else if(pDoc->m_ChordPaintMode==3)
	{		
		double x1,y1,x2,y2,xx,yy,x3,y3;//起点,终点,中点,鼠标按下点
		double rr1,rr2,rr3,Angle,Angle1,Angle2;
	
		x1=startnode.x;
		y1=startnode.y;
		x2=pDoc->m_pPaintEndNode.x;
		y2=pDoc->m_pPaintEndNode.y;
		xx=(x1+x2)/2;
		yy=(y1+y2)/2;	
		x3=pnt1.x;
		y3=pnt1.y;
		
		rr1=sqrt((xx-x1)*(xx-x1)+(yy-y1)*(yy-y1));	
		rr2=sqrt((xx-x3)*(xx-x3)+(yy-y3)*(yy-y3));
		rr3=sqrt(pDoc->m_dPaintRadius*pDoc->m_dPaintRadius-rr1*rr1);
		//得到直线起点相对中点的弧度
		double x=(x1-xx)/rr1;
		if(x<-1) x=-1;
		if(x>1) x=1;
		Angle1=acos(x);
		if(y1-yy<0)	Angle1=(pi*2-Angle1);
		//得到鼠标按下点相对中点的弧度
		double y=(x3-xx)/rr2;
		if(y<-1) y=-1;
		if(y>1) y=1;
		Angle2=acos(y);
		if(y3-yy<0)	Angle2=(pi*2-Angle2);
		if(Angle2>Angle1&&Angle2<Angle1+pi ||Angle2<Angle1&&Angle2+pi<Angle1)//若为逆时针方向
		{
			//Angle为半径所在直线相对中点的弧度
			Angle=Angle1+pi/2;
			if(Angle>=2*pi) Angle=Angle-2*pi;
		}
		else//若为顺时针方向
		{
			//Angle为半径所在直线相对中点的弧度
			Angle=Angle1-pi/2;
			if(Angle<0) Angle=Angle+2*pi;
		}
		pnt1.x=xx+rr3*cos(Angle);
		pnt1.y=yy+rr3*sin(Angle);
		forreturn=1;		
	}
	//若非相切画法或弧以任意点为起点则pnt1值不变即圆心为鼠标按下点
	return forreturn;
}

//动态显示半径和圆弧所在的圆
void CPaintChord::DragDrawCircle(CDC* pDC, CPnt& pnt,CPaintobjDoc* pDoc)
{
	pDC->SetROP2(R2_NOT);	
	double xx,yy,x1,y1;
	double rr;
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush*	pOldBrush;		
	pOldBrush = (CBrush *) pDC->SelectStockObject(HOLLOW_BRUSH);
	CPnt startnode;
	CPnt discirclecenter;
	CPnt pupperleft;//左上角
	CPnt plowerright;//右下角
	CPoint startnode1;	
	CPoint	discirclecenter1;	
	CPoint pupperleft1;//左上角
	CPoint plowerright1;//右下角
	CPoint pnt1;
	CPoint pointPrimary1;
	DPtoVP(m_pointPrimary,pointPrimary1);
	discirclecenter=((CPaintChord*) pDoc->m_pSelectedTool)->m_pdiscirclecenter;
	startnode=((CPaintChord*) pDoc->m_pSelectedTool)->m_pointPrimary;
	DPtoVP(startnode,startnode1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(discirclecenter,discirclecenter1);
	DPtoVP(pnt,pnt1);	
	pDrawPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
	pOldPen = pDC->SelectObject(&pDrawPen);
	pDC->MoveTo(startnode1.x,startnode1.y);
	pDC->LineTo(discirclecenter1.x,discirclecenter1.y);
	xx=discirclecenter.x;
	yy=discirclecenter.y;
	x1=startnode.x;
	y1=startnode.y;		
	rr=sqrt((xx-x1)*(xx-x1)+(yy-y1)*(yy-y1));
	pupperleft.x=xx-rr;
	pupperleft.y= yy+rr;
	plowerright.x=xx+rr;
	plowerright.y=yy-rr;
	DPtoVP(pupperleft,pupperleft1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(plowerright,plowerright1);
//	pDC->Ellipse(pupperleft1.x,pupperleft1.y,plowerright1.x,plowerright1.y);
	pDC->Chord(pupperleft1.x,pupperleft1.y,plowerright1.x,plowerright1.y,pointPrimary1.x,pointPrimary1.y,pointPrimary1.x,pointPrimary1.y);	
	pDC->MoveTo(startnode1.x,startnode1.y);
	pDC->LineTo(pnt1.x,pnt1.y);
	xx=pnt.x;
	yy=pnt.y;
	x1=startnode.x;
	y1=startnode.y;		
	rr=sqrt((xx-x1)*(xx-x1)+(yy-y1)*(yy-y1));
	pupperleft.x=xx-rr;
	pupperleft.y= yy+rr;
	plowerright.x=xx+rr;
	plowerright.y=yy-rr;
	DPtoVP(pupperleft,pupperleft1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(plowerright,plowerright1);
//	pDC->Ellipse(pupperleft1.x,pupperleft1.y,plowerright1.x,plowerright1.y);
	pDC->Chord(pupperleft1.x,pupperleft1.y,plowerright1.x,plowerright1.y,pointPrimary1.x,pointPrimary1.y,pointPrimary1.x,pointPrimary1.y);	
	((CPaintChord*) pDoc->m_pSelectedTool)->m_pdiscirclecenter= pnt;
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}


//起点圆心法画弧计算方法如下:
//此函数经考虑,使传递来的CPnt& point为
//由CPaintobjView::GetArcEndnode(CPnt& pnt1)计算出的确切终点
//函数算法不变
BOOL CPaintChord::Calculate(CPnt& point)
{	
	double x1,y1,xx,yy,x2,y2;
	double Angle2,m_nrr,Angle1;
	xx=m_pcirclecenter.x;
	yy=m_pcirclecenter.y;
	x1=m_pointPrimary.x;
	y1=m_pointPrimary.y;
	x2=point.x;
	y2=point.y;
	m_nr=sqrt((xx-x1)*(xx-x1)+(yy-y1)*(yy-y1));
	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;
	Angle2=acos(yh);
	if(y2-yy<0)	Angle2=(pi*2-Angle2);
	m_Angle2=Angle2;
	//把计算得到的数据,存入类的各个变量中
	m_pupperleft.x=(double) (xx-m_nr);
	m_pupperleft.y=(double) (yy+m_nr);
	m_plowerright.x=(double) (xx+m_nr);
	m_plowerright.y=(double) (yy-m_nr);
	//得到起点相对圆心的弧度
	yh=(x1-xx)/m_nr;
	if(yh<-1) yh=-1;
	if(yh>1) yh=1;
	Angle1=acos(yh);
	if(y1-yy<0)	Angle1=(pi*2-Angle1);
	m_Angle1=Angle1;
	return TRUE;
}

CPnt CPaintChord::returncirclecenter()//返回圆心
{
	return	m_pcirclecenter;
}

double CPaintChord::returnradius()		//返回半径
{
	return	m_nr;
}

void CPaintChord::toChar(char *p_Char)
{
	
}

char * CPaintChord::toData(char *p_Char)
{
	
	return p_Char;			//返回指向成员变量的字符串后的位置
}

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;	
	m_pcirclecenter.x=m_pcirclecenter.x-pnt.x;
	m_pcirclecenter.y=m_pcirclecenter.y-pnt.y;
	m_pupperleft.x=m_pupperleft.x-pnt.x;
	m_pupperleft.y=m_pupperleft.y-pnt.y;
	m_plowerright.x=m_plowerright.x-pnt.x;
	m_plowerright.y=m_plowerright.y-pnt.y;

}

void CPaintChord::IsDblClkBuilding(void *pTemp1, void *pTemp2)
{
	BOOL change=FALSE;
	m_pDoc = (CPaintobjDoc*) pTemp1;
	CChordAttrDlg chordattr;				
	chordattr.m_pDoc =(CPaintobjDoc*) pTemp1;
	chordattr.m_pActive1=this;	
	chordattr.m_dStartx=m_pointPrimary.x;//起点坐标
	chordattr.m_dStarty=m_pointPrimary.y;//起点坐标
	chordattr.m_dEndx=m_pointEnd.x;//终点坐标
	chordattr.m_dEndy=m_pointEnd.y;//终点坐标
	chordattr.m_bFill=m_bFilled;
	chordattr.m_dCenterx=m_pcirclecenter.x;	
	chordattr.m_dCentery=m_pcirclecenter.y;
	chordattr.m_dRadius=m_nr;
	chordattr.m_dStartAngle =m_Angle1*180.0/pi;//angle*180.0/pi;
	chordattr.m_dEndAngle=m_Angle2*180.0/pi;
	chordattr.m_ctlFillColor.m_FillColor=m_rgbInside;
	if(chordattr.DoModal()==IDOK)
	{
		if(m_pointPrimary.x!=chordattr.m_dStartx||m_pointPrimary.y!=chordattr.m_dStarty
			||m_pointEnd.x!=chordattr.m_dEndx||m_pointEnd.y!=chordattr.m_dEndy)
		{
			change=TRUE;
			m_pointPrimary.x=chordattr.m_dStartx;	
			m_pointPrimary.y=chordattr.m_dStarty;	
			m_pointEnd.x=chordattr.m_dEndx;
			m_pointEnd.y=chordattr.m_dEndy;
		}
		if(chordattr.m_bFill!=m_bFilled)
		{
			change=TRUE;
			m_bFilled=chordattr.m_bFill;			
		}
		if(m_bFilled&&m_rgbInside!=chordattr.m_ctlFillColor.m_FillColor)
		{
			change=TRUE;
			m_rgbInside=chordattr.m_ctlFillColor.m_FillColor;
		}
		if(change) 
		{
			((CPaintobjView*) pTemp2)->Invalidate();
		}
	}
}

void CPaintChord::IsDblClkDevice(void *pTemp1, void *pTemp2)
{
	BOOL change=FALSE;
	m_pDoc = (CPaintobjDoc*) pTemp1;
	CDeviceChordAttrDlg chordattr;				
	chordattr.m_nDeviceId=m_nDeviceId;
	chordattr.m_nSomeStatus=m_nSomeStatus;
	chordattr.m_nStatusNumber=m_nStatusNumber;
	chordattr.m_dStartx=m_pointPrimary.x;//起点坐标
	chordattr.m_dStarty=m_pointPrimary.y;//起点坐标
	chordattr.m_dEndx=m_pointEnd.x;//终点坐标
	chordattr.m_dEndy=m_pointEnd.y;//终点坐标
	chordattr.m_bFill=m_bFilled;
	chordattr.m_dCirclecenterx=m_pcirclecenter.x;	
	chordattr.m_dCirclecentery=m_pcirclecenter.y;
	chordattr.m_dRadius=m_nr;
	chordattr.m_dStartAngle =m_Angle1*180.0/pi;//angle*180.0/pi;
	chordattr.m_dEndAngle=m_Angle2*180.0/pi;
	chordattr.m_ctlFillColor.m_FillColor=m_rgbInside;
	if(chordattr.DoModal()==IDOK)
	{
		m_nDeviceId=chordattr.m_nDeviceId;
		m_nSomeStatus=chordattr.m_nSomeStatus;
		m_nStatusNumber=chordattr.m_nStatusNumber;
		if(m_pointPrimary.x!=chordattr.m_dStartx||m_pointPrimary.y!=chordattr.m_dStarty
			||m_pointEnd.x!=chordattr.m_dEndx||m_pointEnd.y!=chordattr.m_dEndy)
		{
			change=TRUE;
			m_pointPrimary.x=chordattr.m_dStartx;	
			m_pointPrimary.y=chordattr.m_dStarty;	
			m_pointEnd.x=chordattr.m_dEndx;
			m_pointEnd.y=chordattr.m_dEndy;
		}
		if(chordattr.m_bFill!=m_bFilled)
		{
			change=TRUE;
			m_bFilled=chordattr.m_bFill;			
		}
		if(m_bFilled&&m_rgbInside!=chordattr.m_ctlFillColor.m_FillColor)
		{
			change=TRUE;
			m_rgbInside=chordattr.m_ctlFillColor.m_FillColor;
		}
		if(change) 
		{
			((CPaintobjView*) pTemp2)->Invalidate();
		}
	}
}

⌨️ 快捷键说明

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