本帖最后由 南郊居士 于 2020-2-18 23:38 编辑

2020.2.18 重要修正:

1. 修正了当图样长宽不同时不能正确显示各控制点的问题。

(一整天了都没人吐槽这个问题,看来这个工具还真是花狸狐哨的成分多些{:1_926:})2. 新增了多条路径的生成功能。3. 修正其他小问题,修改了界面。

文章最后有彩蛋。--------------------------------- 正文分割线 ----------------------------------

我国著名政治家马邦德曾经说过:“饭要一口口吃,路要一步步走。”在更新的过程中,我突发奇想要添加一个心形裁剪功能,以满足某些人的少女心。于是上网搜索心形线的画法,结果发现凡是用一个方程画出来的,不管是极坐标还是直角坐标,成品都不怎么好看:

心形.png (8.93 KB, 下载次数: 0)

2020-2-17 22:33 上传

于是退而求其次,用贝塞尔曲线分段绘制,可是问题又来了,作为一名数学小白,我不会算曲线方程啊。。。

于是这个工具就诞生了。

------------------------------- 正式内容分割线 ---------------------------------------

界面.png (52.47 KB, 下载次数: 0)

2020-2-17 22:33 上传

工具名称:曲折

功能:可手工拟合任意首尾相连的三次方贝塞尔曲线并生成坐标。

语言:HTML5+Javascript纯前端

操作说明:

可在编辑范围内任意拖动图样,选中下方按钮(变色)后点击编辑区域即可设定各点位置。图样仅仅为绘制曲线的参考,不会参与最后的生成。

指定原点:你的绘制原点,最终生成的全部坐标均以此原点计算偏移,默认为图样正中央。

封闭路径(图上没有截到):使所有曲线构成一个闭环,封闭后无法再添加新线,若仍需添加则选“回到上一段”即可。

随机已绘/在绘颜色:改变一下图中已经画好的曲线/正在画的曲线的显示颜色,避免曲线和图样颜色相近看不清,颜色为随机生成的24位真彩色,如果还是看不清就再变一次。

初始视口:把图片位置恢复至刚打开的状态。

生成点序列:做好了就能生成各贝塞尔曲线控制点的坐标了。

半径:半径的定义是图样的长、宽较大值的一半,你可以任意修改这个半径值,它将乘到最后生成的坐标里面,默认为1。

效果:

按照上图的心型手工拟合的贝塞尔曲线坐标如下:

生成.png (96.81 KB, 下载次数: 0)

2020-2-17 22:33 上传

找了个在线测试器绘制测试:

效果.png (120.86 KB, 下载次数: 1)

2020-2-17 22:33 上传

一颗红心献给你,很漂亮吧。

你也可以自己测试这段代码:

[JavaScript] 纯文本查看 复制代码var c=document.getElementById("myCanvas");

var ctx=c.getContext("2d");

ctx.save();

ctx.translate(150, 75);

ctx.scale(50, 50);

ctx.fillStyle = "red";

ctx.beginPath();

ctx.moveTo(-0.004082, -0.683418);

ctx.bezierCurveTo(-0.208163, -1.067092, -0.620408, -1.099745, -0.869388, -0.789541);

ctx.bezierCurveTo(-1.146939, -0.365051, -0.906122, 0.075765, -0.730612, 0.259439);

ctx.bezierCurveTo(-0.526531, 0.508418, -0.208163, 0.724745, 0, 1.002296);

ctx.bezierCurveTo(0.204082, 0.73699, 0.461224, 0.553316, 0.661224, 0.332908);

ctx.bezierCurveTo(0.946939, 0.06352, 1.106122, -0.401786, 0.906122, -0.728316);

ctx.bezierCurveTo(0.677551, -1.144643, 0.146939, -1.03852, -0.004082, -0.683418);

ctx.fill();

ctx.restore();

工具链接:http://gxsoftware.gitee.io/bezier/

只有一个html文件,源码请自行另存为。

--------------------------------------- 彩蛋分割线 ---------------------------------------

@akronblim 提到:

“任意点数的贝塞尔曲线,不过随着点数变多,计算量变得过大,拖动变得很缓慢”

于是我花了20分钟肝(误)了一张图。

我在网上搜了一张我觉得自己能接受的(搜索“复杂图片”出来的结果光看着就头晕),边缘比较复杂,基本不可能靠人工计算来画出的一张图:

祥云.png (199.91 KB, 下载次数: 0)

2020-2-18 22:52 上传

一张很吉祥的图对吧?

正片开始:

祥云界面.png (209.92 KB, 下载次数: 0)

2020-2-18 22:55 上传

这是我手工取点完成以后的样子,用时约15分钟。

最终统计,一共四条路径,共32条曲线:

祥云点列表.png (390.66 KB, 下载次数: 0)

2020-2-18 22:54 上传

编写绘制脚本,用时约5分钟:

[HTML] 纯文本查看 复制代码

