Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python svg路径上的采样点_Python_Svg_Vector Graphics - Fatal编程技术网

Python svg路径上的采样点

Python svg路径上的采样点,python,svg,vector-graphics,Python,Svg,Vector Graphics,给定一个SVG(包含一个path对象),我想将路径划分为n个等长的段。返回的值应该是光栅化svg中的(n+1)点(x,y)坐标列表,指示每个段的端点 例如: 给定SVG:(此示例只有直线,但解决方案必须适用于所有类型的路径,包括三次和二次贝塞尔) 呈现为 预期输出:以左下角为原点的每个红点的坐标。SVG始终以宽度=100px呈现 我正在使用python和svgpathtools,如何实现这一点 我的做法: 看看SVG光栅化器。看看他们是如何处理路径的。我看了一下,但遗憾的是,我无法理解代

给定一个SVG(包含一个path对象),我想将路径划分为n个等长的段。返回的值应该是光栅化svg中的(n+1)点(x,y)坐标列表,指示每个段的端点

例如:

给定SVG:(此示例只有直线,但解决方案必须适用于所有类型的路径,包括三次和二次贝塞尔)


呈现为

预期输出:以左下角为原点的每个红点的坐标。SVG始终以宽度=100px呈现

我正在使用python和
svgpathtools
,如何实现这一点

我的做法:

  • 看看SVG光栅化器。看看他们是如何处理路径的。我看了一下,但遗憾的是,我无法理解代码,无法自己实现它
  • 在我的路径中添加一个
    笔划数组
    <代码>笔划dasharray将自动将连续笔划“打断”为大小相等的段。然后将修改后的SVG光栅化,然后使用类似OpenCV的方法对渲染笔划进行聚类。然后找到这些簇的中点以得到答案。由于涉及多个缓慢的过程(光栅化+聚类),这种方法非常缓慢。如果路径与自身交叉(无穷符号),它也不是很灵活,因为
    笔划dasharray
    也会相交,给出一个奇怪的交点
  • 我看了一下,但我不确定在我的情况下,SVG总是以宽度=100px(根据SVG的纵横比自动计算的高度)渲染,而且这里提到的方法据说是“慢”的。此外,我不确定这个链接问题是否为我提供了路径上的点或svg路径的控制点
  • 虽然方法2适用于许多图像,但我当然不想这样做,因为它非常慢。有更好的方法吗

    给定一个SVG(包含一个路径对象),我想划分 将路径分成等长的n段

    当满足两个条件时,我使用了圆点外观的效果:

  • 属性
    stroke dasharray=“(0,N)”
  • stroke lineCap=“round”
  • 我使用
    getTotalLength()
    JS方法获取SVG元素的完整行长度

    正如您在控制台中看到的,结果是~=
    577.2px

    假设我们需要将直线的长度分成11个相等的段:

    577,2/11=52.47
    在这种情况下,
    stroke dasharray=“0,52.47”

    
    console.log(p1.getTotalLength()/11);
    
    这似乎很有希望,在接受这一最终结果之前,我将尝试更多的SVGanswer@ashutoshbsathe感谢您的积极反馈。在繁忙的一周里,ideaHi@Alexandr_TT一直在运行,所以现在还不能彻底测试它,如果能为ideaHi@Alexandr_TT投票就好了。这似乎对我在这里发布的示例有效。我测试的其他示例(根本不起作用)是我公司的机密财产,我将尝试在其他没有版权的地方找到类似的图片并发布here@ashutoshbsathe我理解你。我将等待你的例子。我现在增加了新的例子。看这里please@ashutoshbsathe
    我将尝试在其他没有版权的地方找到类似的图像,并将其发布到此处
    -您如何找到合适的路径?
    <svg height="210" width="400">
      <path d="M150 0 L75 200 L225 200 Z" fill="none" stroke="black" stroke-width="4" />
    </svg>