CS算法简单易实现,通过将包括裁剪窗口在内的区域分成九块,通过编码的形式对两个端点进行定位和执行相应的操作。相应的做法分为三种可能:
一,俩都是0000,直接保留
二,求&&后不为0,此时两个端点在裁剪区的同一侧,全部舍弃
三,求&&后为0,此时则根据编码来分别用y=ymin等直线求交后选择求交或保留
但是这个算法的主要问题是,在某些复杂的情况,要进行四次乘法和除法,而且在没有交点的情况下可能需要两次以上的运算来执行上述流程直到全部舍弃。
LB算法相对来说就好很多,对可能有保留的边需要4次除法和2次乘法来确定位置。
故考虑一种基于CS算法的优化,在极端条件下只需要4次乘法和2次除法,取平均可能更快一些。首先,每条直线最多与裁剪区域只有两个交点(或者在边交点上),所以可以归类于两种情况:
一:xmin<=x<=xmax,y>ymax y<ymin 和xy互换的版本,可以在使用cs时判断是否有交点时判断是否为这种特殊情况,只需要两次乘法或者除法即可得到结果。
二:将直线方程记录成ax+by+c=0的格式。首先四次乘法,即代入由直线相交后切掉的角点和该角点的对角点,记录ax ,by。若f=ax+by+c,两个点的乘积大于0,说明直线全部裁切掉。否则根据区域码确定角点,利用ax和by的值使用两次除法获得结果
故综上所述,对于明显&&!=0的不需要乘法,特殊两交点2次乘法或除法,非特殊类无交点4次乘法,有交点4次乘法2次除法