同步发布:https://blog.jijian.link/2020-04-14/svg-arc/

由于功能受限,此处不能放 iframe 嵌入链接,如需看到实时效果,请移步 https://blog.jijian.link/2020-04-14/svg-arc/

解析

<path> 标签应该算是 SVG 中最为强大的标签了,各种图形都可以用他绘制。

本文使用 path 标签的贝塞尔曲线 Q 指令绘制弧线。

用法

<path d="M30 90 Q115 139 200 90"></path>

<path> 标签常用指令:

  • M = moveto
  • L = lineto
  • H = horizontal lineto
  • V = vertical lineto
  • C = curveto
  • S = smooth curveto
  • Q = quadratic Belzier curve
  • T = smooth quadratic Belzier curveto
  • A = elliptical Arc
  • Z = closepath

注释:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。

绘制线条

常见效果:绘制实线、绘制虚线、绘制弧线、绘制渐变线条、绘制箭头线条。

源码:

<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
<defs>
<!-- 箭头 -->
<marker id="arrow" markerUnits="strokeWidth" markerWidth="12" markerHeight="12" viewBox="0 0 12 12" refX="6" refY="6" orient="auto">
<path d="M2,2 L10,6 L2,10 L6,6 L2,2" style="fill: #000000;"/>
</marker>
<linearGradient id="line-gradient" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#990000" stop-opacity="0" />
<stop offset="1" stop-color="#990000" stop-opacity="1" />
</linearGradient>
</defs>
<!-- 实线 -->
<path class="line" d="M30 30 L200 30"></path>
<!-- 虚线 -->
<path class="line" d="M30 60 L200 60" style="stroke-dasharray: 5;"></path> <!-- 弧线 -->
<path class="line" d="M30 90 Q115 139 200 90"></path>
<!-- 渐变线条 -->
<path class="line" d="M30 120 Q115 169 200 120" style="stroke: url(#line-gradient)"></path>
<!-- 箭头线条 -->
<path class="line" d="M30 150 Q115 199 200 150" style="marker-end:url(#arrow)"></path> <!-- 无浏览器润色的线条,有锯齿像素 -->
<path class="line" d="M30 180 Q115 229 200 180" style="shape-rendering: optimizeSpeed;"></path>
</svg>

实际应用

实际应用场景不一定会有详细坐标点,需要我们根据已有条件去计算。

比如:已有开始左边和结束坐标,根据这两个坐标绘制一条弧线。

SVG 绘制弧线:

<path d="M30 90 Q115 139 200 90"></path>

M30 90 :表示开始点 x:30 y:90
Q115 139 :表示控制点在 x:115 y:139
200 90 :表示结束点 x:200 y:90

计算控制点图解:

换算为 JS 算法:

const pos = getPosition ({left: 30, top: 90}, {left: 200, top: 90}, 30);
console.log(pos); // [{"x":115,"y":139},{"x":115,"y":41}]
function getPosition (dot1, dot2, angle) {
var x1 = dot1.left;
var y1 = dot1.top;
var x2 = dot2.left;
var y2 = dot2.top;
var PI = Math.PI; // 两点间的x轴夹角弧度
var xAngle=Math.atan2((y2-y1), (x2-x1));
// 转为角度
xAngle = 360*xAngle/(2*PI);
// 两点间的长度
var L=Math.sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
// 计算等腰三角形斜边长度
var L2 = L/2 / Math.cos(angle* 2*PI/360); // 求第一个顶点坐标,位于下边
var val1={};
// 求第二个顶点坐标,位于上边
var val2={};
val1['x']=x1+Math.round(L2 * Math.cos((xAngle+angle)* 2*PI/360));
val1['y']=y1+Math.round(L2 * Math.sin((xAngle+angle)* 2*PI/360));
val2['x']=x1+Math.round(L2 * Math.cos((xAngle-angle)* 2*PI/360));
val2['y']=y1+Math.round(L2 * Math.sin((xAngle-angle)* 2*PI/360)); return [val1,val2];
}

应用场景:

总结:path 运用远不止此,比如常见的字体图标,SVG 图标等,都可见 path 标签运用,一些炫酷的动画效果也可以使用 path 标签实现。

