首页 > 其他分享 >SVG之Path路径详解(二),全面解析贝塞尔曲线

SVG之Path路径详解(二),全面解析贝塞尔曲线

时间:2024-08-08 22:17:34浏览次数:13  
标签:终点 SVG 曲线 贝塞尔 命令 控制点 位置 Path

前言

如果没看过上一篇文章,可以点击链接前往观看,循序渐进,体验更佳

在进入正题前,先温习一下svg的坐标系,x轴为水平向右,y轴为垂直向下

在前一篇文章中,我们已经了解了d属性的M、L、H、V、A命令,接下来,将继续了解剩下命令

d属性详解

主要定义了路径的路径数据,由描述路径的一系列命令数据组成

命令数据主要由命令及命令参数组成,多个命令参数之间可用空格或逗号(英文逗号)隔开

Q

该命令用于画二次贝塞尔曲线

Q | q后可跟4个参数:

  1. x1:控制点横坐标位置
  2. y1:控制点纵坐标位置
  3. x:终点横坐标位置
  4. y:终点纵坐标位置

四个参数两两一组,表示两组坐标,分别表示控制点坐标和终点坐标

一条二次贝塞尔曲线其实就是由起点控制点终点三点经过某种规律运算决定的,其中,起点由上一次绘制的结束点决定

其数学公式为:\(B(t)=(1-t)^2P\alpha +2t(1-t)P\beta +t^2P\gamma ,t\in [0,1]\)

本质上,是一系列点的集合

如下是一条二次贝塞尔曲线的绘制过程动画:

curve-2

接下来提取其中一帧进行标注分析,如下

二次贝塞尔p

一条贝塞尔曲线由如图所示的一系列目标点Bt组成

目标点Bt又由QaQb两点决定,其为两点连线的$\frac{t}{1} \(**处的点,其中**\)t\in [0,1]$

Qa起点控制点决定,Qb控制点终点决定,均为两点连线的$\frac{t}{1} $处的点

故可总结得,贝塞尔曲线的绘制过程为:

  • \(t\in [0,1]\)中,每次取相邻两点连线的\(\frac{t}{1}\)处作为新的控制点

  • 得出的新控制点继续取相邻两点连线的\(\frac{t}{1}\)处作为接下来的新控制点

  • 以此递归,最终得出唯一的一个新控制点,即为组成贝塞尔曲线的点

起点与终点不之间不需要连线计算

该流程也适用于高阶贝塞尔曲线

用二次贝塞尔曲线论证,个点经过一次运算即可得出个新控制点,用新控制点再进行一次运算即可得出唯的控制点,算出每个\(t\in [0,1]\)下唯一的控制点,其集合成的线即为二阶贝塞尔曲线

当然,以上只是为了帮助认识贝塞尔曲线的生成过程,知其然,也知其所以然,如不想了解也是可以正常使用贝塞尔曲线的

言归正传,以下给出几条命令的示例:

  • <path M100 450 Q300 150 500 450 />
  • <path M100 450 Q240 200 500 450 />

如想知道命令长啥样,可自行在svg文件内运行查看

T

该命令用于画平滑二次贝塞尔曲线

T | t后可跟2个参数:

  1. x:终点横坐标位置
  2. y:终点纵坐标位置

其实,该命令本质上也是用于画二次贝塞尔曲线,可以算是Q命令的简化版

只需要一个终点坐标即可生成曲线,但其实际上依旧由起点控制点终点三点生成,其中,控制点由上一次绘制的控制点关于其终点中心对称生成

故,T命令只能接在QT命令后使用,如单独出现或接于其它命令后出现,控制点会与其起点一致,绘制的效果会是一条直线

T

上图是一条曲线路径的示例图,由一次Q和两次T命令组成,其中T命令只需给出终点坐标即可,控制点2控制点1终点1中心对称生成,控制点3控制点2终点2中心对称生成

例:<path d="M50 300 Q 160 180 240 270 T400 370 T500 240" fill="none" stroke="red" />

C

该命令用于画三次贝塞尔曲线

C | c后可跟6个参数:

  1. x1:控制点1横坐标位置
  2. y1:控制点1纵坐标位置
  3. x2:控制点2横坐标位置
  4. y2:控制点2纵坐标位置
  5. x:终点横坐标位置
  6. y:终点纵坐标位置

三次贝塞尔曲线比二次贝塞尔曲线多一个控制点控制,故有6个参数

即其由起点控制点1控制点2终点决定生成,生成方式与上方二次贝塞尔曲线讲的方式类似

数学公式为:\(B(t)=(1-t)^3P\alpha +3t(1-t)^2P\beta +3t^2(1-t)P\gamma +t^3P\delta ,t\in [0,1]\)

以下是一条普通三次贝塞尔曲线的生成过程动画:

curve-3

具体的描述不再赘述

S

该命令用于画平滑三次贝塞尔曲线

S | s后可跟4个参数:

  1. x1:控制点2横坐标位置
  2. y1:控制点2纵坐标位置
  3. x:终点横坐标位置
  4. y:终点纵坐标位置

