一个应用场景是,点击一条路径,显示该路径的控制点。因为有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="" y="">点击线条</text> <line id="l1" x1="" y1="" x2="" y2="" stroke="red" stroke-width="" />
<line id="l2" x1="" y1="" x2="" y2="" stroke="orange" stroke-width="" transform="rotate(30)" />
<line id="l3" x1="" y1="" x2="" y2="" stroke="yellow" stroke-width="" transform="rotate(60)" />
<line id="l4" x1="" y1="" x2="" y2="" stroke="green" stroke-width="" transform="rotate(90)" />
<line id="l5" x1="" y1="" x2="" y2="" stroke="blue" stroke-width="" transform="rotate(120)" />
<line id="l6" x1="" y1="" x2="" y2="" stroke="purple" stroke-width="" transform="rotate(150)" /> <g transform="translate(100,100)">
<line id="l7" x1="" y1="" x2="" y2="" stroke="purple" stroke-width="" transform="rotate(30)" />
</g> <circle id="c1" cx="" cy="" r="" stroke="green" stroke-width="" fill="none" />
<circle id="c2" cx="469.6" cy="386.6" r="" stroke="green" stroke-width="" 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[], t.x1.baseVal.value, t.y1.baseVal.value, ctm, rootCTM);
showCircle(cs[], 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>

最新文章

  1. SOUI中做的一个磁力吸附效果
  2. ms-dos中 MSCDEX命名语法详解
  3. 如何用Matlab将cell数据写入文件
  4. HTML——meta标签
  5. 《BI那点儿事》三国数据分析系列——蜀汉五虎上将与魏五子良将武力分析,绝对的经典分析
  6. Android-短信验证
  7. 使用C++读取UTF8及GBK系列的文本方法及原理
  8. C++:用成员初始化列表对数据成员初始化
  9. webpack资料
  10. [RxJS] Creation operators: fromEventPattern, fromEvent
  11. bootstrap的导航改造
  12. 2016 Multi-University Training Contest 7 总结
  13. fpga之显示字符串
  14. 《JAVASCRIPT高级程序设计》表单基础知识和文本框脚本
  15. Centos更改镜像源
  16. zTree实现地市县三级级联报错(二)
  17. linux之dos2unix命令
  18. windows下编译php7图形库php_ui.dll
  19. Android应用系列:手把手教你做一个小米通讯录(附图附源码)
  20. ASP.net MVC模式介绍(一)

热门文章

  1. Loadrunner 11安装和破解
  2. JWT签发token
  3. [Docker7]Harbor
  4. 洛谷 P5658 括号树 题解
  5. 3.Scikit-Learn实现完整的机器学习项目
  6. Building Applications with Force.com and VisualForce(Dev401)(七):Designing Applications for Multiple users:Managing your users&#39; experience I
  7. Building Applications with Force.com and VisualForce(Dev401)(十四):Implementing Business Processes:Auditing Processes
  8. JavaScript模块化-CommonJS、AMD、CMD、UMD、ES6
  9. Azure Web: 数据库的创建与数据监控
  10. 基于vue-cli-和element-ui的开发admin(1)