quadraticCurveTo绘制的是仅含一个控制点的二次贝塞尔曲线,参数为控制点坐标和终点坐标,起点为当前路径终点,调用前须用moveTo显式指定起点。
很多人看到 quadr 就默认它能画“带两个控制点”的曲线,结果发现画出来弯得不对——其实它只接受**一个控制点**和**一个终点**,起点是当前路径的终点(即上一步的
aticCurveTomoveTo 或前一个绘图命令结束位置)。这是最常踩的坑:把它当 bezierCurveTo 用。
它的数学本质是:起点 P₀(隐式)、控制点 P₁、终点 P₂,曲线严格落在这三点构成的抛物线段上。
quadraticCurveTo(cpX, cpY, endX, endY):前两个参数是控制点坐标,后两个是终点坐标moveTo(x, y) 或已有路径终点设好起点,否则会从 (0, 0) 开始画(可能看不见)单独写 quadraticCurveTo(100, 50, 200, 100) 很可能什么也不显示——因为起点默认是 (0, 0),而你没声明要从哪开始画。必须显式指定起点。
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(50, 150); // 必须!这是曲线的起点 P₀
ctx.quadraticCurveTo(100, 50, 200, 150); // P₁=(100,50), P₂=(200,150)
ctx.stroke();
如果想连续画多段二次贝塞尔(比如波浪线),每段的起点就是上一段的终点,这时可以省略中间的 moveTo,但第一段仍需。
在同一个 beginPath() 内混用 quadraticCurveTo 和 bezierCurveTo 是完全可行的,但它们对“当前点”的更新逻辑一致:每次调用都会把终点设为新的当前点。容易出错的是在调用之间插入了 lineTo 或 arc 却忘了当前点已变。
quadraticCurveTo(a,b,c,d) 执行后,当前点变成 (c, d)
bezierCurveTo(p1x,p1y,p2x,p2y,x,y) 执行后,当前点变成 (x, y)
moveTo(x, y) 重置例如画一个“先直后弯再直”的路径:
ctx.beginPath(); ctx.moveTo(20, 100); ctx.lineTo(80, 100); // 当前点现在是 (80,100) ctx.quadraticCurveTo(120, 60, 160, 100); // 从 (80,100) 出发,经 (120,60) 到 (160,100) ctx.lineTo(220, 100); // 接着从 (160,100) 画直线 ctx.stroke();
quadraticCurveTo 本身不负责抗锯齿,Canvas 的平滑效果取决于上下文设置和设备像素比。如果你发现曲线边缘发虚或有阶梯感,问题通常不在方法调用,而在渲染配置:
canvas.width 和 canvas.height 为整数,并匹配 CSS 显示尺寸(避免浏览器缩放插值)ctx.imageSmoothingEnabled = true(默认就是 true,但某些环境会关)window.devicePixelRatio 放大 width/height,再用 CSS 缩回显示尺寸曲线本身的几何精度足够高,锯齿基本是采样或缩放导致的视觉问题,不是算法缺陷。
# css
# html
# html5
# 浏览器
# win
# canva
# canvas
# 算法
# 的是
# 这是
# 塞尔
# 落在
# 如果你
# 也不
# 是在
# 抗锯齿
# 一句
# 已有
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Python大型项目拆分策略_模块化解析【教程】
Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭
Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录
静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】
Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作
Python列表推导式与字典推导式教程_简化代码高效写法
如何在Golang中编写端到端测试_Golang E2E测试流程示例
如何使用正则表达式提取以编号开头、后接多个注解的逻辑分组块
php怎么下载安装后设置错误日志_phpini log配置教程【汇总】
Mac如何创建和管理多个桌面空间_Mac高效多任务处理【技巧】
c++如何实现一个高性能的环形队列(Ring Buffer)_c++无锁实现方法【并发】
Go 中 := 短变量声明的类型推导机制详解
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
Windows10怎么用“讲述人”读屏辅助 Windows10轻松使用开启讲述人朗读屏幕文字帮助视障用户【教程】
VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】
Win11无法拖拽文件到任务栏怎么办_Win11开启拖放功能修复【方法】
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
php下载安装包怎么选_threadsafe与nts版本差异【解答】
Windows如何拦截腾讯视频广告_Windows拦截腾讯视频广告方法【方法】
海外搜索引擎推广效果怎么样,怎么分析效果!
php中作用域操作符能访问私有静态属性吗_访问权限限制【指南】
如何使用Golang实现Web表单数据绑定_自动映射字段到结构体
Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】
php转exe用什么工具打包快_高效打包软件推荐【汇总】
Win10电脑怎么设置网络名称_Windows10注册表NetworkList修改
Windows 10怎么隐藏特定更新补丁_Windows 10使用微软官方工具wushowhide.diagcab
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Windows Defender扫描失败怎么办_安全模块损坏修复方式
如何用正则表达式精确匹配最多含一个换行符的起止片段
PythonWeb前后端整合项目教程_FastAPIReact完整实例
c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】
如何使用Golang开发简单的聊天室消息存储_Golang WebSocket数据持久化方法
C#如何使用XPathNavigator高效查询XML
php485能和物联网模块通信吗_php485对接NB-IoT模块实例【说明】
php下载安装后swoole扩展怎么安装_异步框架支持【汇总】
为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
如何使用Golang捕获并记录协程panic_保证主程序稳定运行
Windows10系统怎么查看运行时间_Win10 CPU正常运行时间查询
Win11开始菜单打不开_修复Windows 11点击开始图标无响应【教程】
Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠
c++中如何使用虚函数实现多态_c++多态性实现原理
Win11怎样安装钉钉客户端_Win11安装钉钉教程【步骤】
如何在 Go 中正确测试带 Cookie 的 HTTP 请求
如何使用正则表达式批量替换重复的“-”模式为固定字符串
php怎么下载安装后设置默认字符集_utf8配置步骤【详解】
Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】
Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式
如何正确访问 Laravel 模型或对象的属性而非调用不存在的方法
2025-12-30
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。