1. 程式人生 > >計算機圖形學常用演算法實現9 樑友棟-Barskey裁剪演算法

計算機圖形學常用演算法實現9 樑友棟-Barskey裁剪演算法

這個演算法的效率比前面提到的Cohen-Sutherland要高
思路是把直線表示為引數方程形式,
x= x1+udx
y = y1+udy
由xmin<x<xmax
ymin<y<ymax
可以得到四個不等式,簡化成同一個形式up<q 當p不等於0的時候,可以算出來u與邊界的交點,p等於0的時候,左邊等於0,只需簡單的判斷q的正負。
然後求直線和邊界以及邊界延長線的四個交點,u1取由外往內的兩個交點的u值以及0的最大值
u2取由內往外的兩個交點和1的最小值,得到的u1和u2就是直線兩端點的座標。
更新u的函式如下:

float u1 = 0;
float u2 = 1;
bool ClipT(int p, int q)
{
    float r;
    if (p < 0)
    {
        r = (float)q / p;
        if (r > u2)
            return false;
        if (r > u1)
            u1 = r;
    }
    else if (p > 0)
    {
        r = (float)q / p;
        if (r < u1)
            return false;
        if (r < u2)
            u2 = r;
    }
    else
        return q >= 0;
    return true;
}

畫圖函式如下:
程式碼中區域範圍為(200,200)到(400,400)

void LB_lineClip(Point p1, Point p2)
 {
     Graphics g = this.CreateGraphics();
     Pen p = new Pen(Brushes.Black);
     int dx = p2.X - p1.X, dy = p2.Y - p1.Y;
     if(ClipT(-dx,p1.X-200))
         if(ClipT(dx,400-p1.X))
             if(ClipT(-dy,p1.Y-200))
                 if(ClipT(dy,400-p1.Y))
                     g.DrawLine(p, p1.X+u1*dx,p1.Y+u1*dy,p1.X+u2*dx,p1.Y+u2*dy);
 }

在這裡插入圖片描述