比较经典的裁剪算法了,现在也有很多的改进的算法。具体其他的请参见知网。我把实现的过程归纳了下。
称:Xleft和Ybottom为入边,Xright和Ytop为出边
直线参数方程:
x=x1+μ(x2-x1)
y=y1+μ(y2-y1)(0<=μ<=1,P1处为0,p2出为1)
将直线p1p2延长,并视这条直线具有方向,方向为左下到右上。与入边和出边各有两个交点
第一步:根据直线的参数方程,只要点在屏幕中央,则满足以下等式
Xleft<=x1+μ△X<=Xright
Ybottom<=y1+μ△y<= Ytop
令:P1=-△X q1=x1-xleft
P2=△X q2=xright-x1
P3=-△y q3=y1-ybottom
P4=△y q4=ytop-y1
推导出:μPk≤qk(k=1,2,3,4)
带入P1,P2点求出P1,P2,P3,P4和q1,q2,q3,q4
第二步:判断△X
1) △X=0,即P1=P2=0
a) 如果q1<0&&q2<0,则舍去,不在窗口内部
b) 如果q1>=0,q2>=0,则计算μmax和μmin,判断if μmax<=μmin,代入参数方程,计算裁剪后的两个点
2) △y=0,则P3=P4=0
a) 如果q3<0&&q4<0,则不在窗口内
b) q3>=0,q4>=0,则计算μmax和μmin(μk=qk/Pk,pk!=0)
μmax=Max(0,μk|p<0)
μmin=Min(μk|pk>0,1)
if μmax<=μmin,则代入参数方程,计算裁剪后端点的值,得出裁剪后的线段
3) △X和△y都不为0的时候,Pk不为0,则计算μmax和μmin
μmax=入边两个交点的μ和0比较,取最大的值
μmin=出边的两个交点与1比较,取最小的值
if μmax<=μmin,则代入参数方程,计算裁剪后端点的值,得出裁剪后的线段的两个端点值