请输入您要查询的百科知识:

 

词条 Liang–Barsky algorithm
释义

  1. See also

  2. References

  3. External links

In computer graphics, the Liang–Barsky algorithm (named after You-Dong Liang and Brian A. Barsky) is a line clipping algorithm. The Liang–Barsky algorithm uses the parametric equation of a line and inequalities describing the range of the clipping window to determine the intersections between the line and the clip window. With these intersections it knows which portion of the line should be drawn. This algorithm is significantly more efficient than Cohen–Sutherland. The idea of the Liang–Barsky clipping algorithm is to do as much testing as possible before computing line intersections.

Consider first the usual parametric form of a straight line:

A point is in the clip window, if

and

which can be expressed as the 4 inequalities

where

To compute the final line segment:

  1. A line parallel to a clipping window edge has for that boundary.
  2. If for that , , then the line is completely outside and can be eliminated.
  3. When , the line proceeds outside to inside the clip window, and when , the line proceeds inside to outside.
  4. For nonzero , gives the intersection point.
  5. For each line, calculate and . For , look at boundaries for which (i.e. outside to inside). Take to be the largest among . For , look at boundaries for which (i.e. inside to outside). Take to be the minimum of . If , the line is outside and therefore rejected.

// Liang--Barsky line-clipping algorithm

  1. include
  2. include
  3. include

using namespace std;

// this function gives the maximum

float maxi(float arr[],int n) {

  float m = 0;  for (int i = 0; i < n; ++i)    if (m < arr[i])      m = arr[i];  return m;

}

// this function gives the minimum

float mini(float arr[], int n) {

  float m = 1;  for (int i = 0; i < n; ++i)    if (m > arr[i])      m = arr[i];  return m;

}

void liang_barsky_clipper(float xmin, float ymin, float xmax, float ymax,

                          float x1, float y1, float x2, float y2) {  // defining variables  float p1 = -(x2 - x1);  float p2 = -p1;  float p3 = -(y2 - y1);  float p4 = -p3;
  float q1 = x1 - xmin;  float q2 = xmax - x1;  float q3 = y1 - ymin;  float q4 = ymax - y1;
  float posarr[5], negarr[5];  int posind = 1, negind = 1;  posarr[0] = 1;  negarr[0] = 0;
  if ((p1 == 0 && q1 < 0) || (p3 == 0 && q3 < 0)) {      outtextxy(80, 80, "Line is parallel to clipping window!");      return;  }  if (p1 != 0) {    float r1 = q1 / p1;    float r2 = q2 / p2;    if (p1 < 0) {      negarr[negind++] = r1; // for negative p1, add it to negative array      posarr[posind++] = r2; // and add p2 to positive array    } else {      negarr[negind++] = r2;      posarr[posind++] = r1;    }  }  if (p3 != 0) {    float r3 = q3 / p3;    float r4 = q4 / p4;    if (p3 < 0) {      negarr[negind++] = r3;      posarr[posind++] = r4;    } else {      negarr[negind++] = r4;      posarr[posind++] = r3;    }  }
  float xn1, yn1, xn2, yn2;  float rn1, rn2;  rn1 = maxi(negarr, negind); // maximum of negative array  rn2 = mini(posarr, posind); // minimum of positive array
  if (rn1 > rn2)  { // reject    outtextxy(80, 80, "Line is outside the clipping window!");    return;  }
  xn1 = x1 + p2 * rn1;  yn1 = y1 + p4 * rn1; // computing new points
  xn2 = x1 + p2 * rn2;  yn2 = y1 + p4 * rn2;
  line(x1, 467 - y1, xn1, 467 - yn1);  line(x2, 467 - y2, xn2, 467 - yn2);

}

int main() {

  cout << "\Liang-barsky line clipping";  cout << "\The system window outlay is: (0,0) at bottom left and (631, 467) at top right";  cout << "\Enter the co-ordinates of the window(wxmin, wxmax, wymin, wymax):";  float xmin, xmax, ymin, ymax;  cin >> xmin >> ymin >> xmax >> ymax;  cout << "\Enter the end points of the line (x1, y1) and (x2, y2):";  float x1, y1, x2, y2;  cin >> x1 >> y1 >> x2 >> y2;
  // using the winbgim library for C++, initializing the graphics mode  initgraph(&gd, &gm, "");  liang_barsky_clipper(xmin, ymin, xmax, ymax, x1, y1, x2, y2);  getch();  closegraph();

}

See also

Algorithms used for the same purpose:

  • Cyrus–Beck algorithm
  • Nicholl–Lee–Nicholl algorithm
  • Fast clipping

References

  • Liang, Y. D., and Barsky, B., "A New Concept and Method for Line Clipping", ACM Transactions on Graphics, 3(1):1–22, January 1984.
  • Liang, Y. D., B. A., Barsky, and M. Slater, Some Improvements to a Parametric Line Clipping Algorithm, CSD-92-688, Computer Science Division, University of California, Berkeley, 1992.
  • James D. Foley. [https://books.google.com/books/about/Computer_graphics.html?id=-4ngT05gmAQC Computer graphics: principles and practice]. Addison-Wesley Professional, 1996. p. 117.

External links

  • http://hinjang.com/articles/04.html#eight
  • Skytopia: The Liang-Barsky line clipping algorithm in a nutshell!
{{DEFAULTSORT:Liang-}}

1 : Line clipping algorithms

随便看

 

开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。

 

Copyright © 2023 OENC.NET All Rights Reserved
京ICP备2021023879号 更新时间:2024/9/21 19:32:16