java实现裁剪算法代码_Cyrus-Beck图像裁剪算法归纳
此算法能使用任意多边形对一条直线段进行裁剪。
类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图像裁剪算法归纳相关推荐
- DDA画线算法+代码详解-直线扫描算法之一
#DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...
- java 绘制六边形_JAVA代码怎么实现图像六边形网格分割效果
下面给大家介绍JAVA代码怎么实现图像六边形网格分割效果,希望能给大家提供帮助. 一:原理 根据输入参数blockSize的大小,将图像分块,决定每块的中心通过该像素块内所有像素之和的均值与该块内部每 ...
- 先来先服务算法代码_一致性哈希算法编写
今天我想先给大家科普下一致性哈希算法这块,因为我下一篇文章关于缓存的高可用需要用到这个,但是又不能直接在里面写太多的代码以及关于一致性hash原理的解读,这样会失去对于缓存高可用的理解而且会造成文章很 ...
- apriori算法代码_sklearn(九)apriori 关联规则算法,以及FP-growth 算法
是什么: apriori算法是第一个关联规则挖掘算法,利用逐层搜索的迭代方法找出数据库中的项集(项的集合)的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉没必要的中间结果)组成.是一种挖掘关 ...
- matlab中存档算法代码,Matlab中的FCM算法代码及中文详解
Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...
- 计算机配色算法代码,计算机配色理论及算法的研究
摘要: K-M光学模型与色料加和混合模型是计算机配色理论的基础,经调研发现两者在计算机配色的应用中存在一些问题,本文以涤纶平纹织物为基材,对计算配色理论及其算法进行了系统的研究.首先,本文系统分析了K ...
- 冒泡算法代码java_java版本的冒泡算法
/** 文件名:MAOPao.java 描述: java版本的冒泡算法 作者:慈勤强 Email:cqq1978@Gmail.com **/ http://www.gaodaima.com/?p=42 ...
- c语言 k最近邻分类算法代码,实验二 K-近邻算法及应用
实验二 K-近邻算法级应用 一.实验目的 1.理解K-近邻算法原理,能实现算法K近邻算法: 2.掌握常见的距离度量方法: 3.掌握K近邻树实现算法: 4.针对特定应用场景及数据,能应用K近邻解决实际问 ...
- 计算机图形学曲线算法代码,计算机图形学自由曲线绘制算法.doc
计算机图形学自由曲线绘制算法 宁夏师范学院数学与计算机科学学院 <>实验报告 实验序号: 实验项目名称: 学 号姓 名专业.班实验地点指导教师时 间.实验内容与步骤 1 //TestVie ...
- java图像处理之图像裁剪
图像裁剪即截取原始图像某一部分生成一幅新的图像,某些app也会要求用户将上传图像进行一定程度裁剪来作为头像.图像裁剪实现起来比较简单,下面介绍两种裁剪方式,矩形裁剪和圆形裁剪. 矩形裁剪,定义图像上某 ...
最新文章
- python argparse理解与实例
- Excel中vlookup函数的使用方法
- 运用计算机计算包含排斥原理,离散数学包含及排斥原理.ppt
- react入门jsx
- python 计算器 tkinter_python -Tkinter 实现一个小计算器功能
- JSON Assertion(JSON断言)
- 使用adb命令从Android手机中取出已安装的app包,导出apk
- 大数据简历 专业技能内容
- 广数928te_广数928te2说明书
- 射频识别技术漫谈(1)——概念、分类
- Acwing1183. 电力
- webmagic保存html页面,WebMagic抓取前端Ajax渲染的页面
- SourceTree 删除记住的账户
- C语言入门——常见数据类型取值范围
- 安装postman工具 出现请设置注册表项HKLM\Software\Microsoft\.NETFramework\InstallRoot,指向.NET Fra
- fatal: The remote end hung up unexpectedly
- 矩阵在线计算机,矩阵计算器
- wifi打印服务器方案USB共享打印机模块参考设计
- 固态硬盘量产复活记(慧荣SM2256K+H27QFG8PEM5R)
- 学习Python的基础,Python的数据类型和变量