算法原理
将线段分为以下三种情况处理
(1)若P1P2完全在窗口内,则显示该线段P1P2,–简取
(2)若P1P2完全在窗口外,则丢弃该线段。–简弃
(3)若线段不满足(1)(2)时,则把线段分为两段,其中一段完全在窗口外,再重复上述判断能否取或弃
编码
对于不同区域的点进行如下编码,假设窗口,左侧(XL)右侧(XR)上侧(YT)下侧(YB),
区域编码:对于点P(x,y) code=ABCD(二进制)
x < XL D=1 x > XR C=1
y < YB B=1 y > YT A=1
可获得该点对应得编码
如下图
对于之前得三种情况如下:
P1的编码 : code1 P2的编码 : code2
(1)完全在窗口内,则有 code1 | code2 = 0
(2)完全在窗口外,则有 code1 & code2 != 0
(3)与窗口相交,求交,将窗口外的线段丢弃,再进行裁剪
if((LEFT&code)!=0)
{
x=XL;
y=y1+(y2-y1)*(XL-x1)/(x2-x1);
}
else if((RIGHT&code)!=0)
{
x=XR;
y=y1+(y2-y1)*(XR-x1)/(x2-x1);
}
else if((BOTTOM&code)!=0)
{
y=YB;
x=x1+(x2-x1)*(YB-y1)/(y2-y1);
}
else if((TOP&code)!=0)
{
y=YT;
x=x1+(x2-x1)*(YT-y1)/(y2-y1);
}
源码