其为C命令的简化版,只需指定一个控制点2和终点坐标即可

但其本质依旧是画三次贝塞尔曲线,实际上还是由起点控制点1控制点2终点决定生成,其中,控制点1由上一次绘制的控制点关于其终点中心对称生成(即根据前一条命令的控制点2关于前一条命令的终点中心对称决定)

C

上图是一条曲线路径的示例图,由一次C和两次S命令组成,其中S命令只需给出控制点2终点坐标即可,控制点b1控制点a2终点a中心对称生成,控制点c1控制点b2终点b中心对称生成

例:<path d="M50 300 C 160 180 240 210 300 300 S400 370 500 240 S660 160 700 300" fill="none" stroke="red" />

Z

该命令用于闭合路径,大小写字母均可,后面不需跟参数

命令会从当前位置到起点画一条直线闭合整个path

一般放在d属性命令数据的最后

名词解读

绝对: 指数值针对坐标系绝对

相对: 指数值针对上一点相对

对于d属性的命令,通常有大写字母和小写字母两种,大写表绝对,小写表相对

贝塞尔曲线: 是一种数学曲线,它拥有 灵活、平滑、可编辑 的特点,十分适合描述曲面形状、处理图形变形、模拟运动轨迹等场景

公众号-代码杂谈

标签:终点,SVG,曲线,贝塞尔,命令,控制点,位置,Path
From: https://www.cnblogs.com/skmcj/p/18349854

相关文章

  • c# svg转Bitmap Bitmap转ImageSource
    需要安装nuget包【svg】publicclassSVGHelper{publicstaticImageSourceConvertSvgToDrawingImage(stringpath){varsvgContent=File.ReadAllText(path);//使用SvgDocument解析SVG内容SvgDocumentsvgDoc......
  • SVG之path详解(一),全面解析椭圆弧命令A
    简述SVG中的<path>元素用于创建路径,它是SVG中最强大和最灵活的基本形状之一使用<path>元素可以绘制直线、曲线、弧线等各种复杂的图形,并且可以通过设置路径命令来控制路径的形状和样式在进入正题前,先温习一下svg的坐标系,x轴为水平向右,y轴为垂直向下基本语法<path......
  • golang基础-工作区和gopath
    gobuild命令一些可选项的用途和用法在运行gobuild命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。如果要强制编译它们,可以在执行命令的时候加入标记-a。此时,不但目标代码包总是会被编......
  • 爬虫中XPath的应用与元素定位
    在爬虫开发中,XPath是一种强大的语言,用于在XML和HTML文档中查找信息。它允许开发者通过定义路径表达式来选取文档中的节点或节点集。在网页爬虫中,XPath常用于精确定位和提取页面上的数据。本文将详细介绍XPath的基础语法、常见用法以及如何在爬虫中利用XPath获取页面元素。......
  • xpath详解
    什么是Xpath?Xpath是一种用在XML文档中定位元素的语言,同样也支持HTML元素的解析。所谓Xpath,是指XMLpathlanguage。path就是路径,那么Xpath主要是通过路径来查找元素。我们通过下面一张小图来了解一下HTML中的结构:HTML的结构就是树形结构,HTML是根节点,所有的......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-64 - Canvas和SVG元素推拽
    1.简介今天宏哥分享的在实际测试工作中很少遇到,比较生僻,如果突然遇到我们可能会脑大、懵逼,一时之间不知道怎么办?所以宏哥这里提供一种思路供大家学习和参考。2.SVG简介svg也是html5新增的一个标签,它跟canvas很相似。都可以实现绘图、动画。但是svg绘制出来的都是矢量图,不像canv......
  • 为什么“pytest_addoption”钩子不使用配置的“testpaths”运行?
    摘要:我正在尝试使用pytest_addoption功能设置自定义pytest选项。但是当在使用所述自定义选项时尝试使用project.toml文件配置我的项目时,我得到出现以下错误:$pytest--foofooERROR:usage:pytest[options][file_or_dir][file_or_dir]......
  • LeetCode 1631. Path With Minimum Effort
    原题链接在这里:https://leetcode.com/problems/path-with-minimum-effort/description/题目:Youareahikerpreparingforanupcominghike.Youaregiven heights,a2Darrayofsize rowsxcolumns,where heights[row][col] representstheheightofcell (row,c......
  • 爬虫:xpath高级使用,bs4使用,bs4-css选择器
    xpath高级使用fromlxmlimportetree#由于本次要格式化的内容是一个文件,所以用parse,如果是一个html格式的字符串就用HTMLhtml=etree.parse('02_xpath.html')#可以连接多个但是每两个之间要用一个管道符来连接#print(html.xpath('//ol/li[@data="one"]/text()|......
  • Python 将Word转换为JPG、PNG、SVG图片
    将Word文档以图片形式导出,既能方便信息的分享,也能保护数据安全,避免被二次编辑。文本将介绍如何使用 Spire.DocforPython 库在Python程序中实现Word到图片的批量转换。Python将Word转换为JPG、JPEG、PNG、BMP等图片格式Python将Word文档转换为SVG格式 Python库安装: ......