这节简单介绍了梁友栋-Barsky裁剪算法的原理,只有结论并没有过程,看过http://blog.csdn.net/daisy__ben/article/details/51941608这篇文章后,大概有了新的认识。

"

假设点P1P2W1W2的横坐标分别是x1,x2,w1,w2,线段P1P2与蓝色裁剪窗口W1W2(蓝色的线之间)的存在公共部分(可见部分)的充要条件是:

max(min(x1,x2), min(w1,w2))≤ min(max(x1,x2), max(w1,w2))
即所谓左端点中大者<=右端点中的小者
"
 
  线段上的点满足y=x1+u(x2-x1) = x1 + u*△x。 其中0<=u<=1。
  u1决定了线段在裁剪区域内的左侧点,u2决定了在裁剪区域内右侧的点。左点yl = x1 + u1 * △x,右点yr = x1 + u2 * △x,且必须满足0 <= u1 <= u2 <= 1.
  这时,求解u1和u2是梁友栋-Barsky线段裁剪算法的目的,
 
 
 
 
 
 
 
(8.18)(8.19)
 
 
  对于书中的公式(8.18),求等式,即为线段与4个边界的交点u值。
 
"

r不等于0的时候,对于上面四个不等式,当rk < 0时 ,u >= qk/rk,当rk>0时 u <= qk/rk,则点P才能位于裁剪窗口之内。同理,假如P已经落在了裁剪窗口之内,u一定大于等于所有rk<0对应的uk的最大值,而小于等于所有rk>0时对应的uk最小值。

"

  代码中因此就有了函数GLint clipTest(GLfloat p, GLfloat q, GLfloat * u1, GLfloat * u2)。当p<0时,要获得对应的u,如果这个u>u2,则舍弃;如果u<u2并且u>u1,则u1=u。若p>0时,如果这个u<u1则舍弃;如果u<u2,则u2=u。 传入的p,q分别由公式(8.19)确定。由此计算最多4次来获得u1和u2.
 
 #include <GLUT/GLUT.h>
#include <iostream>
#include "lineliangbarsk.h"
#include "linebres.h" GLint clipTest (GLfloat p, GLfloat q, GLfloat * u1, GLfloat * u2)
{
GLfloat r;
GLint returnValue = true; if(p < 0.0)
{
r = q / p;
if(r > *u2)
{
returnValue = false;
}
else
{
if(r > *u1)
{
*u1 = r;
}
}
}
else
{
if(p > 0.0)
{
r = q / p;
if(r < *u1)
{
returnValue = false;
}
else
{
if(r < *u2)
{
*u2 = r;
}
}
}
else
{
if(q < 0.0)
{
returnValue = false;
}
}
}
return returnValue;
} void lineClipLiangBarsk(wcPt2D winMin, wcPt2D winMax, wcPt2D p1, wcPt2D p2)
{
GLfloat u1 = 0.0, u2 = 1.0, dx = p2.getx() - p1.getx(), dy; if(clipTest(-dx, p1.getx() - winMin.getx(), &u1, &u2))
{
if(clipTest(dx, winMax.getx() - p1.getx(), &u1, &u2))
{
dy = p2.gety() - p1.gety();
if(clipTest(-dy, p1.gety() - winMin.gety(), &u1, &u2))
{
if(clipTest(dy, winMax.gety() - p1.gety(), &u1, &u2))
{
if(u2 < 1.0)
{
p2.setCoords(p1.getx() + u2 * dx, p1.gety() + u2 * dy);
}
if(u1 > 0.0)
{
p1.setCoords(p1.getx() + u1 * dx, p1.gety() + u1 * dy);
}
lineBres(round(p1.getx()), round(p1.gety()), round(p2.getx()), round(p2.gety()));
std::cout << "liangbarsk : " << u1 << "," << u2 << std::endl;
std::cout << "liangbarsk : " << p1.getx() << "," << p1.gety() << "," << p2.getx() << "," << p2.gety() << std::endl;
}
}
}
}
}

https://github.com/p0e0o0p0l0e0/Computer_Graphics.git

c05938b3e669c1a04f86a54a69b5e2bb3066bd4e

参考:http://blog.csdn.net/daisy__ben/article/details/51941608

 

