SVG之path详解(一),全面解析椭圆弧命令A

news/2024/11/18 7:50:20/文章来源:https://www.cnblogs.com/skmcj/p/18349830

简述

SVG 中的 <path> 元素用于创建路径,它是 SVG 中最强大和最灵活的基本形状之一

使用 <path> 元素可以绘制直线、曲线、弧线等各种复杂的图形,并且可以通过设置路径命令来控制路径的形状和样式

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

基本语法

<pathd="path string"          <!-- 定义路径的路径数据 -->fill="fill-color"        <!-- 路径的填充颜色 -->stroke="stroke-color"    <!-- 路径的描边颜色 -->stroke-width="width"     <!-- 路径的描边宽度 -->
/>

属性解析:

  • d 属性定义了路径的路径数据,即路径命令序列。路径数据由一系列的路径命令组成,每个路径命令以字母开头,后面跟随一组数字参数。常用的路径命令包括:M(移动)、L(直线)、H(水平线)、V(垂直线)、C(三次贝塞尔曲线)、S(光滑三次贝塞尔曲线)、Q(二次贝塞尔曲线)、T(光滑二次贝塞尔曲线)、A(椭圆弧)、Z(闭合路径)等

    每个路径命令都有大写字母(绝对)和小写字母(相对)两种表示方式

  • fill 属性定义了路径的填充颜色

  • stroke 属性定义了路径的描边颜色

  • stroke-width 属性定义了路径的描边宽度

d属性详解

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

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

M

该命令用于移动画笔位置

M | m后可跟2个参数:

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

例:

  • M 100 150表示移动画笔到(100, 150)这一坐标位置
  • m 100 150表示移动画笔到(lx + 100, ly + 150)这一坐标位置,其中lx, ly表示上一命令绘制的结束点

L

该命令用于绘制一条直线

会在当前位置命令描述位置之间绘制一条直线

L | l后可跟2个参数:

  1. x:直线结束点横坐标位置
  2. y:直线结束点纵坐标位置

例:

  • M 50 50 L 125 125表示在(50, 50)(125, 125)之间绘制一条直线

  • M 50 50 l 75 75表示在(50, 50)(50 + 75, 50 + 75)之间绘制一条直线

H

该命令用于绘制一条水平直线

会在当前位置命令描述位置之间绘制一条水平直线

H | h后可跟1个参数:

  • x:水平直线结束点横坐标位置

例:

  • M 50 50 H 125表示在(50, 50)(125, 50)之间绘制一条直线

  • M 50 50 h 75表示在(50, 50)(50 + 75, 50)之间绘制一条直线

V

该命令用于绘制一条垂直直线

会在当前位置命令描述位置之间绘制一条垂直直线

V | v后可跟1个参数:

  • y:垂直直线结束点纵坐标位置

例:

  • M 50 50 V 125表示在(50, 50)(50, 125)之间绘制一条直线

  • M 50 50 v 75表示在(50, 50)(50, 50 + 75)之间绘制一条直线

A

该命令主要用于描述椭圆弧,有两种写法:A(绝对)a(相对)

表示经过起始点(即上一条命令的结束点),到结束点之间画一段椭圆弧

A | a后可跟7个参数:

  1. rx:椭圆的x轴半径(即水平半径)

  2. ry:椭圆的y轴半径(即垂直半径)

    这两个参数好理解,就是椭圆的两条对称轴半径,相等即为圆

    也可以写比例,写比例时默认用符合条件的最小值,此时参数4就没有意义了(会出现下图右侧的情况)

  3. x-axis-rotation:椭圆x轴相对于当前坐标系的旋转角度,以度数表示,顺时针为正

    旋转

  4. large-arc-flag:大弧标志,0表示绘制小弧,1表示绘制大弧。弧线有两个不同的弧度(小于180度的弧和大于180度的弧),该标志用于指定使用哪种弧度,简单理解就是短弧和长弧

  5. sweep-flag:扫掠标志,0表示弧线从起点到终点沿逆时针方向绘制,1表示沿顺时针方向绘制

  6. x: 终点的x坐标

  7. y: 终点的y坐标

参数之间用空格隔开,如:Arx ry x-axis-rotation large-arc-flag sweep-flag x y

例:M50 100 A50 100 0 1 0 150 100

表示:经过(50, 100)这点,画一段x轴为50y轴为100,绕x轴顺时针方向旋转角度为,取长弧,沿逆时针画的一段椭圆弧


绘制流程

