`
piperzero
  • 浏览: 3471434 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

使用SVG内置API计算图形或点经过transform之后的新坐标

 
阅读更多

一个应用场景是,点击一条路径,显示该路径的控制点。因为有transform变形(平移、缩放、倾斜、旋转等变换),所以获取变形后的新坐标需要计算。

纯数学的方法,就是用2D变换矩阵的一些公式去运算,过程稍微有点复杂。

不过好在SVG已经提供了丰富的API将一些矩阵运算封装了,非常实用,下面是Demo.svg代码.

知识点:getScreenCTM() matrixTransform()

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg">
<title>ctm</title>

<text x="100" y="100">点击线条</text>

<line id="l1" x1="200" y1="100" x2="600" y2="100" stroke="red" stroke-width="8" />
<line id="l2" x1="200" y1="100" x2="600" y2="100" stroke="orange" stroke-width="8" transform="rotate(30)" />
<line id="l3" x1="200" y1="100" x2="600" y2="100" stroke="yellow" stroke-width="8" transform="rotate(60)" />
<line id="l4" x1="200" y1="100" x2="600" y2="100" stroke="green" stroke-width="8" transform="rotate(90)" />
<line id="l5" x1="200" y1="100" x2="600" y2="100" stroke="blue" stroke-width="8" transform="rotate(120)" />
<line id="l6" x1="200" y1="100" x2="600" y2="100" stroke="purple" stroke-width="8" transform="rotate(150)" />

<g transform="translate(100,100)">
    <line id="l7" x1="200" y1="100" x2="600" y2="100" stroke="purple" stroke-width="20" transform="rotate(30)" />
</g>

<circle id="c1" cx="123" cy="186" r="28" stroke="green" stroke-width="10" fill="none" />
<circle id="c2" cx="469.6" cy="386.6" r="28" stroke="green" stroke-width="10" fill="none" />

<script type="text/javascript"><![CDATA[
var root = document.documentElement;
var ls=document.getElementsByTagName("line");
var cs=document.getElementsByTagName("circle");

document.addEventListener('click',showCs,false);

function showCs(e){
    var t=e.target;
    if(t.tagName!=='line')return;
    var ctm = t.getScreenCTM();
    var rootCTM = root.getScreenCTM();
    showCircle(cs[0], t.x1.baseVal.value, t.y1.baseVal.value, ctm, rootCTM);
    showCircle(cs[1], t.x2.baseVal.value, t.y2.baseVal.value, ctm, rootCTM);
}

function showCircle(c,x,y,ctm,rootCTM){
    var pt1 = root.createSVGPoint();
    pt1.x = x;
    pt1.y = y;
    var pt2 = pt1.matrixTransform(rootCTM.inverse().multiply(ctm));
    //pt2 = pt1.matrixTransform(ctm).matrixTransform(rootCTM);
    c.cx.baseVal.value = pt2.x;
    c.cy.baseVal.value = pt2.y;
}

]]>
</script>
</svg>

一个应用场景是,点击一条路径,显示该路径的控制点。因为有transform变形(平移、缩放、倾斜、旋转等变换),所以获取变形后的新坐标需要计算。

纯数学的方法,就是用2D变换矩阵的一些公式去运算,过程稍微有点复杂。

不过好在SVG已经提供了丰富的API将一些矩阵运算封装了,非常实用,下面是Demo.svg代码.

知识点:getScreenCTM() matrixTransform()

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg">
<title>ctm</title>

<text x="100" y="100">点击线条</text>

<line id="l1" x1="200" y1="100" x2="600" y2="100" stroke="red" stroke-width="8" />
<line id="l2" x1="200" y1="100" x2="600" y2="100" stroke="orange" stroke-width="8" transform="rotate(30)" />
<line id="l3" x1="200" y1="100" x2="600" y2="100" stroke="yellow" stroke-width="8" transform="rotate(60)" />
<line id="l4" x1="200" y1="100" x2="600" y2="100" stroke="green" stroke-width="8" transform="rotate(90)" />
<line id="l5" x1="200" y1="100" x2="600" y2="100" stroke="blue" stroke-width="8" transform="rotate(120)" />
<line id="l6" x1="200" y1="100" x2="600" y2="100" stroke="purple" stroke-width="8" transform="rotate(150)" />

<g transform="translate(100,100)">
    <line id="l7" x1="200" y1="100" x2="600" y2="100" stroke="purple" stroke-width="20" transform="rotate(30)" />
</g>

<circle id="c1" cx="123" cy="186" r="28" stroke="green" stroke-width="10" fill="none" />
<circle id="c2" cx="469.6" cy="386.6" r="28" stroke="green" stroke-width="10" fill="none" />

<script type="text/javascript"><![CDATA[
var root = document.documentElement;
var ls=document.getElementsByTagName("line");
var cs=document.getElementsByTagName("circle");

document.addEventListener('click',showCs,false);

function showCs(e){
    var t=e.target;
    if(t.tagName!=='line')return;
    var ctm = t.getScreenCTM();
    var rootCTM = root.getScreenCTM();
    showCircle(cs[0], t.x1.baseVal.value, t.y1.baseVal.value, ctm, rootCTM);
    showCircle(cs[1], t.x2.baseVal.value, t.y2.baseVal.value, ctm, rootCTM);
}

function showCircle(c,x,y,ctm,rootCTM){
    var pt1 = root.createSVGPoint();
    pt1.x = x;
    pt1.y = y;
    var pt2 = pt1.matrixTransform(rootCTM.inverse().multiply(ctm));
    //pt2 = pt1.matrixTransform(ctm).matrixTransform(rootCTM);
    c.cx.baseVal.value = pt2.x;
    c.cy.baseVal.value = pt2.y;
}

]]>
</script>
</svg>

分享到:
评论

相关推荐

    svg图形编辑器svgsvg

    svg图形编辑器svg图形编辑器svg图形编辑器svg图形编辑器svg图形编辑器svg图形编辑器svg图形编辑器

    SVG实现流程建模图形化

    本人原创流程建模图形化配置DEMO,基于js控制、SVG标签展示,推荐使用Chrom浏览器演示。提供未加密的源代码,诸君可自行学习领悟。

    SVG基本图形元素.pdf

    SVG( Scalable Vector Graphics),即可缩放矢量图形, 是基于XML( Extensible Markup Language) 描述二维矢量图形的标记语言,由World Wide Web Consortium( W3C联盟,即万维网 联盟) 自1999年开始开发的开放...

    使用SVG图元绘制图形文件.zip

    Qt5中使用SVG图元绘制图形文件,并实现单个图元缩放、翻转、拖拽等

    SVG可缩放矢量图形教程

    SVG是W3C(World Wide Web ConSor—tium国际互联网标准组织)在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网络矢量图形标准。SVG严格遵从XML语法,并用文本格式的描述性语言来描述图像内容,因此是一种和...

    SVG JS api

    svg api(JavaScript) 这个文档比较详细

    SVG可伸缩向量图形介绍

    可伸缩向量图形介绍SVG 可伸缩向量图形介绍SVG 可伸缩向量图形介绍SVG 可伸缩向量图形介绍SVG 可伸缩向量图形介绍SVG

    电力SVG图形浏览程序源代码

    自己工作外时间写的一个svg图形显示程序,带源代码放出,详细的说明可看我的博客.南瑞的open3000导出的svg图形是支持的.在data/graph目录下带一张工程中的svg图,大家可以看看效果.

    wmf2svg-0.9.8-API文档-中文版.zip

    赠送jar包:wmf2svg-0.9.8.jar; 赠送原API文档:wmf2svg-0.9.8-javadoc.jar; 赠送源代码:wmf2svg-0.9.8-sources.jar; 赠送Maven依赖信息文件:wmf2svg-0.9.8.pom; 包含翻译后的API文档:wmf2svg-0.9.8-javadoc-...

    基于SVG矢量图形格式浏览器绘图工具的设计与实现

    基于SVG矢量图形格式浏览器绘图工具的设计与实现,王春奎,文福安,近年来,网络教学平台发展迅速,其功能得到不断的加强和完善。但是由于浏览器在图形处理方面存在一些不足,这给教师在线编辑多媒

    HTML5 SVG图形变形效果

    这是一款HTML5 SVG图形变形效果。示例中展示了几种在网页上的SVG图形变形效果。包括鼠标hover指定元素时SVG图形变形效果等。

    SVG常用图形基础学习资料

    SVG:scalable vector graphics 可缩放矢量图形 SVG常用图形基础学习资料

    简单的 SVG 实例(基本图形: 点、线、园、旋转等)

    几个冗到一起的 SVG 例子,可以学习参考使用。建议下载后分成多个网页,不然看着有点晕。

    SVG图形编码工具

    SVG图形编码工具

    SVG3DBuilder该框架旨在使用SVG创建3D模型并提供简洁的API

    SVG 3D Builder - 该框架旨在使用SVG创建3D模型并提供简洁的API

    jaxb-svg11-1.0.2-API文档-中文版.zip

    Maven坐标:org.plutext:jaxb-svg11:1.0.2; 标签:plutext、svg11、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    使用SVG图元绘制图形文件.zip.zip

    使用SVG图元绘制图形文件.zip.zip

    把svg格式图形转成xaml格式

    把svg格式图形转成xaml格式的源码,用于wpf和silverlight

    SVG,即可缩放矢量图形

    SVG,即可缩放矢量图形 (Scalable Vector Graphics),是一种基于XML的开放SVG,即可缩放矢量图形 (Scalable Vector Graphics),是一种基于XML的开放网络标准,用于描述二维的矢量图形。它于1999年诞生,其语法与XML...

    svg-t 图形 指南

    关于手机SVG-T 图形格式 基本信息, NOKIA DORUM发布的说明性文章.

Global site tag (gtag.js) - Google Analytics