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可直接调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oops-framework框架 之 音频管理(六)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 注&#xff1a; 作者dgflash的oops-framework框架QQ群&#xff1a; 628575875 简介 在CocosCreator中&#xff0c;音频的播放主要通过组件: AudioSource 来管理音乐、音效的播放、暂停和停止…

【尚硅谷】第07章:随堂复习与企业真题(面向对象-进阶)

来源&#xff1a;尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备) 基本都是宋老师发的资料里面的内容&#xff0c;只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第07章&#xff1a;随堂复习…

k8s的部署管理以及prometheus相关监控

安装运行prometheus和grafana编辑prometheus配置文件&#xff0c;增加采集prometheus自身数据的采集规则grafana上导入prometheus相关图表的dashboard 前面三步主要根据https://blog.csdn.net/shnu_cdk/article/details/132182858?spm1001.2014.3001.5506 用Go编写一个prome…

C# 热键注册工具类

写在前面 介绍一个验证过的热键注册工具类&#xff0c;使用系统类库user32.dll中的RegisterHotkey函数来实现全局热键的注册。 代码实现 [Flags]public enum KeyModifiers{Alt 1,Control 2,Shift 4,Windows 8,NoRepeat 0x4000}public static class HotKeyHelper{[DllImp…

01、pytest:帮助你编写更好的程序

简介 ​pytest框架可以很容易地编写小型、可读的测试&#xff0c;并且可以扩展以支持应用程序和库的复杂功能测试。使用pytest至少需要安装Python3.7或PyPy3。PyPI包名称为pytest 一个快速的例子 content of test_sample.py def inc(x):return x1def test_ansewer():assert i…

OpenCV-Python:图像卷积操作

目录 1.图像卷积定义 2.图像卷积实现步骤 3.卷积函数 4.卷积知识考点 5.代码操作及演示 1.图像卷积定义 图像卷积是图像处理中的一种常用操作&#xff0c;主要用于图像的平滑、锐化、边缘检测等任务。它可以通过滑动一个卷积核&#xff08;也称为滤波器&#xff09;在图像…

MySQL之时间戳(DateTime和TimeStamp)

MySQL之时间戳&#xff08;DateTime和TimeStamp&#xff09; 文章目录&#xff1a; MySQL之时间戳&#xff08;DateTime和TimeStamp&#xff09;一、DateTime类型二、TimeStamp类型三、DateTime和TimeStamp的区别 当插入数据时&#xff0c;需要自动记录一个时间时候&#xff0c…

MT4下载常见问题解答:解决安装过程中的技术难题

MetaTrader 4(简称MT4)是全球广泛使用的外汇交易平台&#xff0c;它以强大的功能、用户友好的界面和高度定制性获得了众多金融交易者的青睐。然而&#xff0c;对于初次接触MT4的用户来说&#xff0c;下载和安装MT4软件可能会遇到一些技术难题。本文作为一位资深金融技术专家的分…

人工智能_机器学习059_非线性核函数_poly核函数_rbf核函数_以及linear核函数效果对比---人工智能工作笔记0099

人工智能_机器学习059_非线性核函数介绍---人工智能工作笔记0099 那么我们应该如何调整这个SVC的参数,也就是我们应该使用哪种核函数,比较合适呢?这取决于我们的数据,适合使用哪个核函数,正好我们有 提供的score = accuracy_score(y_test,y_pred) 这样的评分函数,我们可以根据…

ffmpeg 实现多视频轨录制到同一个文件

引言 在视频录制中&#xff0c;有时会碰到这样一个需求&#xff0c;将不同摄像头的画面写入到一个视频文件&#xff0c;这个叫法很多&#xff0c;有的厂家叫合流模式&#xff0c;有的叫多画面多流模式。无论如何&#xff0c;它们的实质都是在一个视频文件上实现多路不同分辨率视…

记录66666

为了在两台运行RHEL 8的服务器上配置PostgreSQL 14的主从架构&#xff0c;你需要按照以下步骤操作。这里&#xff0c;假设你有两台服务器&#xff0c;主服务器的IP为192.168.1.100&#xff0c;从服务器的IP为192.168.1.101。我们将设置数据目录为/data/&#xff0c;归档日志目录…

保护你的数据:深入了解安全测试!

安全测试是一种非功能性测试。与功能测试不同&#xff0c;功能测试关注的是软件的功能是否正常工作&#xff08;软件做什么&#xff09;&#xff0c;非功能测试关注的是应用程序是否被正确设计和配置。 安全测试的主要目标&#xff1a; 识别资产-需要保护的东西&#xff0c;如…

STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;1&#xff09;项目介绍及GUI界面基础 一、项目介绍 1.1方案提供 1.2主控选择 1.3硬件平台 1.4 开发环境 1.5 关于华清 二、GUI界面基础 2.1.1 嵌入式绘图系统 2.1.1 色彩格式 2.1.1帧缓冲区 …

力扣374周赛

力扣第374场周赛 找出峰值 模拟 class Solution { public:vector<int> findPeaks(vector<int>& mountain) {vector<int>ans;for(int i 1 ; i < mountain.size() - 1; i ){if(mountain[i] > mountain[i-1] && mountain[i] > mountai…

CleanMyMac X2024最新免费Mac中文版安装包下载

CleanMyMac X for Mac中文2024版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。cleanmymac x个人认为X代表界面上的最大升级&#xff0c;功能方面有更多增加&#xff0c;与最新macOS系统更加兼容&#xff0c;流畅地与系统性…

【Vulnhub 靶场】【Prime (2021): 2】【简单 - 中等】【20210509】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/prime-2021-2,696/ 靶场下载&#xff1a;https://download.vulnhub.com/prime-2021/Prime-2.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年5月9日 文件大小&#xff1a;3.7 GB 靶场作者&am…

Json.NET 单个对象Json字符串反序列成两个不同实体对象

本文主要介绍Newtonsoft.JSON(Json.NET)中&#xff0c;将一个对象的Json字符串反序化成两个不同的实体对象的方法代码。具体效果如下&#xff1a; Json字符串&#xff1a; [{"guardian_id": "1453","guardian_name": "Foo Bar",&quo…

能源企业管理ERP系统都有哪些?可以帮助企业解决哪些难点

能源企业在不同的发展阶段面对的经营压力以及遇到的管理问题各异&#xff0c;随着部分产品结构的复杂化&#xff0c;日常经营管理工作也愈加繁琐。 有些能源企业内部存在信息传递不畅、经营数据统计不及时、部门协作效率低、多仓库和多平台数据不统一等情况&#xff0c;而这些…

GPT3年终总结

User You 程序员年度绩效总结 ChatGPT ChatGPT 程序员年度绩效总结通常包括以下几个方面&#xff1a; 目标达成情况&#xff1a; 回顾年初设定的目标&#xff0c;评估在项目完成、技能提升等方面的达成情况。 工作贡献&#xff1a; 强调在项目中的个人贡献&#xff0c;包括…

Flask 快速入门

引言 Flask 是一个轻量级的Web框架&#xff0c;以简洁和灵活而著称。它提供了构建Web应用所需的基本工具&#xff0c;同时保持了足够的可扩展性&#xff0c;使其成为初学者和有经验的开发人员的首选。本系列专栏将带领大家逐步深入学习 Flask&#xff0c;从最基础的概念开始&a…