www.pudn.com > 44757463.rar > Line.cpp


// Line.cpp: implementation of the CLine class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "GraphSoft.h" 
#include "Line.h" 
 
#include "math.h" 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
/////////////////////////////////// 
IMPLEMENT_SERIAL( CLine, CShape, 0 ) 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CLine::CLine():CShape() 
{ 
	m_flStartx=0; 
	m_flStarty=0; 
	m_flEndx=0; 
	m_flEndy=0;	 
	//temp(start) 
	m_flStartxTemp=0; 
	m_flStartyTemp=0; 
	m_flEndxTemp=0; 
	m_flEndyTemp=0;	 
	//temp(end) 
} 
///////////////////// 
CLine::CLine(COLORREF color,int penWidth,float angle):CShape(color,penWidth,angle) 
{		 
	m_flStartx=0; 
	m_flStarty=0; 
	m_flEndx=0; 
	m_flEndy=0;	 
	//temp(start) 
	m_flStartxTemp=0; 
	m_flStartyTemp=0; 
	m_flEndxTemp=0; 
	m_flEndyTemp=0;	 
	//temp(end) 
} 
//////////////////// 
CLine::CLine(CLine * const line):CShape(line) 
{ 
   	m_flStartx=line->m_flStartx; 
	m_flStarty=line->m_flStarty; 
	m_flEndx=line->m_flEndx; 
	m_flEndy=line->m_flEndy;	 
	//temp(start) 
	m_flStartxTemp=line->m_flStartxTemp; 
	m_flStartyTemp=line->m_flStartyTemp; 
	m_flEndxTemp=line->m_flEndxTemp; 
	m_flEndyTemp=line->m_flEndyTemp; 
	//temp(end) 
} 
///////////////////// 
CLine::~CLine() 
{ 
} 
//////////////////////////////////////////////////////////// 
//Operations 
///////////////////////////////////////////////////////////// 
void CLine::Serialize( CArchive& ar ) 
{ 
	// serialization of Base class  
	CShape::Serialize( ar ) ;	 
	if ( ar.IsLoading() ){		 
        ar>>m_flStartx; 
		ar>>m_flStarty; 
		ar>>m_flEndx; 
		ar>>m_flEndy;		 
		//temp 
		m_flStartxTemp=m_flStartx; 
		m_flStartyTemp=m_flStarty; 
		m_flEndxTemp=m_flEndx; 
		m_flEndyTemp=m_flEndy; 
	} else { 
		ar<SelectObject(&pen);       
	 
	pDC->MoveTo(m_flStartxTemp,m_flStartyTemp); 
	pDC->LineTo(m_flEndxTemp,m_flEndyTemp); 
	 
	if(GetDrawPointsFlag()==1){		 
		DrawPoints(pDC,color);			 
	} 
	 
	pDC->SelectObject(poldPen); 
	//BresenhamLine(pDC,m_flStartx,m_flStarty,m_flEndx,m_flEndy,color); 
	//Draw_DDALine(m_ptStart,m_ptEnd,pDC,penWidth,color); 
} 
/////////////////////////////////////////// 
void CLine::DrawPointsCutTo(CDC *pDC,COLORREF color,CFlRect m_rectFrom,CRect m_rectTo) 
{ 
	 
//	if(!IsInRect(m_rectFrom)){ 
//		return; 
//	} 
	//得到移动扩缩后的关键数据 
	float 	flStartx,flStarty,flEndx,flEndy; 
	//移动 
	 
	float stepx=m_rectTo.left-m_rectFrom.left; 
	float stepy=m_rectTo.top-m_rectFrom.top; 
	flStartx=m_flStartxTemp+stepx; 
	flStarty=m_flStartyTemp+stepy; 
	flEndx=m_flEndxTemp+stepx; 
	flEndy=m_flEndyTemp+stepy;	 
	//扩缩 
	float cx,cy,flScale; 
	cx=m_rectTo.left; 
	cy=m_rectTo.top;	 
	if(m_rectFrom.Width()<0.01){ 
		m_rectFrom.right=m_rectFrom.left +1; 
	} 
	if(m_rectFrom.Height()<0.01){ 
		m_rectFrom.bottom=m_rectFrom.top +1; 
	} 
	//	flScale=min((float)m_rectTo.Width()/m_rectFrom.Width(),(float)m_rectTo.Height()/m_rectFrom.Height()); 
	//   flScale=((float)m_rectTo.Width()/m_rectFrom.Width()+(float)m_rectTo.Height()/m_rectFrom.Height())/2; 
    flScale=(float)m_rectTo.Width()/m_rectFrom.Width(); 
	flStartx=(flStartx-cx)*flScale+cx; 
	flStarty=(flStarty-cy)*flScale+cy; 
	flEndx=(flEndx-cx)*flScale+cx; 
	flEndy=(flEndy-cy)*flScale+cy;		 
 
	CPen pen,*poldPen;		 
    pen.CreatePen(PS_SOLID,1, color);	 
	poldPen=pDC->SelectObject(&pen); 
	{		 
		pDC->MoveTo(flStartx,flStarty-1-GetPenWidth()); 
		pDC->LineTo(flStartx,flStarty+2+GetPenWidth()); 
		pDC->MoveTo(flStartx-1-GetPenWidth(),flStarty); 
		pDC->LineTo(flStartx+2+GetPenWidth(),flStarty);		 
		 
		pDC->MoveTo(flEndx,flEndy-1-GetPenWidth()); 
		pDC->LineTo(flEndx,flEndy+2+GetPenWidth()); 
		pDC->MoveTo(flEndx-1-GetPenWidth(),flEndy); 
		pDC->LineTo(flEndx+2+GetPenWidth(),flEndy); 
	}	  
	 
	pDC->SelectObject(poldPen);       
	return; 
} 
void CLine::DrawPoints(CDC *pDC,COLORREF color) 
{	 
	CPen pen,*poldPen;		 
    pen.CreatePen(PS_SOLID,1, color);	 
	poldPen=pDC->SelectObject(&pen); 
	{		 
		pDC->MoveTo(m_flStartxTemp,m_flStartyTemp-1-GetPenWidth()); 
		pDC->LineTo(m_flStartxTemp,m_flStartyTemp+2+GetPenWidth()); 
		pDC->MoveTo(m_flStartxTemp-1-GetPenWidth(),m_flStartyTemp); 
		pDC->LineTo(m_flStartxTemp+2+GetPenWidth(),m_flStartyTemp);		 
		 
		pDC->MoveTo(m_flEndxTemp,m_flEndyTemp-1-GetPenWidth()); 
		pDC->LineTo(m_flEndxTemp,m_flEndyTemp+2+GetPenWidth()); 
		pDC->MoveTo(m_flEndxTemp-1-GetPenWidth(),m_flEndyTemp); 
		pDC->LineTo(m_flEndxTemp+2+GetPenWidth(),m_flEndyTemp); 
	}	  
	 
	pDC->SelectObject(poldPen);       
	return; 
} 
//////////////////////////////////////////////// 
///////////////////////////////////////////// 
//function------IsPointinRegion 
//return value 
//0----------out 
//1----------in 
///////////////////////////////////////////// 
int CLine::IsPointinRegion(POINT point) 
{	 
	//out 
	if(point.x>m_flStartxTemp+1&&point.x>m_flEndxTemp+1) 
		return 0; 
	if(point.y>m_flStartyTemp+1&&point.y>m_flEndyTemp+1) 
		return 0; 
	if(point.x& flArrayX,CArray& flArrayY,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle) 
{ 
	if(flArrayX.GetSize()!=2) 
		return; 
	CShape::CreatGraph(flArrayX,flArrayY,nPenWidth,color,fillColor,nStyle); 
	 
	m_flStartxTemp=m_flStartx=flArrayX.GetAt(0); 
	m_flStartyTemp=m_flStarty=flArrayY.GetAt(0); 
	m_flEndxTemp=m_flEndx=flArrayX.GetAt(1); 
	m_flEndyTemp=m_flEndy=flArrayY.GetAt(1); 
	 
} 
///////////////////////////////////////////// 
void CLine::CreatGraph(CArray& ptArray,int nPenWidth,COLORREF color,COLORREF fillColor,SHAPE_FILLSTYLE nStyle) 
{ 
	if(ptArray.GetSize()!=2) 
		return; 
	CShape::CreatGraph(ptArray,nPenWidth,color,fillColor,nStyle); 
	 
	m_flStartxTemp=m_flStartx=((CPoint)ptArray.GetAt(0)).x; 
	m_flStartyTemp=m_flStarty=((CPoint)ptArray.GetAt(0)).y; 
	m_flEndxTemp=m_flEndx=((CPoint)ptArray.GetAt(1)).x; 
	m_flEndyTemp=m_flEndy=((CPoint)ptArray.GetAt(1)).y; 
 
} 
void CLine::SetPtData(CArray& flArrayX,CArray& flArrayY) 
{ 
	m_flStartxTemp=m_flStartx=flArrayX.GetAt(0); 
	m_flStartyTemp=m_flStarty=flArrayY.GetAt(0); 
	m_flEndxTemp=m_flEndx=flArrayX.GetAt(1); 
	m_flEndyTemp=m_flEndy=flArrayY.GetAt(1); 
} 
void CLine::GetPtData(CArray& flArrayX,CArray& flArrayY) 
{ 
	flArrayX.RemoveAll(); 
	flArrayY.RemoveAll(); 
	 
	flArrayX.Add(m_flStartxTemp); 
	flArrayX.Add(m_flEndxTemp); 
	 
	flArrayY.Add(m_flStartyTemp); 
	flArrayY.Add(m_flEndyTemp); 
} 
///////////////////////////////////////////// 
void CLine::DrawCutToRect(CDC *pDC,COLORREF color,COLORREF fillColor,int penWidth,CFlRect m_rectFrom,CRect m_rectTo) 
{ 
//	if(!IsInRect(m_rectFrom)){ 
//		return; 
//	} 
	//得到移动扩缩后的关键数据 
	float 	flStartx,flStarty,flEndx,flEndy; 
	//移动 
	 
	float stepx=m_rectTo.left-m_rectFrom.left; 
	float stepy=m_rectTo.top-m_rectFrom.top; 
	flStartx=m_flStartxTemp+stepx; 
	flStarty=m_flStartyTemp+stepy; 
	flEndx=m_flEndxTemp+stepx; 
	flEndy=m_flEndyTemp+stepy;	 
	//扩缩 
	float cx,cy,flScale; 
	cx=m_rectTo.left; 
	cy=m_rectTo.top;	 
	if(m_rectFrom.Width()<0.01){ 
		m_rectFrom.right=m_rectFrom.left +1; 
	} 
	if(m_rectFrom.Height()<0.01){ 
		m_rectFrom.bottom=m_rectFrom.top +1; 
	} 
//	flScale=min((float)m_rectTo.Width()/m_rectFrom.Width(),(float)m_rectTo.Height()/m_rectFrom.Height()); 
 //   flScale=((float)m_rectTo.Width()/m_rectFrom.Width()+(float)m_rectTo.Height()/m_rectFrom.Height())/2; 
    flScale=(float)m_rectTo.Width()/m_rectFrom.Width(); 
	flStartx=(flStartx-cx)*flScale+cx; 
	flStarty=(flStarty-cy)*flScale+cy; 
	flEndx=(flEndx-cx)*flScale+cx; 
	flEndy=(flEndy-cy)*flScale+cy;		 
	 
	CPen pen,*poldPen;	  
	pen.CreatePen(PS_SOLID,penWidth, color);	 
	poldPen=pDC->SelectObject(&pen);  
	 
	pDC->MoveTo(flStartx,flStarty); 
	pDC->LineTo(flEndx,flEndy); 
 
	if(GetDrawPointsFlag()==1){		 
		DrawPointsCutTo(pDC,color,m_rectFrom,m_rectTo);			 
	} 
	 
	pDC->SelectObject(poldPen); 
} 
///////////////////////////////////////////// 
 
void CLine::Move(CDC *pDC,float stepx,float stepy) 
{ 
	RefreshData(m_bModified); 
//	CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255)); 
	m_flStartx+=stepx; 
	m_flStarty+=stepy; 
	m_flEndx+=stepx; 
	m_flEndy+=stepy;	 
	m_flStartxTemp+=stepx; 
	m_flStartyTemp+=stepy; 
	m_flEndxTemp+=stepx; 
	m_flEndyTemp+=stepy; 
	//Draw(pDC); 
} 
void CLine::PartMove(CDC *pDC,float PrevX,float PrevY,float CurX,float CurY) 
{ 
	RefreshData(m_bModified);	 
    if(m_nSelectPtNum>-1){ 
//		CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255)); 
		if(m_nSelectPtNum==0){ 
			m_flStartx=CurX; 
			m_flStarty=CurY; 
			m_flStartxTemp=CurX; 
			m_flStartyTemp=CurY; 
		}else if(m_nSelectPtNum==1){ 
			m_flEndx=CurX; 
			m_flEndy=CurY; 
			m_flEndxTemp=CurX; 
			m_flEndyTemp=CurY; 
		} 
		//CShape::Draw(pDC); 
    }else if(m_nSelectLineNum>-1){ 
//		CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255)); 
		float stepx,stepy; 
		stepx=CurX-PrevX; 
		stepy=CurY-PrevY; 
 
		m_flStartx+=stepx; 
		m_flStarty+=stepy; 
		m_flEndx+=stepx; 
		m_flEndy+=stepy;	 
		m_flStartxTemp+=stepx; 
		m_flStartyTemp+=stepy; 
		m_flEndxTemp+=stepx; 
		m_flEndyTemp+=stepy; 
		//CShape::Draw(pDC); 
    }	 
} 
///////////////////////////////////////////// 
//function Rotate(...) 
//Rotate flAngle degrees around the ptCenter given as a param 
//////////////////////////////////////////// 
void CLine::Rotate(CDC *pDC,float CX,float CY,float flAngle) 
{	 
	 
	//if(abs(flAngle-m_flAngleTemp)>0.05) 
	{		 
		if(m_flScaleTemp!=1){ 
			RefreshData(TRUE); 
		} 
 
	//	CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255));	 
		 
		m_ptRotateCenterTemp=CPoint(CX,CY); 
		m_flAngleTemp=flAngle; 
		m_bModified=TRUE;		 
 
		m_flStartxTemp=((m_flStartx-CX)*cos(flAngle)-(m_flStarty-CY)*sin(flAngle))+CX; 
		m_flStartyTemp=((m_flStarty-CY)*cos(flAngle)+(m_flStartx-CX)*sin(flAngle))+CY; 
		m_flEndxTemp=((m_flEndx-CX)*cos(flAngle)-(m_flEndy-CY)*sin(flAngle))+CX; 
		m_flEndyTemp=((m_flEndy-CY)*cos(flAngle)+(m_flEndx-CX)*sin(flAngle))+CY;	 
 
	//	CShape::Draw(pDC); 
	} 
	 
} 
///////////////////////////////////////////// 
//function Magnify(...) 
//Magnify flScale times relative to the ptCenter given as a param 
//////////////////////////////////////////// 
void CLine::Magnify(CDC *pDC,float CX,float CY,float flScale) 
{ 
	if(m_flAngleTemp!=0){ 
		RefreshData(TRUE); 
	} 
//	CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255)); 
	 
    m_ptMagnifyCenterTemp=CPoint(CX,CY); 
	m_flScaleTemp=flScale; 
	m_bModified=TRUE;	 
	 
	m_flStartxTemp=(m_flStartx-CX)*flScale+CX; 
    m_flStartyTemp=(m_flStarty-CY)*flScale+CY; 
	m_flEndxTemp=(m_flEndx-CX)*flScale+CX; 
    m_flEndyTemp=(m_flEndy-CY)*flScale+CY; 
	 
//	CShape::Draw(pDC);	 
} 
void CLine::TopToBottom(CDC* pDC,CRect rect) 
{ 
	RefreshData(m_bModified); 
//	CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255)); 
 
	m_flStarty=rect.top/1000.0+rect.bottom/1000.0-m_flStarty;		 
	m_flEndy=rect.top/1000.0+rect.bottom/1000.0-m_flEndy;	 
 
	m_flStartyTemp=rect.top/1000.0+rect.bottom/1000.0-m_flStartyTemp;		 
	m_flEndyTemp=rect.top/1000.0+rect.bottom/1000.0-m_flEndyTemp;	 
	 
//	CShape::Draw(pDC); 
} 
 
void CLine::LeftToRight(CDC* pDC,CRect rect) 
{ 
	RefreshData(m_bModified); 
//	CShape::Draw(pDC,RGB(255,255,255),RGB(255,255,255)); 
 
	m_flStartx=rect.left/1000.0+rect.right/1000.0-m_flStartx;		 
	m_flEndx=rect.left/1000.0+rect.right/1000.0-m_flEndx;	 
	 
	m_flStartxTemp=rect.left/1000.0+rect.right/1000.0-m_flStartxTemp;		 
	m_flEndxTemp=rect.left/1000.0+rect.right/1000.0-m_flEndxTemp;	 
 
//	CShape::Draw(pDC); 
} 	 
/// 
///////////////////////////////////////////// 
//function------IsInRect 
//return value 
//0----------out 
//1----------cut 
//2----------in 
///////////////////////////////////////////// 
CRect CLine::GetBoundaryRect() 
{ 
    CRect rect; 
	rect.left=1000*(m_flStartxTemp<=m_flEndxTemp?m_flStartxTemp:m_flEndxTemp); 
	rect.right=1000*(m_flStartxTemp<=m_flEndxTemp?m_flEndxTemp:m_flStartxTemp); 
	rect.top=1000*(m_flStartyTemp<=m_flEndyTemp?m_flStartyTemp:m_flEndyTemp); 
	rect.bottom=1000*(m_flStartyTemp<=m_flEndyTemp?m_flEndyTemp:m_flStartyTemp);	 
	return rect; 
} 
//////////////////////////////////////////////// 
////function  RefreshData(...) 
////刷新m_flStartx,m_flStarty,m_flEndx,m_flEndy 
//////////////////////////////////////////////// 
void CLine::RefreshData(bool bRefresh) 
{ 
	if(bRefresh){		 
		m_flStartx=m_flStartxTemp; 
		m_flStarty=m_flStartyTemp; 
		m_flEndx=m_flEndxTemp; 
        m_flEndy=m_flEndyTemp; 
	    m_bModified=FALSE; 
        m_ptMagnifyCenterTemp=CPoint(0,0); 
		m_flScaleTemp=1; 
		m_ptRotateCenterTemp=CPoint(0,0); 
		m_flAngleTemp=0; 
	} 
} 
////////////////////////////////////////////// 
CPoint CLine::GetCenterPoint() 
{ 
	CPoint ptRelVal;	 
	ptRelVal.x = (m_flStartx+m_flEndx)/2; 
	ptRelVal.y = (m_flStarty+m_flEndy)/2; 
	return ptRelVal; 
} 
////// 
int CLine::GetPtState(float flx,float fly,float flRate) 
{ 
	//on the out point 
	if(IsPtInRect(m_flStartxTemp-3*flRate,m_flStartyTemp-3*flRate,m_flStartxTemp+3*flRate,m_flStartyTemp+3*flRate,flx,fly)){ 
		m_nSelectPtNum=0; 
		m_nSelectLineNum=-1; 
		return 1; 
	} 
    if(IsPtInRect(m_flEndxTemp-3*flRate,m_flEndyTemp-3*flRate,m_flEndxTemp+3*flRate,m_flEndyTemp+3*flRate,flx,fly)){ 
		m_nSelectPtNum=1; 
		m_nSelectLineNum=-1; 
		return 1; 
	}	 
    //on the outline	 
	if(GetPtStateToBigLine(m_flStartxTemp,m_flStartyTemp,m_flEndxTemp,m_flEndyTemp,5*flRate,flx,fly)){ 
		m_nSelectPtNum=-1; 
		m_nSelectLineNum=0; 
		return 2; 
	} 
	 
    m_nSelectPtNum=-1; 
	m_nSelectLineNum=-1;	 
	return 0; 
} 
float CLine::GetSelectLineRate() 
{ 
	if(m_nSelectLineNum==-1) 
		return 0; 
	return -GetLineRate(m_flStartxTemp,m_flStartyTemp,m_flEndxTemp,m_flEndyTemp); 
} 
 
////////////////////////////////////////////////////////////////////// 
// MODULE   :ExPort 
// ABSTRACT :Export to a txt file 
// FUNCTION :File->Export... 
// NOTE     : 
// RETURN   : 
// ARGUMENTS: 
//              I/O           TYPE      NAME       EXPLANATION 
//               O            FILE*    outStream    Out put File 
// CREATE   :  FNST)handwolf  2004-4-14 
// UPDATE   :   
//          :  
////////////////////////////////////////////////////////////////////// 
 
void CLine::ExPort(FILE* outStream)//增加导出txt功能时用 
{	 
	fprintf(outStream, " CLine \n"); 
	CShape::ExPort(outStream); 
	fprintf(outStream, " %f %f %f %f \n",m_flStartxTemp,m_flStartyTemp, m_flEndxTemp, m_flEndyTemp);	 
} 
 
////////////////////////////////////////////////////////////////////// 
// MODULE   :ImPort 
// ABSTRACT :ImPort from a txt file 
// FUNCTION :File->ImPort... 
// NOTE     : 
// RETURN   : 
// ARGUMENTS: 
//              I/O           TYPE      NAME       EXPLANATION 
//               I            FILE*    inStream    in put File 
// CREATE   :  FNST)handwolf  2004-4-14 
// UPDATE   :   
//          :  
////////////////////////////////////////////////////////////////////// 
void CLine::ImPort(FILE* inStream) 
{ 
	CShape::ImPort(inStream); 
	fscanf(inStream, "%f %f %f %f",&m_flStartx, &m_flStarty, &m_flEndx, &m_flEndy); 
	m_flStartxTemp=m_flStartx; 
	m_flStartyTemp=m_flStarty; 
	m_flEndxTemp=m_flEndx; 
	m_flEndyTemp=m_flEndy; 
} 
CString CLine::GetNameString() 
{ 
	CString str; 
	str.LoadString(IDS_LINE); 
	return str; 
} 
////////////////////////////////////////////////////////////////////// 
//End of File//////////////// 
 
	//////////////////////////////////////////////////// 
	//end of file