Your browser does not support the HTML5 canvas tag.

var c = document.getElementById("myCanvas");

var ctx = c.getContext("2d");

ctx.translate(150, 75);

ctx.fillStyle = "red";

ctx.beginPath();

ctx.moveTo(-27.193803, -21.550932);

ctx.bezierCurveTo(-35.127598, -32.739616, -60.149564, -36.197937, -56.894675, -17.075458);

ctx.bezierCurveTo(-70.117665, -17.68575, -72.151971, -5.886774, -67.269636, 0.623006);

ctx.bezierCurveTo(-64.014746, 6.319064, -56.894675, 8.760231, -53.232923, 4.284758);

ctx.bezierCurveTo(-48.350588, 18.321471, -37.161904, 17.711179, -30.855555, 7.946509);

ctx.bezierCurveTo(-26.17665, -6.903927, -41.230517, -14.43086, -46.926574, -3.649037);

ctx.bezierCurveTo(-47.536866, -16.465166, -31.669277, -8.327941, -27.600665, -5.073051);

ctx.bezierCurveTo(-21.904607, -1.818161, -17.022272, 4.691619, -12.546799, 8.35337);

ctx.bezierCurveTo(-1.561545, 16.490595, 13.288891, 21.779791, 31.394216, 20.355777);

ctx.bezierCurveTo(12.678599, 19.338624, -1.561545, 9.980815, -8.681617, 0.826437);

ctx.bezierCurveTo(-14.377674, -5.073051, -21.090885, -15.854874, -27.193803, -21.550932);

ctx.fill();

ctx.beginPath();

ctx.moveTo(-8.478186, -16.668597);

ctx.bezierCurveTo(-15.801689, -11.582831, -10.105631, -4.66619, -5.630157, 0.216145);

ctx.bezierCurveTo(1.083053, 9.777384, 12.882029, 15.676872, 24.070714, 17.304317);

ctx.bezierCurveTo(40.141733, 20.762638, 57.636767, 14.659719, 69.842604, 4.284758);

ctx.bezierCurveTo(49.499542, 12.421982, 32.6148, 12.828844, 19.391809, 6.725925);

ctx.bezierCurveTo(3.32079, 2.047021, 3.117359, -19.109764, 13.695752, -13.413707);

ctx.bezierCurveTo(6.982541, -5.479912, 15.730058, 2.453882, 22.646699, -0.597577);

ctx.bezierCurveTo(33.225092, -4.259329, 32.207939, -19.516625, 21.426116, -25.009252);

ctx.bezierCurveTo(17.560934, -27.043559, 13.492321, -25.009252, 10.644292, -23.788669);

ctx.bezierCurveTo(10.440862, -32.739616, 2.303637, -35.587645, -5.019866, -31.722463);

ctx.bezierCurveTo(-10.919354, -30.095018, -12.750229, -21.14407, -8.478186, -16.668597);

ctx.fill();

ctx.beginPath();

ctx.moveTo(-26.380081, 11.811691);

ctx.bezierCurveTo(-35.331028, 14.252858, -33.907014, 21.169499, -32.483, 24.424389);

ctx.bezierCurveTo(-31.465847, 27.272418, -28.617818, 29.917016, -26.380081, 28.289571);

ctx.bezierCurveTo(-23.938914, 37.037088, -16.20855, 38.054241, -10.309062, 29.510155);

ctx.bezierCurveTo(-6.850741, 22.593514, -13.15709, 16.897456, -19.056579, 18.728332);

ctx.bezierCurveTo(-24.142344, 22.186652, -19.056579, 27.475849, -16.818842, 23.407236);

ctx.bezierCurveTo(-16.005119, 29.713585, -24.345775, 27.679279, -24.345775, 21.779791);

ctx.bezierCurveTo(-23.328622, 15.676872, -17.632564, 16.083734, -11.733076, 18.524901);

ctx.bezierCurveTo(-3.799282, 24.017528, 8.406556, 26.662126, 21.629546, 22.390083);

ctx.bezierCurveTo(-0.340961, 23.407236, -6.647311, 14.456289, -14.377674, 8.556801);

ctx.bezierCurveTo(-21.090885, 5.505341, -27.397234, 6.319064, -26.380081, 11.811691);

ctx.fill();

ctx.fillStyle = "#ffffff";

ctx.beginPath();

ctx.moveTo(2.710498, -12.599984);

ctx.bezierCurveTo(-5.630157, -6.700496, 0.472761, 4.488188, 7.796264, 7.336217);

ctx.bezierCurveTo(1.489914, 3.267604, -1.358114, -4.259329, 2.710498, -12.599984);

ctx.fill();

于是成品就是这样的:

成品.png (170.54 KB, 下载次数: 1)

2020-2-18 23:33 上传

还不错吧,挺像的。

不否认的是,如果做专业的曲线拟合(我不专业),可能有成千上万条曲线,大概会卡。

