C语言实现梁友栋-Barsky算法

2023-12-05 07:28

本文主要是介绍C语言实现梁友栋-Barsky算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

(引用梁友栋-Barsky裁剪算法_梁友栋 barsky算法-CSDN博客)

Cyrus和Beck用参数化方法提出了比Cohen-Sutherland更有效的算法。后来梁友栋和Barsky独立地提出了更快的参数化线段裁剪算法,也称为Liany-Barsky(LB)算法。

     一、梁友栋-Barsky裁剪算法思想:

  我们知道,一条两端点为P1(x1,y1)、P2(x2,y2)的线段可以用参数方程形式表示:

x= x1+ u·(x2-x1)= x1+ u·Δx
y= y1+ u·(y2-y1)= y1+ u·Δy
0≤u≤1(3-9)

  式中,Δx=x2-x1,Δy=y2-y1,参数u在0~1之间取值,P(x,y)代表了该线段上的一个点,其值由参数u确定,由公式可知,当u=0时,该点为P1(x1,y1),当u=1时,该点为P2(x2,y2)。如果点P(x,y)位于由坐标(xwmin,ywmin)和(xwmax,ywmax)所确定的窗口内,那么下式成立:

xwmin≤x1+ u·Δx≤xwmax
ywmin≤y1+ u·Δy≤ywmax
(3-10)

  这四个不等式可以表示为:

u·pk ≤qk , k=1,2,3,4(3-11)

  其中,p、q定义为:

p1=-Δx, q1=x1-xwmin
p2=Δx, q2=xwmax-x1
p3=-Δy, q3=y1-ywmin
p4=Δy, q4=ywmax-y1
(3-12)

  从(3-12)式可以知道:任何平行于窗口某边界的直线,其pk=0(但并不是所有的Pk均为0,是存在pk=0的意思。平行于窗口某边界的图片,会出现 (p1&&p2)||(p3&&p4)=0的情况),k值对应于相应的边界(k=1,2,3,4对应于左、右、下、上边界)。如果还满足qk<0(默认x1为最左点?默认斜率大于0小于1?),则线段完全在边界外,应舍弃该线段。如果pk=0并且qk≥0,则线段平行于窗口某边界并在窗口内,见图中所示。公式(3-12)式还告诉我们:

  1、当pk<0时,线段从裁剪边界延长线的外部延伸到内部;

  2、当pk>0时,线段从裁剪边界延长线的内部延伸到外部;

  例如,当Δx≥0时,对于左边界p1<0(p1=-Δx),线段从左边界的外部到内部;

           对于右边界p2>0(p2=Δx),线段从右边界的内部到外部。

     当Δy<0时,对于下边界p3>0(p3=-Δy),线段从下边界的内部到外部;

          对于上边界p4<0(p4=Δy),线段从上边界的外部到内部。

     当pK≠0时,可以计算出参数u的值,它对应于无限延伸的直线与延伸的窗口边界k的交点,即:

 

  对于每条直线,可以计算出参数u1和u2,该值定义了位于窗口内的线段部分:

  1、u1的值由线段从外到内遇到的矩形边界所决定(pk<0),对这些边界计算rk=qk/pk,u1取0和各个r值之中的最大值。

  2、u2的值由线段从内到外遇到的矩形边界所决定(pk>0),对这些边界计算rk=qk/pk,u2取0和各个r值之中的最小值。

  3、如果u1>u2,则线段完全落在裁剪窗口之外,应当被舍弃;否则,被裁剪线段的端点可以由u1和u2计算出来。

代码实现:

#include<stdio.h>
double xl, xr, yt, yb;//事先给出的已知窗体位置
int cansee(double q, double d, double t0, double t1) //判断直线是否可见
{double r;if (q < 0)//计算初始边的交点参数{r = d / q;if (r > t1){return 0;}else if(r>t0){t0 = r;}}else if(q>0){//计算终边的交点参数r = d / q;if (r < t0) {return 0;}else if (r < t1)t1 = r;}else if (d<0){return 1;}
}void L_Barsky(double x0,double y0,double x1,double y1)//double xl, xr, yt, yb已知
{double t0 = 0.0, t1 = 0.0,delatx=0.0,delaty=0.0;delatx = x1 - x0;if (!cansee(-delatx, x0 - x1, t0, t1))return;if (!candee(delatx, xr - x0, t0, t1))return;delatx = x1 - x0;if (!cansee(-delaty, y0 - yb, t0, t1))return;if (!cansee(delaty, yt - y0, t0, t1))return;x1 = x0 + t1 * delatx;y1 = y0 + t1 * delaty;x0 = x0 + t0 * delatx;y0 = y0 + t0 * delaty;showline(x0, y0, x1, y1);//显示可见线段
}

注意:显示线的方法作者未实现,在WFC可直接调用

这篇关于C语言实现梁友栋-Barsky算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/456679

相关文章

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机