此算法能使用任意多边形对一条直线段进行裁剪。

类GLdoublePoint: 公有—GLdouble x ,y;

类line:                 公有—GLdoublePoint first,second;

linelist:                 line型数据组成的链表,用于描述多边形;

伪代码:

int  CyrusBeck(line&  seg , linelist&  l)

{

double  numer , denom ;

double  tIn = 0.0 , tOut = 1.0;

Vector  c , temp;

c = seg.second - seg.first;

for(int  i = 0 ; i < l.num ; i++)

{

temp = l.line[i].pt - first ;  // pt为此时多边形某边上的任意一点

numer = dot(l.line[i].norn , temp);

denom = dot(l.line[i].norn , c);  // dot()函数为求两向量的点积,自行编写

if(!chopCI(numer , denom , tIn , tOut))  return  0 ; // chopCI()是用来计算射线与多边型每条边相交 的时间,并判断射线在交点处是射入还是射出,伪代码在后面

}

if(tOUt < 1.0)                                                                   //进行裁剪

{

seg.second.x = seg.first.x + c.x * tOut ;

seg.second.y = seg.first.y + c.y * tOut ;

}

if(tIn > 0.0)

{

seg.first.x = seg.first.x + c.x * tIn ;

seg.first.y = seg.first.y + c.y * tIn ;

}

return 1;

}

int  chopCI(double  numer , double  denom ,double  tIn ,double  tOut)

{

double  tHit;

if(denom < 0)                                                              //射线射入

{

tHit = numer / denom ;

if (tHit > tOut) return 0;

else  if(tHit > tIn)   tIn = tHit ;

}

else if(denom > 0)                                                       // 射线射出

{

tHit = numer / denom ;

if(tHit < hIn) return 0;

else  if(tHIt > tIn) tOut = tHIt ;

}

else                                                                            //射线与边平行

if(numer <= 0 )  return 0;

return 1;

}

说明:

设某射线起始点为A,单位向量为c;某直线l,其上任意一点B,法向量n;先判断A和B的关系。

假设A与B相交,则焦点A+t*c与B形成的向量与n垂直,则有:

n ●(A+c*t — B)= 0 (1)

此处可以将参数t看为是时间,则t为射线击中l的时间,记为tHit。

(1)式经变换可得:tHit = n ●(B—A)/ (n ● c)

由向量点积的性质可得:若n ● c>0 ,则射线沿法线方向

若n ● c<0 ,则射线与法线相反

若n ● c=0 ,则法线与射线平行

代码中的tIn和tOut可以理解为候选区间,也就是射线现存的部分,剪裁时就是根据射线是射入还是射出以及tHIt和tIn与tOut的关系来修改tOut和tIn,避免了频繁进行改变点的运算,因为计算机图形学中点与向量的定义很相似,容易出错。

Cyrus-Beck裁剪算法就是依据以上方法用多边形的每条边对seg进行判断,并把剪裁后的线段返回到seg中,思路简单但是运算量较大,也不实用来计算边数多的多边形,同时此算法也只适用于凸多边形。

java实现裁剪算法代码_Cyrus-Beck图像裁剪算法归纳相关推荐

  1. DDA画线算法+代码详解-直线扫描算法之一

    #DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...

  2. java 绘制六边形_JAVA代码怎么实现图像六边形网格分割效果

    下面给大家介绍JAVA代码怎么实现图像六边形网格分割效果,希望能给大家提供帮助. 一:原理 根据输入参数blockSize的大小,将图像分块,决定每块的中心通过该像素块内所有像素之和的均值与该块内部每 ...

  3. 先来先服务算法代码_一致性哈希算法编写

    今天我想先给大家科普下一致性哈希算法这块,因为我下一篇文章关于缓存的高可用需要用到这个,但是又不能直接在里面写太多的代码以及关于一致性hash原理的解读,这样会失去对于缓存高可用的理解而且会造成文章很 ...

  4. apriori算法代码_sklearn(九)apriori 关联规则算法,以及FP-growth 算法

    是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...

  5. matlab中存档算法代码,Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  6. 计算机配色算法代码,计算机配色理论及算法的研究

    摘要: K-M光学模型与色料加和混合模型是计算机配色理论的基础,经调研发现两者在计算机配色的应用中存在一些问题,本文以涤纶平纹织物为基材,对计算配色理论及其算法进行了系统的研究.首先,本文系统分析了K ...

  7. 冒泡算法代码java_java版本的冒泡算法

    /** 文件名:MAOPao.java 描述: java版本的冒泡算法 作者:慈勤强 Email:cqq1978@Gmail.com **/ http://www.gaodaima.com/?p=42 ...

  8. c语言 k最近邻分类算法代码,实验二 K-近邻算法及应用

    实验二 K-近邻算法级应用 一.实验目的 1.理解K-近邻算法原理,能实现算法K近邻算法: 2.掌握常见的距离度量方法: 3.掌握K近邻树实现算法: 4.针对特定应用场景及数据,能应用K近邻解决实际问 ...

  9. 计算机图形学曲线算法代码,计算机图形学自由曲线绘制算法.doc

    计算机图形学自由曲线绘制算法 宁夏师范学院数学与计算机科学学院 <>实验报告 实验序号: 实验项目名称: 学 号姓 名专业.班实验地点指导教师时 间.实验内容与步骤 1 //TestVie ...

  10. java图像处理之图像裁剪

    图像裁剪即截取原始图像某一部分生成一幅新的图像,某些app也会要求用户将上传图像进行一定程度裁剪来作为头像.图像裁剪实现起来比较简单,下面介绍两种裁剪方式,矩形裁剪和圆形裁剪. 矩形裁剪,定义图像上某 ...

最新文章

  1. python argparse理解与实例
  2. Excel中vlookup函数的使用方法
  3. 运用计算机计算包含排斥原理,离散数学包含及排斥原理.ppt
  4. react入门jsx
  5. python 计算器 tkinter_python -Tkinter 实现一个小计算器功能
  6. JSON Assertion(JSON断言)
  7. 使用adb命令从Android手机中取出已安装的app包,导出apk
  8. 大数据简历 专业技能内容
  9. 广数928te_广数928te2说明书
  10. 射频识别技术漫谈(1)——概念、分类
  11. Acwing1183. 电力
  12. webmagic保存html页面,WebMagic抓取前端Ajax渲染的页面
  13. SourceTree 删除记住的账户
  14. C语言入门——常见数据类型取值范围
  15. 安装postman工具 出现请设置注册表项HKLM\Software\Microsoft\.NETFramework\InstallRoot,指向.NET Fra
  16. fatal: The remote end hung up unexpectedly
  17. 矩阵在线计算机,矩阵计算器
  18. wifi打印服务器方案USB共享打印机模块参考设计
  19. 固态硬盘量产复活记(慧荣SM2256K+H27QFG8PEM5R)
  20. 学习Python的基础,Python的数据类型和变量

热门文章

  1. Java经典算法(四)
  2. newifi3 web认证_关于wifi portal认证--为浏览器添加wifi认证功能
  3. 分门别类刷题总结列表 C++ 实现
  4. android华为推送不显示角标,V6项目集成华为推送流程和角标显示处理
  5. 史上最好用的云盘 - OneDrive介绍(附带15G推荐链接)
  6. ppp项目模式风口再现 什么是PPP概念股一览
  7. python常见内置模块
  8. 554 DT:SPM 163 smtp3解决方案
  9. docker入门之DockerDesktop
  10. xshell破解-限制窗口