但是如果仅仅是手工取点,我相信这点规模的绘制应该完全不会卡。

测试环境:

研华工控机+奔腾G850+4G内存+Windows7专业版+360极速浏览器

以上来自值班中的百无聊赖。

工具链接:http://gxsoftware.gitee.io/bezier/

html贝塞尔曲线在线,【HTML+js+纯前端】三次方贝塞尔曲线手工拟合小工具相关推荐

  1. JS纯前端实现文件保存

    JS纯前端实现文件保存 <body><a href="" id="a">click here to download your file ...

  2. 三次bezier曲线 MATLAB,Matlab-画二次及三次Bezier曲线-8控制点的B样条曲线

    <Matlab-画二次及三次Bezier曲线-8控制点的B样条曲线>由会员分享,可在线阅读,更多相关<Matlab-画二次及三次Bezier曲线-8控制点的B样条曲线(3页珍藏版)& ...

  3. JS纯前端实现卡通人物图片的动态效果

    一.图片的选取(用截图工具将其裁剪成10张小图片,放在项目的image文件夹下面) 二 .html代码(图片展示地方) <div id="all"style="he ...

  4. JS纯前端实现audio音频剪裁剪切复制播放与上传

    背景是这样的,用户上传音频文件,可能只需要几十秒就够了,但是常规的音乐都要3~5分钟,80%的流量都是不需要的,要是就这么传上去,其实是流量的浪费,如果可以在前端就进行剪裁,也就是只取前面一段时间的音 ...

  5. verify.js纯前端验证码插件

    这是一款极简洁的表单校验插件,属于半封装模式,只需引入插件,即可任意编写业务逻辑代码,简单方便易修改. 首先引入js,需提前引入jquery,然后引入verift即可使用 <script src ...

  6. web安全:JS纯前端实现图片或文件安全的上传和下载功能

    背景 在做前端开发的过程中,做过很多的项目,都会遇到图片预览和展示.一般的图片都是用于页面美化,信息解释说明的作用.但是在接触某些业务场景时,例如用户注册需要上传用户个人身份证照片,办理业务需要上传证 ...

  7. 前端通过range控制的rgba配色小工具

    初衷 制作一个针对视觉的产品,快速调出想要的颜色,然后写在给前端程序员的文档里,方便前端程序员进行页面的配色处理[滑稽] 什么是range 在html中有一个<input>的标签,通过在i ...

  8. 女友晚安之后依然在线:python男友用20行代码写了个小工具

    大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点:python用20代码实现录屏功能 代码干货满满,建议收藏+实操 ...

  9. excel在线_功能强大的纯前端 Excel 在线表格: Luckysheet

    [导语]:Luckysheet是一款类似excel的在线表格,纯前端,功能强大.配置简单.完全开源,几行代码就能展现出一个功能完备的在线表格. 简介 Luckysheet是一款类似excel的纯前端在 ...

最新文章

  1. 2021年浙软夏令营预推免面经
  2. 4年4篇顶刊顶会论文!清华开源肖像线条画生成代码,惟妙惟肖模仿人类作画...
  3. SpringBoot 之 MVC
  4. thinkphp模版常量替换机制
  5. 服务器同时装mysql和sqlserver_Centos创建syslog服务器
  6. RxJs 操作符 withLatestFrom 在 SAP 电商云 Spartacus UI 中的应用
  7. win10下openpose1.5安装
  8. groovy 字符串截取最后一个_python数据类型总结——数字和字符串
  9. SpringMVC表单验证与Velocity整合
  10. (40)Xilinx PLL IP核配置(一)(第8天)
  11. IDEA下SSM项目搭建的基本操作
  12. Hive之表类型解析
  13. 初窥JQuery(二)-事件机制(1)
  14. linux 命令打印,Linux终端打印命令使用介绍
  15. USB 协议分析(含基本协议和 USB 请求和设备枚举)
  16. 什么索引?索引的作用是什么?索引运用实例
  17. autojs和按键精灵哪个好?按键精灵打包开始收费了,是弃坑还是继续杠?
  18. win10删除文件夹提示需要管理员权限的解决办法
  19. ubuntu 18.04下解决网易云音乐不能打开的问题
  20. 黑客测试漏洞被逮捕 白帽的正确姿势是什么

热门文章

  1. 崋佬论币;从哪里跌倒,就从哪里爬起来
  2. 2023.02.11草图大师浴室效果图1skp素材效果图
  3. 英语口语笔记B1-Unit7.交通出行-04-Train travel in Europe
  4. HAproxy增加日志记录功能和自定义日志输出内容、格式
  5. 软件企业认定的税收优惠政策讲解
  6. Optional orElseThrow 错误: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出...
  7. JavaScript(WebAPI) (前端)
  8. vue3.0组件之父传子,子传父,父传孙
  9. MSI微星主板MSI Dual CoreCenter监控软件 2.0.1.5
  10. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序.doc...