Liang-Barsky直线裁剪算法的实现

Liang-Barsky直线裁剪算法简介

算法概要

Liang-Barsky算法由浙江大学的梁友栋与加州大学伯克利分校的BrianA. Barsky共同提出。该算法采用直线参数方程和不等式,以确定裁剪框与直线间的交点。

算法实现流程

1.       在执行交点计算之前,Liang-Barsky算法会首先对线段进行足够的检测以保证其有必要进行裁剪。对直线上点的位置进行定义;其中(x0, y0)为直线始点,(x1, y1)为直线末点:

x = x0 + u(x1 - x0) = x0 + u*dx;

y = y0 + u(y1 - y0) = y0 + u*dy;

定义裁剪框:

Xmin, Xmax, Ymin, Ymax

点在裁剪框内的条件:

u*Pk <= Qk, k = 1, 2, 3, 4

其中:

p1 = -dX, q1 = x0 - Xmin (left)

p2 = dX, q2 = Xmax - x0 (right)

p3 = -dY, q3 = y0 - Ymin (bottom)

p4 = dY, q4 = Ymax - y0 (top)

2.       交点求解过程:

2.1.    判断某条线段是否平行,既两个点的x或y值是否相等:

·             若相等,则计算该x或y值是否在窗口的对应范围内:

o       若在该窗口范围内,则计算两个交点并返回其值;

o       若不在该裁剪窗口范围内,则继续执行;

·             若不等,直接继续执行;

2.2.    对于的情况,交点坐标所对应的U值应表示为u = qk / pk;

2.3.    当pk < 0时,对于该边缘,此线段由裁剪区外至裁剪区里方向伸展;否则由里至外伸展

2.4.    分别求解裁剪所需的两个交点u1,u2:

·             分别计算(x0, y0)点相对于四条边的u值:

o       若对于某条边,(x0, y0)点之pk < 0,则u1取值为max(0, qk / pk);

o       若对于某条边,(x0, y0)点之pk > 0,则u2取值为min(1, qk / pk);

o       对于以上的k值,

·             若u1 > u2,则说明该线段在裁剪区域之外,停止裁剪;否则由参数方程得出由u1至u2的裁剪后直线。

Liang-Barsky直线裁剪算法实现程序的结构


你可能感兴趣的:(图形图像/多媒体相关,算法)