計算機圖形學常用演算法實現9 樑友棟-Barskey裁剪演算法
阿新 • • 發佈:2019-01-01
這個演算法的效率比前面提到的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); }