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