SVG path 标签根据两点和角度绘制弧线的更多相关文章

  1. SVG Path标签 A 参数

    A rx ry x-axis-rotation large-arc-flag sweep-flag x yrx:x轴半径ry:y轴半径x-axis-rotation:指椭圆的X轴与水平方向顺时针方向夹 ...

  2. SVG path d Attribute

    Scalable Vector Graphics (SVG) 1.1 (Second Edition) W3C Recommendation 16 August 2011 http://www.w3. ...

  3. SVG Path高级教程

    课程分为四个方面: 1. Path概述 2. 移动和直线命令 3. 弧线命令 4. 贝塞尔曲线命令 Path概述 <path> 标签用来定义路径,Path字符串是由命令及其参数组组成的字符 ...

  4. SVG path

    在网页上画一图形,比如星星或波浪线,开始是想着图形软件画一个的,后来发现SVG这绘图程序的语言,感觉甚是可以,就发了些时间学了一下,在此做一简单分享和记录. 菜鸟上是这么介绍的(SVG 是使用 XML ...

  5. svg path详解

    svg的<path>标签具有强大的功能,主要包括以下命令 M(move to) 参数:x,y L(line to) 参数:x,y H 参数:x V 参数:y C S Q T Z 参考:

  6. SVG PATH 生成器

    参考网站:http://dayu.pw/svgcontrol/ 主要功能:手动可视化生成 SVG图片PATH路径. 效果如下: 代码如下: <!DOCTYPE html> <!-- ...

  7. SVG Path路径使用(一)

    一.<path> 标签 <path> 标签用来定义路径. 下面的命令可用于路径数据: M = moveto L = lineto H = horizontal lineto V ...

  8. 使用SVG Path绘图

    最近一个项目,需要做个Web版本的设计器,用来进行工厂流水线布局的设计. 项目中采用了SVG.JS来做,但是以前流水线是采用单纯的画线的方式实现.客户提出希望用不同的底纹表示不同的流水线,经过一番调查 ...

  9. SVG辅助标签

    前面的话 本文将详细介绍SVG辅助标签 超链接 在SVG中,可以使用超链接<a>.超链接可以添加到任意的图形上,类比于热区<area> SVG中的超链接有如下3个常用属性 xl ...

  10. svg image标签降级技术

    1.svg image标签降级技术: svg不能很好的在anroid2.3中得到支持,需要额外的补充,IE8-以及Android 2.3默认浏览器是不支持SVG的. svg image标签降级技术,这 ...

随机推荐

  1. Kerberos认证代码分析Can't get Kerberos realm

    1. Can't get Kerberos realm 原因分析: 原始代码为: 1 2 org.apache.hadoop.security.UserGroupInformation.setConf ...

  2. Mac中nginx的默认安装路径和启动方式

    1.安装完以后,可以在终端输出的信息里看到一些配置路径: /usr/local/etc/nginx/nginx.conf (配置文件路径) /usr/local/var/www (服务器默认路径) / ...

  3. Netty 缓存buffer介绍及使用

    每当你需要传输数据时,它必须包含一个缓冲区.Java NIO API 自带的缓冲区类是相当有限的,没有经过优化,使用 JDK 的ByteBuffer 操作更复杂.缓冲区是一个重要的组建,它是 API的 ...

  4. IntelliJ IDEA生成jar包运行报Error:A JNI error has occurred,please check your installation and try again

    首先介绍一下IntelliJ IDEA生成jar包的方式: 1.打开项目,打开FIile->Project Structure...菜单.如下图: 选中Artifacts,点+号,选择JAR,再 ...

  5. 龙哥量化:缠中说禅(缠论)K线包含处理

    声明:看到研究非常细致深入的文章,转载到我的博客园,以便学习和研究. (转载知乎的DennisWin) 缠中说禅技术理论包括两大部分:缠论形态学和缠论动力学.其中形态学是根本,动力学是辅助.缠论形态学 ...

  6. Qt/C++音视频开发46-音视频同步保存到MP4

    一.前言 用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可.最难的是在播放过程中 ...

  7. hhhhhhomework 验证码界面(非全部自己完成)

    import javax.swing.*;//import 代表"引入" //javax.swing 代表"路径" (在javax文件夹下的swing文件夹) ...

  8. Java网约车项目实战:实现抢单功能详解

    在网约车项目中,抢单功能是非常关键的一部分,它决定了司机能否及时响应乘客的订单,提高整个平台的运营效率.本文将详细介绍如何使用Java来实现网约车项目的抢单功能,并提供一个完整的代码示例,以便读者能够 ...

  9. IntelliJ IDEA安装与配置(支持最新2020.2)

    前言 我是从eclipse转IDEA的,对于习惯了eclipse快捷键的我来说,转IDEA开始很不习惯,IDEA快捷键多,组合多,记不住,虽然可以设置使用eclipse的快捷键,但是总感觉怪怪的.开始 ...

  10. Windows7系统启用ipv6的详细步骤(图文)

    IPV6是IETF设计的用于替代现行版本IP协议(IPv4)的下一代IP协议.一般情况下,win7系统默认是关闭IPV6服务的,之前教程也有分享过win7禁用ipv6协议的方法.那么如果要启用ipv6 ...