马黑黑 发表于 2023-10-1 07:32

svg : polygon & polyline to path 演示

<style>
.mysvg { border: 1px solid gray; fill: none; stroke: steelblue; }
</style>

<svg class="mysvg" width="200" height="200">
        <polygon id="Poly" points="100 10, 40 190, 190 120, 180 60"></polygon>
</svg>
<svg class="mysvg" width="200" height="200">
        <path id="cPath" d="M10 100 H190"></path>
</svg>
<div id="pathMsg"></div>

<script>

let createPath = (ele) => {
        let path = 'M';
        let points = Poly.getAttribute('points');
        let ar = points.replace(/[^\d.]/g, ',').split(',').filter(Number);
        for(j = 0; j < ar.length; j ++) {
                if(j <= 1) {
                        path += ar + ' ';
                }else{
                        path += j % 2 === 0 ? 'L' + ar + ' ' : ar;
                }
        }
        path += ele.tagName.toLowerCase() === 'polygon' ? 'z' : '';
        return path;
};

cPath.setAttribute('d',createPath(Poly));
pathMsg.innerText = createPath(Poly);

</script>

马黑黑 发表于 2023-10-1 07:33

polygon 和 polyline 都是 svg 基本图形标签,前者用于绘制多边形,后者绘制折线,二者均使用点集 points 描述元素样式,点集即为{xy}坐标集合。转为 d 路径,实现方法之一是将点集放入数组,然后赋值给M、A(a)指令,polygon 是多边形闭合路径,末尾加个 z 即可。


一楼代码:
<style>
.mysvg { border: 1px solid gray; fill: none; stroke: steelblue; }
</style>

<svg class="mysvg" width="200" height="200">
        <polygon id="Poly" points="100 10, 40 190, 190 120, 180 60"></polygon>
</svg>
<svg class="mysvg" width="200" height="200">
        <path id="cPath" d="M10 100 H190"></path>
</svg>
<div id="pathMsg"></div>

<script>

let createPath = (ele) => {
        let path = 'M';
        let points = Poly.getAttribute('points');
        let ar = points.replace(/[^\d.]/g, ',').split(',').filter(Number);
        for(j = 0; j < ar.length; j ++) {
                if(j <= 1) {
                        path += ar + ' ';
                }else{
                        path += j % 2 === 0 ? 'L' + ar + ' ' : ar;
                }
        }
        path += ele.tagName.toLowerCase() === 'polygon' ? 'z' : '';
        return path;
};

cPath.setAttribute('d',createPath(Poly));
pathMsg.innerText = createPath(Poly);

</script>

红影 发表于 2023-10-1 09:01

这个polygon 一下子就看懂了,用 polyline 做路径这个看半天也没明白 。
这4个点最上面的那点是1#,然后逆时针的234吧。

红影 发表于 2023-10-1 09:03

路径里的d="M10 100 H190" 直线是什么意思,任意设的么,然后用数组去替代它?

红影 发表于 2023-10-1 09:08

数组是从前面的多边形里拿过来的吧。
<div id="pathMsg"></div>这个也没看懂,pathMsg指的是什么?

红影 发表于 2023-10-1 09:11

那JS看得我晕晕乎乎的,黑黑却是能一挥而就,厉害。黑黑辛苦了{:4_187:}

马黑黑 发表于 2023-10-1 10:21

红影 发表于 2023-10-1 09:01
这个polygon 一下子就看懂了,用 polyline 做路径这个看半天也没明白 。
这4个点最上面的那点是1#,然后逆 ...

这是根据polygon的点集(points)顺序布局的,polygon怎么设计,路径怎么来

马黑黑 发表于 2023-10-1 10:23

红影 发表于 2023-10-1 09:03
路径里的d="M10 100 H190" 直线是什么意思,任意设的么,然后用数组去替代它?

根据polygon和polyline的点集特性,使用 L 指令去画线最合适。每一个点集都是一组 {x,y} 坐标值,正好对应 L 指令所需要的 {x,y} 坐标

马黑黑 发表于 2023-10-1 10:30

红影 发表于 2023-10-1 09:11
那JS看得我晕晕乎乎的,黑黑却是能一挥而就,厉害。黑黑辛苦了

这只不过是一个for循环,循环过程中,要给 M 赋值,M 需要的点集数据是 points 数据里的第一、二个,所以要做一个判断;往后,步进变量 j 若被 2 整除,则它是 {xy} 点集数据中的 x,反之是 y,这样就能赋值给 L 指令。仅此而已,一个简单的算法。

至于将 points 数据压进数组 ar,这需要一点点小技巧,一是使用正则表达式匹配数字(含浮点数),/[^\d.]/g 这个就是正则表达式,二是要确保点集里的数据都是数字,所以又用了 filter(Number) 进行过滤,将不是数字的东东剔除掉。

红影 发表于 2023-10-1 10:45

马黑黑 发表于 2023-10-1 10:21
这是根据polygon的点集(points)顺序布局的,polygon怎么设计,路径怎么来

哦哦,知道了。

红影 发表于 2023-10-1 10:48

马黑黑 发表于 2023-10-1 10:23
根据polygon和polyline的点集特性,使用 L 指令去画线最合适。每一个点集都是一组 {x,y} 坐标值,正好对 ...

这些线条就是点集的具体表现。

红影 发表于 2023-10-1 10:49

马黑黑 发表于 2023-10-1 10:30
这只不过是一个for循环,循环过程中,要给 M 赋值,M 需要的点集数据是 points 数据里的第一、二个,所以 ...

看了黑黑的讲解,能看懂一些了,谢谢{:4_187:}

亦是金 发表于 2023-10-1 11:28

你们师徒聊的这么欢,我却是云里雾里的,没有看懂!只能飘过!
请红影做一个其他形状路径的播放器,让我学习欣赏模仿!{:4_187:}

马黑黑 发表于 2023-10-1 13:24

红影 发表于 2023-10-1 10:45
哦哦,知道了。

{:4_190:}

马黑黑 发表于 2023-10-1 13:25

红影 发表于 2023-10-1 10:48
这些线条就是点集的具体表现。

{:4_181:}

马黑黑 发表于 2023-10-1 13:25

红影 发表于 2023-10-1 10:49
看了黑黑的讲解,能看懂一些了,谢谢

{:4_180:}

马黑黑 发表于 2023-10-1 13:25

亦是金 发表于 2023-10-1 11:28
你们师徒聊的这么欢,我却是云里雾里的,没有看懂!只能飘过!
请红影做一个其他形状路径的播放器,让我学 ...

{:4_199:}

红影 发表于 2023-10-1 22:12

马黑黑 发表于 2023-10-1 13:24


问好黑黑,谢茶{:4_187:}

红影 发表于 2023-10-1 22:16

亦是金 发表于 2023-10-1 11:28
你们师徒聊的这么欢,我却是云里雾里的,没有看懂!只能飘过!
请红影做一个其他形状路径的播放器,让我学 ...

线条的非常简单,只是把各个点的坐标写好,就按自己想要的路径走了啊。
黑黑的这个不但用polygon直接生成,也弄了点集赋值的方式,后面这个更难,我还没完全学会{:4_173:}

红影 发表于 2023-10-1 22:17

马黑黑 发表于 2023-10-1 13:25


还是不带JS的这个更简单{:4_173:}
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: svg : polygon & polyline to path 演示