以下流程仅用于帮助理解,并不代表底层实际原理

  • 首先,抛开起点终点,通过rxry,我们可以确定一个椭圆

  • 接着,我们确定其旋转角度x-axis-rotation,使其x轴顺时针旋转,假设为30°,可获得下图

    椭圆

  • 接着,我们需要让它经过起点和终点,通过移动椭圆,使其能够经过起点和终点,可能的情况会有4种,如下

    可能的弧

    如上,有两种情况

    第一种,椭圆较大,可经过起点终点,此时可能的弧线有四条,如上图左侧

    第二种,椭圆较小,无法经过起点终点,绘制时会等比放大,使其达到刚好能经过起点终点的状态,可能的弧线依旧会有四条,但有两条重叠(相同),如上图右侧

  • 然后,我们需要通过第45两个参数确定一条唯一的弧

    • 4个参数确定选择的还是
    • 5个参数确定选择顺时针绘制还是逆时针绘制的(从起点到终点),在上图的体现为上下
  • 最后,我们即可确定唯一的一条弧

    • M100 150 A55 100 30 1 1 200 150可能弧1
    • M100 150 A55 100 30 0 1 200 150可能弧2
    • M100 150 A55 100 30 0 0 200 150可能弧3
    • M100 150 A55 100 30 1 0 200 150可能弧4

名词解读

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779994.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AppleScript实现FaceTime数据检测,FaceTime蓝号检测,无痕检测是否开通FaceTime功能

FaceTime是苹果公司iOS和macOS(以前称Mac OS X或OS X)内置的一款视频通话软件,通过Wi-Fi或者蜂窝数据接入互联网,在两个装有FaceTime的设备之间实现视频通话。其要求通话双方均具有装有FaceTime的苹果设备,苹果ID以及可接入互联网的3G/4G/5G或者Wi-Fi网络。一、Windows电脑…

搭建时空基底,建设“数字之城”

在这个日新月异的时代,数字技术正以前所未有的速度重塑我们的世界。今天,让我们一同深入探讨如何通过搭建时空基底,为“数字之城”的建设奠定坚实基础。一、时空基底:数字之城的骨骼与脉络所谓“时空基底”,是指结合时间维度与空间维度的综合性信息框架,它是构建数字城市…

没闲着系列 22

最近下班后,时间还是比较宽松的,相对宽松。 今天更新一下TaskSaas近期有什么变动: 一个就是概览dashboard以及需求、问题的选择中,加入了ALL TODO DONE的分类,更便于查询全部、待做(新建、重新打开、进行中、待反馈)、已完成的分类。第二个是修复了工作台里的一系列bug。…

解决端口号占用问题:Spring Boot报错,Web server failed to start. Port 8080 was already in use.

报错信息:Web server failed to start. Port 8080 was already in use. 报错原因:端口被占用 解决方法: 解决方法一:修改端口 修改配置文件,加上参数:server.port=8014或者在application.yml文件中添加 server:port: 8014在访问时,替换对应的端口号即可 解决方法二:关闭…

Redis连接问题解决汇总

Redis连接失败常见解决方案 1. 检查Redis命令行是否可以正常连接 使用命令行客户端,输入: redis-cli -h 虚拟机ip地址 -p 6379 -a redis访问密码如若连接成功,输入ping,看控制台是否返回PONG此步骤若正常,则代表虚拟机可正常连接 2. Redis命令行无法正常连接 1)未打开Red…

解决Spring报错:Failed to read candidate component class: file [ ]; nested exception is org.

使用IDEA 建立一个很基础的Spring项目时,之前用xml方式,写bean标签一直正常使用,改用注解方式后发现报错,显示: Exception in thread "XXX" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file …

8.8前后端联调

MAC强制关闭进程 因为common和control是分开的 所以是control 如何找到你自己的admin 在历史里面找找 返回的信息码缺少了响应数据 严格控制请求头顺序,否则会错加字段 如果单个ads下只有一个Store的校验逻辑就必须重新考量,或者就必须强一致 如果没有设置怎么校验 如何在低…

字符串part01

今天学了字符产的第一部分:反转字符串,使用双指针。 反转字符串Ⅱ,需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。 数组填充问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。1. 反转字符串 题目:编写一个函数,…

upload-labs第21关分析与答案

upload-labs第21关审计1 第二十一关的参考代码 $is_upload = false; $msg = null; if(!empty($_FILES[upload_file])){//检查MIME$allow_type = array(image/jpeg,image/png,image/gif);if(!in_array($_FILES[upload_file][type],$allow_type)){$msg = "禁止上传该类型文件…

知攻善防Web1应急靶机笔记--详解

知攻善防Web1应急靶机笔记 概述 这是一台知攻善防实验室的应急响应靶机,方便大家练习一下应急响应的流程和操作。 靶机的前景概述:前景需要: 小李在值守的过程中,发现有CPU占用飙升,出于胆子小,就立刻将服务器关机,这是他的服务器系统,请你找出以下内容,并作为通关条件…

Java方法06:递归

A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己,因此我们在设计递归算法时,一定要指明什么时候自己不调用自己。否则,就是个死循环! 递归算法重点: 递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己…

Redis学习笔记_1_基本安装与使用

黑马程序员Redis学习笔记一:Redis基本概念、安装使用、常见命令、Java客户端Redis 入门篇 1 初识Redis Redis是一种 键值型 的 NoSql 数据库键值型:指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json NoSql:相对于传统…