liang-barsky算法是针对标准矩形更快的直线段裁剪算法
基本出发点是直线的参数方程
- 首先给定一个矩形的窗口,我们将矩形的窗口的四条边分成两类:入边和出边
- 我们将需要裁剪的直线段(黑色表示)看成一条有方向的线段,该线段使用参数方程可以表示为:x = x1 + u * ( x2 - x1 ) , y = y1 + u* ( y2 - y1) (0 <= u <= 1) , 所以起始点的 u = 0 ,末点的 u = 1 ,越往左 u -> 负无穷 ,往右趋向于正无穷
- 最终裁剪的线段起点是直线和两条入边的交点以及初始端点这三个点中参数 u 最大的那个点 ,根据上图例子就是给定线段的初始端点
- 最终裁剪的线段终点是直线和两条出边的交点以及初始末点这三个点中参数 u 最小的那个点,根据上图例子就是给定线段与ymax的交点
- 如果我们用 u1, u2 分别表示最终线段可见部分的起点与终点,则
u1 = max ( 0 , ul , ub )
u2 = min ( 1, ut , ur )
- 参数式推导:
设给定的线段的起始点为(x1,y1) 结束点为 (x2,y2)
当 pk == 0:
如果 qk < 0: 则线段完全在给定矩形边界外,应当舍弃该线段
当 pk != 0:
如果qk < 0: 线段从裁剪边界的延长线的外部延申到内部,是入边的交点
如果qk > 0: 线段从裁剪边界延长线的内部延伸到外部 ,是出边交点
线段和窗口边界一共有四个交点,,根据pk的符号就知道那两个是入交点哪两个是出交点(pk<0对应入边交点,pk>0对应出边交点)
可知uk = qk/pk ,则可根据这四个u值和u=0,u=1,一共6个u值就可以找到两个端点
#include <iostream>
#include<glut.h>
#include<Windows.h>
using namespace std;
#define ww 640 //屏幕的宽度
#define wh 480 //屏幕的高度
int xs, ys, xb, yb;
int rl = 200, rb = 200;
int rr = 400, rt = 400;
bool first;
//画线的方法
void lineNew(int x0, int y0, int xEnd, int yEnd)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 0.0f); //画黄色
glLineWidth(3);
glBegin(GL_LINES)