[图形学] Chp8.7.2 梁友栋-Barsky线段裁剪算法的更多相关文章

  1. 计算机图形学——梁友栋-Barsky算法

    梁算法是计算机图形学上最经典的几个算法,也是目前唯一一个以中国人命名的出现在国内外计算机图形学课本的算法,我之前在介绍裁剪算法的时候介绍过这个算法 https://www.cnblogs.com/wk ...

  2. [图形学] 习题8.12 NLN二维线段裁剪算法实现

    Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...

  3. [图形学] Chp8 使用双缓存创建帧动画

    第八章的习题有动画的要求,之前并没有讲解动画如何制作,网上搜到一篇文章SCARA——OpenGL入门学习五六(三维变换.动画),按照里面的方法,使用双缓存和空闲回调函数实现了一个简单的帧动画. #in ...

  4. [图形学] Chp8.4 OpenGL 二维观察函数——视口

    这节有几个显示窗口的控制函数,可以调整视口,创建子窗口,最小化为图标,设置图标名称,隐藏显示等. gluOrtho2D (xwmin, xwmax, ywmin, ywmax); // 定义二维裁剪窗 ...

  5. 理解Liang-Barsky裁剪算法的算法原理

    0.补充知识向量点积:结果等于0, 两向量垂直; 结果大于0, 两向量夹角小于90度; 结果小于0, 两向量夹角大于90度.直线的参数方程:(x1, y1)和(x2, y2)两点确定的直线, 其参数方 ...

  6. 模拟试题C

    模拟试题C 一.单项选择题(2′*14 =28′) 1.双线性法向插值法(Phong Shading)的优点是( ) A)法向计算精确 B)高光域准确 C)对光源和视点没有限制 D)速度较快 2.用编 ...

  7. Liang-Barsky直线段裁剪算法

    Liang-Barsky直线段裁剪算法 梁友栋与Barsky提出的裁剪算法以直线的参数方程为基础,把判断直线段与窗口边界求交的 二维裁剪问题转化为求解一组不等式,确定直线段参数的一维裁剪问题.设起点为 ...

  8. Liang-Barsky算法

    Liang-Barsky算法 在Cohen-Sutherland算法提出后,梁友栋和Barsky又针对标准矩形窗口提出了更快的Liang-Barsky直线段裁剪算法. 梁算法的主要思想: (1)用参数 ...

  9. 图形学3D渲染管线学习

    图形学3D渲染管线 DX和OpenGL左右手坐标系不同,会有一些差距,得出的矩阵会不一样; OpenGL的投影平面不是视景体的近截面: 顶点(vertexs) 顶点坐标,颜色,法线,纹理坐标(UV), ...

随机推荐

  1. Ultimus BPM 零售和快消品行业应用解决方案

    Ultimus BPM 零售和快消品行业应用解决方案 行业应用需求 中国零售及快消品行业正在经历深刻变化.经济下滑,消费回落,行业危机继续发酵:人员工资.房租费用进一步上涨,成本高涨成为不能承受之重: ...

  2. mysql变量使用总结(转)

    set语句的学习: 使用select定义用户变量的实践将如下语句改成select的形式: set @VAR=(select sum(amount) from penalties);我的修改: sele ...

  3. java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  4. Unity应用架构设计(10)————绕不开的协程和多线程(Part 1)

    在进入本章主题之前,我们必须要了解客户端应用程序都是单线程模型,即只有一个主线程(Main Thread),或者叫做UI线程,即所有的UI控件的创建和操作都是在主线程上完成的.而服务器端应用程序,也就 ...

  5. Django学习报错记录

    1. 运行manage.py任务  makemigrations时,报错: doesn't declare an explicit app_label and isn't in an applicat ...

  6. 在Eclipse IDE使用Gradle构建应用程序

    文 by / 林本托 Tips 做一个终身学习的人. 1. 下载和配置Gradle Gradle Inc.是Gradle框架开发的公司,为Eclipse IDE提供了Gradle工具的支持. 此工具可 ...

  7. sql备份(.bak文件备份)

    第一步: 右键需要备份的数据库(这里以 MyDB 为例)-->任务-->备份

  8. 微信小程序开发 -- 02

    微信小程序开发 --02 微信小程序在开发中,难度系数不是很大,其中应用的技术也是web开发中常用的技术,虽然在微信开发者工具中的叫法与常见的web开发的叫法不太一样. 首先,在微信小程序开发中,代码 ...

  9. angular2/angular4 如何通过$http的post方法请求下载二进制的Excel文件

    时间有限,废话就不多说了,直接上干货! 下面给大家介绍一下我遇到的一个坑,如果你也遇到了,那恭喜你,你一定能找到答案:angular2/angular4 如何通过$http的post方法请求下载二进制 ...

  10. java基础之集合篇

    (一) 集合类位于JDK中java.util包中. 常用的集合类型分布在java.util.Collection和java.util.Map接口中. java.util.Collection=> ...