Snap svg:路径变换和相交计算

Snap.svg对原生的svg进行了封装,为svg的创建、操作提供了便捷的方法,但是官网的文档对一些概念没有解释,难免会造成困扰。比如说路径的旋转,就存在变换后得不到路径交点的问题。

用普通的变换得不到路径的相交点

Snap.svg提供了:

  • Matrix.rotate(angle) 方法,将变换矩阵旋转一定角度。
  • Matrix.toTransformString()方法,可以将变换矩阵转成变换字符串
  • Element.transform(transformString)方法,将变换应用到元素

变换矩阵涉及到图形学的内容,可参看3D计算机图形学(原书第三版 ,第一章。

很直接的,我们会想到用这三个函数来实现变换:

let myElem = Snap('.myElem');
let angle = 45 , matrix = new Snap.Matrix();
matrix.rotate(angle);   //变换矩阵旋转45度
myElem.transform(matrix);  //将变换应用到元素

这样确实是可以实现效果的,demo1。但是,这种变换不改变元素的定义,如果用在路径上,将造成路径的计算错误。比如一条路径:(0,0),(400,400),经过上面的变换后,其定义还是(0,0),(400,400),那么此时计算它和其它路径的相交点就会出错。

你可以打开demo1,然后打开console,运行:

Snap.path.intersection($lineA,$lineL2)

查看斜线和第二条平行线的交点,可以看到在拖动lineA过程中,相交点是不变的。

使用map将变换映射到路径

上面那种变换方法用在普通元素上是没问题的,但是用在路径上就会造成计算问题。其实,Snap.svg也提供了Snap.path.map(pathString,transformString)方法,这个方法可以将变换转成路径的定义,放回新的路径定义字符串。所以,我们可以这么用:

let myElem = Snap('.myElem');
let angle = 45 , matrix = new Snap.Matrix();
matrix.rotate(angle);   //变换矩阵旋转45度
let transformString = Snap.path.map($lineA,m);
$lineA.attr('d',transformString);

看demo2,再运行上面的测试,可以用到相交点是动态变化的。

另外,交点的值和路径的宽度是有关系,可以改变demo中路径的宽度试试。

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

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

相关文章

Linux文件基本操作

使用declare命令创建一个变量名为 tmp 的变量: 使用号赋值运算符为变量 tmp 赋值为 dunzhu: 读取变量的值,使用echo命令和$符号($符号用于表示引用一个变量的值,初学者经常会忘记输入) 在dunzhu家目录创建一…

Snap svg 主要对象

对象概述Elementsvg规定的元素,提供修改属性、绑定事件、操作数据、操作层级关系、动画等方面的方法,类似jquery选取的元素Fragment虚拟节点,其用处是可以用js创建多个元素,添加到Fragment,不会影响到实际的DOM&#x…

初中位似图形作图_[如何画位似图形] 位似图形的画法及步骤

如何画位似图形位似变换是新课程标准中涉及的一个重要知识点,它是图形变换的一种,实际上它是相似变换的一种特殊情形,存在位似中心———即对应顶点连线的交点.其位似比就是相似比.作为一个新的知识点,越来…

DES 加密 解密

EncryptUtil feiyangklDES 一行代码完成DES加密,加密模式 DES CBC DEMO GIF DEMO 简介 最近项目中用到DES加密,在这里整理成篇,供大家参考阅读,在使用该demo过程中,你可能会遇到一些问题,首先你需要看一下…

bootstrap带有下拉按钮的输入框_关于bootstrap--表单(下拉select、输入框input、文本域textare复选框checkbox和单选按钮radio)...

html 里面的 role 本质上是增强语义性,当现有的HTML标签不能充分表达语义性的时候,就可以借助role来说明。通常这种情况出现在一些自定义的组件上,这样可增强组件的可访问性、可用性和可交互性。role的作用是描述一个非标准的tag的实际作用。…

CSS3 线性渐变背景的过渡效果

对于background-color,可以直接transition: background-color 2s就能实现过渡效果,但对于background:-webkit-radial-gradient(circle,#ffc71d 0,rgba(168,117,14,.5) 130%);就无能为力了。对于这种复杂的背景,只能给opacity添加过渡效果了&a…

markdown绘图插件----mermaid简介

作者:黄永刚 mermaid简介 当撰写文档的时候,对于流程图的生成大多使用Visio等繁重的工具,没有一种轻便的工具能够画图从而简化文档的编写,就像markdown那样。 mermaid解决这个痛点,这是一个类似markdown语法的脚本语言…

华为三层交换机路由配置案例_华为三层交换机配置实例

1华为三层交换机配置实例一例服务器1双网卡,内网IP:,其它计算机通过其代理上网PORT1属于VLAN1PORT2属于VLAN2PORT3属于VLAN3VLAN1的机器可以正常上网配置VLAN2的计算机的网关为:配置VLAN3的计算机的网关为:即可实现VLAN间互联如果…

大学只待成追忆,只是工作已半年,2016再见

时光匆匆,真的不知不觉,已经毕业半年。这一年发生了好多事,回望简直难以相信。 再见广州,你好厦门 广深工作好找,但心就是想离开,当时想的是,找一个地方,让一切重新开始。来到厦门…

centos7挂载nas存储_CentOS7搭建NAS文件共享存储

概述:NFS是一种基于TCP/IP传输的网络文件系统协议,最初由SUN公司开发。通过NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。NFS得到了如NAS等网络存储的设备极好支持。也是LVS共享存储的首选。环境:CentOS 7.8…

【移动端html5】 android video播放进度精确控制

android上视频播放存在的问题 在PC上播放html5视频,设置video.currentTime5,视频将跳到5s的位置,并且显示出第5s的画面。在安卓下,却存在下面两个问题: 在安卓上,为了省电,在暂停的时候,改变视…

柯理化

在JS中柯里化就是把一个需要传入多个参数的函数变成多个嵌套的只要传入一个参数的函数 在普通函数中的柯理化: var addfunction(x,y){ return xy; } 柯里化: var addCurringfunction(x){ return function(y){ return xy; } } addCurring(1)(2);//3 如果是…

Java NIO 教程

NIO 概述 NIO有三个核心组件: 通道(Channels)缓冲器(Buffers)选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心。至于其它组件,…

threejs相机和渲染器

渲染器 渲染器其实代表的是canvas标签。 渲染器的类型 WebGLRender 使用WebGL来渲染图形,速度较快,但是有些机器不支持WebGL。 CanvasRender 使用canvas2d来渲染图形,在较老的版本上,主要是用来渲染2D图形。现在这个渲染器在…

类的 三大特性 封装,继承,多态 overload与override的区别

OOP三大特性:封装,继承,多态 封装的目的:为了让类更安全封装的做法:1.类里面的成员变量做为private2.使用成员方法来间接访问成员变量3.在该方法里面加限制条件 php类里面不允许出现同名方法 继承 概念:子类…

三级菜单 python_python三级菜单

menu {北京:{海淀:{五道口:{soho:{},网易:{},google:{}},中关村:{爱奇艺:{},汽车之家:{},youku:{},},上地:{百度:{},},},昌平:{沙河:{老男孩:{},北航:{},},天通苑:{},回龙观:{},},朝阳:{},东城:{},},上海:{闵行:{"人民广场":{炸鸡店:{}}},闸北:{火车战:{携程:{}}},浦…

threejs概览

threejs术语和概念 threejs的API很长,有很多概念和术语,理解了这些概念和术语,才能更好的使用threejs。这些概念和术语都藏在API右侧的大纲中,下图简单整理了一下这些概念: 这些概念又分为四个大类(见上图…

C#生成新浪微博短网址 示例源码

using System;using System.Collections.Generic;using System.Linq;using System.Text;using DotNetSample.Models;using System.Web.Script.Serialization;namespace DotNetSample.Utils{public class ShortUrlHelper{/// <summary>/// 获取新浪短域名/// </summary…

leetcode数组汇总_[LeetCode] 300. 最长上升子序列

题目链接&#xff1a; https://leetcode-cn.com/problems/longest-increasing-subsequence难度&#xff1a;中等通过率&#xff1a;43.0%题目描述:给定一个无序的整数数组&#xff0c;找到其中最长上升子序列的长度。示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释:…

threejs创建平面几何形状

创建平面几何形状 平面几何形状有三种&#xff1a;点&#xff0c;线&#xff0c;面三种&#xff0c;下面说说用threejs创建这几种形状的方法。 创建点 创建点可以使用Points类。 function createPoints(){//创建一个Geometry&#xff0c;并添加点let geometry new THREE.G…