头文件<line.h>
源码<line.cpp>
#pragma once
#include " afx.h "
#include " atltypes.h "
/**/ /*
* Powered by Tauruser
* Tauruser~gmail.com
* Written on 2005.12
* 欢迎转载,请说明出处
*/
class CLine :
public CObject
{
DECLARE_SERIAL (CLine)
public:
CLine(void);
~CLine(void);
private:
CPoint m_ptFrom;
private:
CPoint m_ptTo;
public:
CLine(CPoint ptFrom, CPoint ptTo);
void Draw(CDC* pDC);
void Serialize(CArchive& ar);
CLine* SetLine(CPoint ptFrom, CPoint ptTo);
// 剪裁线段,参数为窗口左上角和右下角坐标,当线段在窗口内返回TRUE,否则
FALSE
bool Cut(CPoint ptUpLeft, CPoint ptDownRight);
} ;
#include " afx.h "
#include " atltypes.h "
/**/ /*
* Powered by Tauruser
* Tauruser~gmail.com
* Written on 2005.12
* 欢迎转载,请说明出处
*/
class CLine :
public CObject
{
DECLARE_SERIAL (CLine)
public:
CLine(void);
~CLine(void);
private:
CPoint m_ptFrom;
private:
CPoint m_ptTo;
public:
CLine(CPoint ptFrom, CPoint ptTo);
void Draw(CDC* pDC);
void Serialize(CArchive& ar);
CLine* SetLine(CPoint ptFrom, CPoint ptTo);
// 剪裁线段,参数为窗口左上角和右下角坐标,当线段在窗口内返回TRUE,否则
FALSE
bool Cut(CPoint ptUpLeft, CPoint ptDownRight);
} ;
源码<line.cpp>
#include
"
StdAfx.h
"
#include " .\line.h "
/**/ /*
* Powered by Tauruser
* Tauruser~gmail.com
* Written on 2005.12
* 欢迎转载,请说明出处
*/
IMPLEMENT_SERIAL (CLine,CObject, 1 )
CLine::CLine( void )
: m_ptFrom( 0 )
, m_ptTo( 0 )
{
}
CLine:: ~ CLine( void )
{
}
CLine::CLine(CPoint ptFrom, CPoint ptTo)
{
m_ptFrom=ptFrom;
m_ptTo=ptTo;
}
void CLine::Draw(CDC * pDC)
{
pDC->MoveTo(m_ptFrom);
pDC->LineTo(m_ptTo);
}
void CLine::Serialize(CArchive & ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar<<m_ptFrom<<m_ptTo;
else
ar>>m_ptFrom>>m_ptTo;
}
CLine * CLine::SetLine(CPoint ptFrom, CPoint ptTo)
{
m_ptFrom=ptFrom;
m_ptTo=ptTo;
return this;
}
// 剪裁线段,参数为窗口左上角和右下角坐标,当线段在窗口内返回TRUE,否则FALSE
bool CLine::Cut(CPoint ptUpLeft, CPoint ptDownRight)
{
//long iA,iB,iC,iD,iXl,iXr,iYt,iYb;
const long iA(m_ptFrom.x), iB(m_ptFrom.y), iC(m_ptTo.x), iD(m_ptTo.y);
long iXl=ptUpLeft.x, iXr=ptDownRight.x, iYt=ptUpLeft.y, iYb=ptDownRight.y;
int temp;
if (iXl>iXr)
{
temp=iXl;
iXl=iXr;
iXr=temp;
}
if(iYb>iYt)
{
temp=iYb;
iYb=iYt;
iYt=temp;
}
if(iXl<=iA && iA<=iXr)
{
if(iYb<=iB && iB<=iYt)
{ ;//m_ptFrom保持原值
}else if(iB<iYb && iD<iYb)
return false;//与窗口无交.
else if (iB<iYb && iD>=iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptFrom.x=x;
m_ptFrom.y=iYb;
}else return false;//否则无交点
}else if(iB>iYt && iD>iYt) return false;//与窗口无交
else if(iB>iYt && iD<=iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptFrom.x=x;
m_ptFrom.y=iYt;
}else return false;//否则无交点
}
}else if(iA<iXl)
{
if(iC<iXl) return false;
else
{
int y;
y=iB-((iA-iXl)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptFrom.x=iXl;
m_ptFrom.y=y;
}else if ((y<iYb || y>iYt) && (iYb<=iB && iB<=iYt))
{
return false;
}
else if(y<iYb || iB<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptFrom.x=x;
m_ptFrom.y=iYb;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptFrom.x=x;
m_ptFrom.y=iYt;
}else return false;//否则无交点
}
}
}else if(iA>iXr)
{
if(iC>iXr) return false;//
else
{
int y;
y=iB-((iA-iXr)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptFrom.x=iXr;
m_ptFrom.y=y;
}else if ((y<iYb || y>iYt) && (iYb<=iB && iB<=iYt))
{
return false;
}
else if(y<iYb || iB<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptFrom.x=x;
m_ptFrom.y=iYb;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptFrom.x=x;
m_ptFrom.y=iYt;
}else return false;//否则无交点
}
}
}
/**///////////////////////////////////////////////////////////////////////////////////
if(iXl<=iC && iC<=iXr)
{
if(iYb<=iD && iD<=iYt)
return true;//m_ptFrom保持原值
else if(iB<iYb && iD<iYb) return false;//与窗口无交.
else if(iD<iYb && iB>=iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptTo.x=x;
m_ptTo.y=iYb;
return true;
}else return false;//否则无交点
}else if(iB>iYt && iD>iYt) return false;
else if(iD>iYt && iB<=iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptTo.x=x;
m_ptTo.y=iYt;
return true;
}else return false;//否则无交点
}
}else if(iC<iXl)
{
if(iA<iXl) return false;
else
{
int y;
y=iB-((iA-iXl)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptTo.x=iXl;
m_ptTo.y=y;
return true;
}else if ((y<iYb || y>iYt) && (iYb<=iD && iD<=iYt))
{
return false;
}
else if(y<iYb || iB<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptTo.x=x;
m_ptTo.y=iYb;
return true;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptTo.x=x;
m_ptTo.y=iYt;
return true;
}else return false;//否则无交点
}
}
}else if(iC>iXr)
{
if(iA>iXr) return false;//
else
{
int y;
y=iB-((iA-iXr)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptTo.x=iXr;
m_ptTo.y=y;
return true;
}else if ((y<iYb || y>iYt) && (iYb<=iD && iD<=iYt))
{
return false;
}
else if(y<iYb || iD<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptTo.x=x;
m_ptTo.y=iYb;
return true;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptTo.x=x;
m_ptTo.y=iYt;
return true;
}else return false;//否则无交点
}
}
}
return true;
}
#include " .\line.h "
/**/ /*
* Powered by Tauruser
* Tauruser~gmail.com
* Written on 2005.12
* 欢迎转载,请说明出处
*/
IMPLEMENT_SERIAL (CLine,CObject, 1 )
CLine::CLine( void )
: m_ptFrom( 0 )
, m_ptTo( 0 )
{
}
CLine:: ~ CLine( void )
{
}
CLine::CLine(CPoint ptFrom, CPoint ptTo)
{
m_ptFrom=ptFrom;
m_ptTo=ptTo;
}
void CLine::Draw(CDC * pDC)
{
pDC->MoveTo(m_ptFrom);
pDC->LineTo(m_ptTo);
}
void CLine::Serialize(CArchive & ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar<<m_ptFrom<<m_ptTo;
else
ar>>m_ptFrom>>m_ptTo;
}
CLine * CLine::SetLine(CPoint ptFrom, CPoint ptTo)
{
m_ptFrom=ptFrom;
m_ptTo=ptTo;
return this;
}
// 剪裁线段,参数为窗口左上角和右下角坐标,当线段在窗口内返回TRUE,否则FALSE
bool CLine::Cut(CPoint ptUpLeft, CPoint ptDownRight)
{
//long iA,iB,iC,iD,iXl,iXr,iYt,iYb;
const long iA(m_ptFrom.x), iB(m_ptFrom.y), iC(m_ptTo.x), iD(m_ptTo.y);
long iXl=ptUpLeft.x, iXr=ptDownRight.x, iYt=ptUpLeft.y, iYb=ptDownRight.y;
int temp;
if (iXl>iXr)
{
temp=iXl;
iXl=iXr;
iXr=temp;
}
if(iYb>iYt)
{
temp=iYb;
iYb=iYt;
iYt=temp;
}
if(iXl<=iA && iA<=iXr)
{
if(iYb<=iB && iB<=iYt)
{ ;//m_ptFrom保持原值
}else if(iB<iYb && iD<iYb)
return false;//与窗口无交.
else if (iB<iYb && iD>=iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptFrom.x=x;
m_ptFrom.y=iYb;
}else return false;//否则无交点
}else if(iB>iYt && iD>iYt) return false;//与窗口无交
else if(iB>iYt && iD<=iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptFrom.x=x;
m_ptFrom.y=iYt;
}else return false;//否则无交点
}
}else if(iA<iXl)
{
if(iC<iXl) return false;
else
{
int y;
y=iB-((iA-iXl)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptFrom.x=iXl;
m_ptFrom.y=y;
}else if ((y<iYb || y>iYt) && (iYb<=iB && iB<=iYt))
{
return false;
}
else if(y<iYb || iB<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptFrom.x=x;
m_ptFrom.y=iYb;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptFrom.x=x;
m_ptFrom.y=iYt;
}else return false;//否则无交点
}
}
}else if(iA>iXr)
{
if(iC>iXr) return false;//
else
{
int y;
y=iB-((iA-iXr)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptFrom.x=iXr;
m_ptFrom.y=y;
}else if ((y<iYb || y>iYt) && (iYb<=iB && iB<=iYt))
{
return false;
}
else if(y<iYb || iB<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptFrom.x=x;
m_ptFrom.y=iYb;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptFrom.x=x;
m_ptFrom.y=iYt;
}else return false;//否则无交点
}
}
}
/**///////////////////////////////////////////////////////////////////////////////////
if(iXl<=iC && iC<=iXr)
{
if(iYb<=iD && iD<=iYt)
return true;//m_ptFrom保持原值
else if(iB<iYb && iD<iYb) return false;//与窗口无交.
else if(iD<iYb && iB>=iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptTo.x=x;
m_ptTo.y=iYb;
return true;
}else return false;//否则无交点
}else if(iB>iYt && iD>iYt) return false;
else if(iD>iYt && iB<=iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptTo.x=x;
m_ptTo.y=iYt;
return true;
}else return false;//否则无交点
}
}else if(iC<iXl)
{
if(iA<iXl) return false;
else
{
int y;
y=iB-((iA-iXl)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptTo.x=iXl;
m_ptTo.y=y;
return true;
}else if ((y<iYb || y>iYt) && (iYb<=iD && iD<=iYt))
{
return false;
}
else if(y<iYb || iB<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptTo.x=x;
m_ptTo.y=iYb;
return true;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptTo.x=x;
m_ptTo.y=iYt;
return true;
}else return false;//否则无交点
}
}
}else if(iC>iXr)
{
if(iA>iXr) return false;//
else
{
int y;
y=iB-((iA-iXr)*(iB-iD)/(iA-iC));
if(iYb<=y && y<=iYt)
{
m_ptTo.x=iXr;
m_ptTo.y=y;
return true;
}else if ((y<iYb || y>iYt) && (iYb<=iD && iD<=iYt))
{
return false;
}
else if(y<iYb || iD<iYb)
{
//1.2
int x;
x=iA-((iB-iYb)*(iA-iC)/(iB-iD));
if(iXl<=x && x<=iXr)//检验x的有校性
{
m_ptTo.x=x;
m_ptTo.y=iYb;
return true;
}else return false;//否则无交点
}
else if(y>iYt || iB>iYt)
{
//1.3
int x;
x=iA-((iB-iYt)*(iA-iC)/(iB-iD));//检验x的有校性
if(iXl<=x && x<=iXr)//
{
m_ptTo.x=x;
m_ptTo.y=iYt;
return true;
}else return false;//否则无交点
}
}
}
return true;
}