计算机科学

首页 > 计算机科学

梁友栋-柏世奇算法

2018-07-27 10:05:33     所属分类:算法

在计算机图形学中,梁友栋—柏世奇算法(以梁友栋和柏世奇英语Brian A. Barsky的名字命名)是一个线段裁剪算法。梁友栋—柏世奇算法使用直线的参数方程和不等式组来描述线段和裁剪窗口的交集。求解出的交集将被用于获知线的哪些部分是应当绘制在屏幕上的。这一算法比Cohen-Sutherland算法要更加高效,梁友栋—柏世奇算法的基本思想是:在计算线段与裁剪窗交集之前做尽可能多的判断。

目录

  • 1 算法描述
  • 2 示例代码
  • 3 参见
  • 4 参考文献
  • 5 外部链接

算法描述

考虑直线的参数方程:

点在裁剪窗内,若

其可用4个不等式表达:

其中

计算最终线段:

  1. 与裁剪窗平行的直线在平行的边界上有
  2. 若对于这样的 ,则线段全部在裁剪窗的外面,可以被消除
  3. 时,线从裁剪窗外向内走;
  4. 对非零的 ,
  5. 对每条线,计算 。对 检查 的边界(即从外向内)。令 检查 的边界(即从内向外)。令

示例代码

// Liang--Barsky line-clipping algorithm
#include<iostream>
#include<graphics.h>
#include<math.h>
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 < arri)
      m = arri;
  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 > arri)
      m = arri;
  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 posarr5, negarr5;
  int posind = 1, negind = 1;
  posarr0 = 1;
  negarr0 = 0;
  rectangle(xmin, 467 - ymin, xmax, 467 - ymax); // drawing the clipping window
  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) {
      negarrnegind++ = r1; // for negative p1, add it to negative array
      posarrposind++ = r2; // and add p2 to positive array
    } else {
      negarrnegind++ = r2;
      posarrposind++ = r1;
    }
  }
  if (p3 != 0) {
    float r3 = q3 / p3;
    float r4 = q4 / p4;
    if (p3 < 0) {
      negarrnegind++ = r3;
      posarrposind++ = r4;
    } else {
      negarrnegind++ = r4;
      posarrposind++ = 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
  xn1 = x1 + p2 * rn1;
  yn1 = y1 + p4 * rn1; // computing new points
  xn2 = x1 + p2 * rn2;
  yn2 = y1 + p4 * rn2;
  setcolor(CYAN);
  line(xn1, 467 - yn1, xn2, 467 - yn2); // the drawing the new line
  setlinestyle(1, 1, 0);
  line(x1, 467 - y1, xn1, 467 - yn1);
  line(x2, 467 - y2, xn2, 467 - yn2);
}
int main() {
  cout << "nLiang-barsky line clipping";
  cout << "nThe system window outlay is: (0,0) at bottom left and (631, 467) at top right";
  cout << "nEnter the co-ordinates of the window(wxmin, wxmax, wymin, wymax):";
  float xmin, xmax, ymin, ymax;
  cin >> xmin >> ymin >> xmax >> ymax;
  cout << "nEnter the end points of the line (x1, y1) and (x2, y2):";
  float x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  int gd = DETECT, gm;
  // 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();
}

参见

其他裁剪算法:

  • Cyrus–Beck算法
  • Nicholl–Lee–Nicholl算法
  • 快速裁剪

参考文献

  • 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. Computer graphics: principles and practice. Addison-Wesley Professional, 1996. p. 117.

外部链接

  • http://hinjang.com/articles/04.html#eight
  • Skytopia: The Liang-Barsky line clipping algorithm in a nutshell!
版权声明:本文由北城百科网创作,转载请联系管理获取授权,未经容许转载必究。https://www.beichengjiu.com/computerscience/338754.html

显示全文

取消

感谢您的支持,我会继续努力的!

扫码支持
支付宝扫一扫赏金或者微信支付5毛钱,阅读全文

打开微信扫一扫,即可进行阅读全文哦


下一篇:模拟退火
相关推荐
爱淘宝