|
Posted on 2007-01-28 10:28 Tauruser 阅读(2754) 评论(2) 编辑 收藏 引用 所属分类: 计算机图形学
头文件<line.h> #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);
};
 源码<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;
}

Feedback
# re: 05年写的直线裁剪算法 回复 更多评论
2007-06-30 13:18 by
好,谢谢
# re: 05年写的直线裁剪算法 回复 更多评论
2010-03-01 00:28 by
你这个算法也太复杂了吧
|