参考原文

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相关推荐

  1. 穿过已知点画平滑曲线(3次贝塞尔曲线)

    首先,我们计算出多边形所有边线的中点,Ai. 然后连接起相邻边中点,得到很多线段,记为 Ci .并用图记的方法计算出 Bi 点. 最后一步,只需要简单地将 Ci 进行平移,平移的路径就是每条线段上 B ...

  2. java 三次贝塞尔曲线算法_转:穿过已知点画平滑曲线(3次贝塞尔曲线)

    Interpolation with Bezier Curves  贝塞尔插值 A very simple method of smoothing polygons 一种非常简单的多边形平滑方法 翻译 ...

  3. Android 穿过点画平滑曲线

    先上效果图 参考了这篇文章 穿过已知点画平滑曲线(3次贝塞尔曲线) 原理什么的我也不说了,有兴趣的看这篇文章好了 直接上代码 public class DrawUtil {/*** 绘制穿过多边形顶点 ...

  4. 经过离散点画平滑曲线(贝塞尔3次)

    穿过已知点画平滑曲线(3次贝塞尔曲线) 2011-04-11 18:59 8469人阅读 评论(9) 收藏 举报 float 数学计算 variables 图形 搜索引擎 bi 为了把一串点连成光滑的 ...

  5. 已知两点坐标拾取怎么操作_已知的操作员学习-第3部分

    已知两点坐标拾取怎么操作 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's ...

  6. ArcGIS已知经纬度范围裁剪图像的步骤

    ARCGIS已知经纬度范围裁剪图像的步骤: (1)生成经纬度的面 (2)利用裁剪工具裁剪:分析工具-->提取分析-->裁剪 其中第一步: (1)生成四个顶点的坐标点用xls保存(注意不能用 ...

  7. 已知地球上的2点坐标,A和B,求A,B线上 任意点位置。

    根据已知的A点和B点,计算X点坐标,X在A,B 线上,AX距离已知. public static GeoPoint caculateWGS84GeoPoint(GeoPoint aPoint, Geo ...

  8. python怎么根据点来拟合曲线_2019_nCoV_利用python根据已知点求拟合曲线及简单预测(无实际意义)...

    前言 本文仅做根据已知点求拟合曲线的几种方法的python实现,无任何实际意义 数据来源(另一篇博文) 利用Python爬取新冠肺炎疫情实时数据,Pyecharts画2019-nCoV疫情地图 参考 ...

  9. 地图已知两点坐标画一条曲线

    开发中遇到了这个问题,Leaflet没有用两点画曲线的方法,只能自己求出曲线的坐标点组,再画了,废话不多说,直接贴代码: // 入参两个坐标(字符串格式:"114.30911,30.6000 ...

  10. 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 ...

最新文章

  1. 【机器学习】KNN算法代码练习
  2. [linux]makefile使用
  3. python图像处理的常用操作
  4. Android doc|Getting Started|部分 --转载 保存数据
  5. Go程序:演示复数类型的用法
  6. MSP430学习笔记10-ADC采集1602显示
  7. ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
  8. 致敬科比,JS手写贪吃蛇
  9. 马斯洛人类需求金字塔理论
  10. 使用PS让图片制作出渐变效果
  11. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)(热身赛) C-Statues
  12. 峰值帧+时序信息 跨数据集微表情识别
  13. securitytube视频列表
  14. linux是基于什么的开源操作系统,什么是开源操作系统
  15. VMware安装MacOS系统苹果虚拟机
  16. python编程练习--跑马灯
  17. 微信小程序iphone7设备下跳转h5页面失败,h5页面显示白屏,加载报错,其他页面正常显示
  18. 人脸识别:路在何方?| 爱莫受邀参加VALSE Webinar报告会
  19. 10大关键词解读中国互联网五年间创新飞跃在哪里
  20. pandas 筛选数据的 8 个骚操作

热门文章

  1. 怎么换证件照底色?分享两款好用的免费制作证件照的软件
  2. 计算机颜色更换,如何给证件照换底色;怎么快速更换证件照底色
  3. 阿里云服务器怎么正确使用OSS内网地址?
  4. SONY索尼摄像机Z280断电KLV.RSV.MXF视频打不开数据恢复成功
  5. 银行客户用户画像_大数据精准营销用户画像是核心-金融业大数据用户画像实践...
  6. 状态良好(恢复分区)空间的删除的方法
  7. OpenHarmony release3.1版本启动子系统功能分析
  8. 龙芯3A3000上实现BLFS的轻量级桌面LXDE
  9. 台式机连接校园网-UPC-lan-login
  10. 软件岗位--CTO、技术VP、技术总监、首席架构师