考虑我有以下 HTML5 路径:
var myPath = paper.path([
'M', 0, 0
'L', 100, 100,
'L', 150, 50,
'Z']
]);
myPath.transform(['s', 0.5, 0.5, 0, 0]);
转换(缩放)后,我的路径相应地调整了一半,但检查元素是相同的路径字符串,但应用了转换矩阵。有什么方法可以检索结果的 pathString(比如说 M,0,0,L,50,50,L,75,24,z)。
考虑我有以下 HTML5 路径:
var myPath = paper.path([
'M', 0, 0
'L', 100, 100,
'L', 150, 50,
'Z']
]);
myPath.transform(['s', 0.5, 0.5, 0, 0]);
转换(缩放)后,我的路径相应地调整了一半,但检查元素是相同的路径字符串,但应用了转换矩阵。有什么方法可以检索结果的 pathString(比如说 M,0,0,L,50,50,L,75,24,z)。
我认为您需要 transformPath 方法:http ://raphaeljs.com/reference.html#Raphael.transformPath
唯一的解决方案是使用 Raphael 1.x,它用于修改路径而不是应用转换。否则,您需要编写自己的例程来将应用矩阵转换转换为路径(真的很难)。
有一个函数 flatten_transformations() 可以烘焙(或应用)变换到路径,以便可以删除变换属性。它可以处理所有路径段(也包括弧)。
旧答案(不是那么完整的实现):
当然,有一种方法(例如 JSBIN 中的示例)可以在应用转换后获取结果路径数据。甚至是非常简单的方法。
假设我们有一个 SVG 路径pathDOM
,它是根元素svgDOM
。我们可以使用 native 函数得到路径坐标空间到根元素坐标空间的变换矩阵getTransformToElement()
。它是这样使用的:
var matrix = pathDOM.getTransformToElement(svgDOM);
当我们将此矩阵应用于路径中的所有点时,我们会得到一个新的路径数据,其中所有坐标都相对于根元素。可以这样做:
var pt = svgDOM.createSVGPoint();
pt.x = some_x_coordinate_of_path_data;
pt.y = some_y_coordinate_of_path_data;
var new_point = pt.matrixTransform(matrix); // <- matrix object, which we created earlier
var new_x = new_point.x;
var new_y = new_point.y;
就是这样!转换后可以清空变换属性。
当然,路径中的所有坐标都必须转换为绝对坐标,例如。弧段必须转换为线段或三次段,这两者都可以通过 Raphaël 的path2curve()
函数来实现。
我做了一个在JSBIN中使用这种“扁平化转换”功能的完整功能示例。有一个现成的函数 flatten_transformations(),它是唯一需要的(其余的用于 UI 目的)。该示例有一个嵌套在两个 g 元素内的路径。Path 应用了自己的转换,以及两个 g 元素。目的是测试嵌套转换是否也被展平。
该代码适用于最新的主要浏览器,甚至在 IE9 中。我修改转换的代码是 jQuery、Raphael 和本机代码的相当有趣的组合,这可能是在 IE9 中单击按钮时出现一些问题的原因,但幸运的是,这些基本的本机功能getTransformToElement()
,createSVGPoint()
并且matrixTransform()
在 IE 中也可以按预期工作。我想同时测试这些不同的编码基础是如何一起发挥作用的。因为事实上 Raphael 本身还不够完美,无法处理所有可能的编码需求(缺少样式和组以及无法将 svg 元素附加为文本 xml 数据的可能性只是需要注意的)。