穿过已知点画平滑曲线-lua
参考原文
https://www.iteye.com/blog/westice-745173
贝塞尔曲线
为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。
后来在
“[翻译] AGG 之贝塞尔插值”http://liyiwen.iteye.com/blog/705489 。看到一种比较好的方法:
运用贝塞尔曲线的光滑性来穿过这些点。
大致思路就是 先算出相邻原始点的中点,在把相邻中点连成的线段平移到对应的原始点,以平移后的中点作为控制点,相邻原始点为起始点画贝塞尔曲线,这样就保证了连接处的光滑。而贝塞尔曲线本身是光滑的,所以就把这些原始点用光滑曲线连起来了。
lua代码
---@class Bezier
local Bezier = Lib.class("Bezier")
local new = Bezier.new
function Bezier:ctor()
end-- local originPoint = {
-- [1] = Lib.v2(0,600),
-- [2] = Lib.v2(100,500),
-- [3] = Lib.v2(200,300),
-- [4] = Lib.v2(600,0),
-- }
function Bezier:createCurve(originPoint)local scale = 0.6-- 控制点收缩系数 ,经调试0.6较好,CvPoint是opencv的,可自行定义结构体(x,y)local originCount = #originPointlocal midpoints = {}-- 生成中点for i = 1, originCount domidpoints[i] = {}local nexti = i+1;if nexti == originCount + 1 thennexti = 1endlocal prei = i-1;if prei == 0 thenprei = originCountendmidpoints[i].prei = preimidpoints[i].nexti = nextimidpoints[i].x = (originPoint[i].x + originPoint[nexti].x)/2.0;midpoints[i].y = (originPoint[i].y + originPoint[nexti].y)/2.0;end-- 平移中点,originPoint[i] 的前后两个中点,也就是midpoints[i] 和 midpoints[i-1] 的平移点local extrapoints1 = {}local extrapoints2 = {}for i = 1, originCount doextrapoints1[i] = {}extrapoints2[i] = {}endfor i = 1, originCount dolocal prei = midpoints[i].prei;local midinmid = {}midinmid.x = (midpoints[i].x + midpoints[prei].x)/2.0;midinmid.y = (midpoints[i].y + midpoints[prei].y)/2.0;local offsetx = originPoint[i].x - midinmid.x;local offsety = originPoint[i].y - midinmid.y;extrapoints1[i].x = midpoints[i].x + offsetxextrapoints1[i].y = midpoints[i].y + offsety--朝 originPoint[i]方向收缩 local addx = (extrapoints1[i].x - originPoint[i].x) * scale;local addy = (extrapoints1[i].y - originPoint[i].y) * scale;extrapoints1[i].x = originPoint[i].x + addxextrapoints1[i].y = originPoint[i].y + addyextrapoints2[prei].x = midpoints[prei].x + offsetxextrapoints2[prei].y = midpoints[prei].y + offsety--朝 originPoint[i]方向收缩addx = (extrapoints2[prei].x - originPoint[i].x) * scaleaddy = (extrapoints2[prei].y - originPoint[i].y) * scaleextrapoints2[prei].x = originPoint[i].x + addxextrapoints2[prei].y = originPoint[i].y + addyendlocal curvePoint = {}local controlList = {}--生成4控制点,产生贝塞尔曲线for i = 1, originCount-1 dolocal controlPoint = {}controlPoint[1] = originPoint[i]controlPoint[2] = extrapoints1[i]controlPoint[3] = extrapoints2[i]local nexti = i+1;if i == originCount thennexti = 1endcontrolPoint[4] = originPoint[nexti]local u = 1while(u >= 0) dolocal px = self:bezier3funcX(u,controlPoint)local py = self:bezier3funcY(u,controlPoint)--u的步长决定曲线的疏密u = u - 0.05local tempP = Lib.v2(px,py)--存入曲线点table.insert(curvePoint, tempP)endtable.insert(controlList, controlPoint)endreturn curvePoint
end-- 三次贝塞尔曲线
function Bezier:bezier3funcX(uu, controlP)local part0 = controlP[1].x * uu * uu * uu;local part1 = 3 * controlP[2].x * uu * uu * (1 - uu);local part2 = 3 * controlP[3].x * uu * (1 - uu) * (1 - uu);local part3 = controlP[4].x * (1 - uu) * (1 - uu) * (1 - uu);return part0 + part1 + part2 + part3;
endfunction Bezier:bezier3funcY(uu, controlP)local part0 = controlP[1].y * uu * uu * uu;local part1 = 3 * controlP[2].y * uu * uu * (1 - uu);local part2 = 3 * controlP[3].y * uu * (1 - uu) * (1 - uu);local part3 = controlP[4].y * (1 - uu) * (1 - uu) * (1 - uu);return part0 + part1 + part2 + part3;
end
return Bezier
穿过已知点画平滑曲线-lua相关推荐
- 穿过已知点画平滑曲线(3次贝塞尔曲线)
首先,我们计算出多边形所有边线的中点,Ai. 然后连接起相邻边中点,得到很多线段,记为 Ci .并用图记的方法计算出 Bi 点. 最后一步,只需要简单地将 Ci 进行平移,平移的路径就是每条线段上 B ...
- java 三次贝塞尔曲线算法_转:穿过已知点画平滑曲线(3次贝塞尔曲线)
Interpolation with Bezier Curves 贝塞尔插值 A very simple method of smoothing polygons 一种非常简单的多边形平滑方法 翻译 ...
- Android 穿过点画平滑曲线
先上效果图 参考了这篇文章 穿过已知点画平滑曲线(3次贝塞尔曲线) 原理什么的我也不说了,有兴趣的看这篇文章好了 直接上代码 public class DrawUtil {/*** 绘制穿过多边形顶点 ...
- 经过离散点画平滑曲线(贝塞尔3次)
穿过已知点画平滑曲线(3次贝塞尔曲线) 2011-04-11 18:59 8469人阅读 评论(9) 收藏 举报 float 数学计算 variables 图形 搜索引擎 bi 为了把一串点连成光滑的 ...
- 已知两点坐标拾取怎么操作_已知的操作员学习-第3部分
已知两点坐标拾取怎么操作 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's ...
- ArcGIS已知经纬度范围裁剪图像的步骤
ARCGIS已知经纬度范围裁剪图像的步骤: (1)生成经纬度的面 (2)利用裁剪工具裁剪:分析工具-->提取分析-->裁剪 其中第一步: (1)生成四个顶点的坐标点用xls保存(注意不能用 ...
- 已知地球上的2点坐标,A和B,求A,B线上 任意点位置。
根据已知的A点和B点,计算X点坐标,X在A,B 线上,AX距离已知. public static GeoPoint caculateWGS84GeoPoint(GeoPoint aPoint, Geo ...
- python怎么根据点来拟合曲线_2019_nCoV_利用python根据已知点求拟合曲线及简单预测(无实际意义)...
前言 本文仅做根据已知点求拟合曲线的几种方法的python实现,无任何实际意义 数据来源(另一篇博文) 利用Python爬取新冠肺炎疫情实时数据,Pyecharts画2019-nCoV疫情地图 参考 ...
- 地图已知两点坐标画一条曲线
开发中遇到了这个问题,Leaflet没有用两点画曲线的方法,只能自己求出曲线的坐标点组,再画了,废话不多说,直接贴代码: // 入参两个坐标(字符串格式:"114.30911,30.6000 ...
- matlab x y 坐标,已知(x,y,z)坐标,如何用matlab作三维曲线?
答:输入下面的语句 >> A=[0,150,0;0,100,-2.20;0,50,-4.85;0,0,-7.3;0,-50,-5.10;0,-100,-2.75;0,-150,0; 300 ...
最新文章
- 【机器学习】KNN算法代码练习
- [linux]makefile使用
- python图像处理的常用操作
- Android doc|Getting Started|部分 --转载 保存数据
- Go程序:演示复数类型的用法
- MSP430学习笔记10-ADC采集1602显示
- ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
- 致敬科比,JS手写贪吃蛇
- 马斯洛人类需求金字塔理论
- 使用PS让图片制作出渐变效果
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)(热身赛)	C-Statues
- 峰值帧+时序信息 跨数据集微表情识别
- securitytube视频列表
- linux是基于什么的开源操作系统,什么是开源操作系统
- VMware安装MacOS系统苹果虚拟机
- python编程练习--跑马灯
- 微信小程序iphone7设备下跳转h5页面失败,h5页面显示白屏,加载报错,其他页面正常显示
- 人脸识别:路在何方?| 爱莫受邀参加VALSE Webinar报告会
- 10大关键词解读中国互联网五年间创新飞跃在哪里
- pandas 筛选数据的 8 个骚操作
热门文章
- 怎么换证件照底色?分享两款好用的免费制作证件照的软件
- 计算机颜色更换,如何给证件照换底色;怎么快速更换证件照底色
- 阿里云服务器怎么正确使用OSS内网地址?
- SONY索尼摄像机Z280断电KLV.RSV.MXF视频打不开数据恢复成功
- 银行客户用户画像_大数据精准营销用户画像是核心-金融业大数据用户画像实践...
- 状态良好(恢复分区)空间的删除的方法
- OpenHarmony release3.1版本启动子系统功能分析
- 龙芯3A3000上实现BLFS的轻量级桌面LXDE
- 台式机连接校园网-UPC-lan-login
- 软件岗位--CTO、技术VP、技术总监、首席架构师