- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将包含折线的基本 SVG 文件转换为 sketch-rnn 使用的stroke-3 格式(和 quickdraw dataset )。
据我了解,stroke-3 格式的每个折线点将是:
[delta_x, delta_y, pen_up]
, 其中 delta_x
, delta_y
表示相对于坐标pen_up
当笔抬起时有点为 1move_to
操作 a-la 海龟图形)或 0 当笔处于line_to
操作 a-la 海龟图形)。 <?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 900 900" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#00c000" stroke-linecap="round"><path d="m324.56 326.77h62.721 62.721 62.721 62.721"/><path d="m575.44 326.77 0.1772 62.891 0.1771 62.891 0.1772 62.891 0.1771 62.891"/><path d="m576.15 578.33h-63.075-63.075l-63.075-1e-4h-63.075"/><path d="m323.85 578.33 0.1772-62.891 0.1772-62.891 0.1772-62.891 0.1771-62.891"/><path d="m575.44 326.77 29.765-32.469 29.765-32.469" stroke="#c00000"/><path d="m634.97 261.83h-92.486-92.486l-92.486-1e-4h-92.486" stroke="#c00000"/><path d="m265.03 261.83 44.647 48.704 14.882 16.235" stroke="#c00000"/><path d="m323.85 578.33-15.092 13.725-30.183 27.45-15.092 13.725" stroke="#c0c000"/><path d="m263.48 633.23h93.258 93.258l93.258 1e-4h93.258" stroke="#c0c000"/><path d="m636.52 633.23-60.366-54.9" stroke="#c0c000"/><path d="m634.97 261.83 0.3863 92.851 0.3862 92.851 0.3863 92.851 0.3863 92.851" stroke="#0000c0"/><path d="m636.52 633.23h-93.258l-93.258-1e-4h-93.258-93.258" stroke="#0000c0"/><path d="m263.48 633.23 0.3863-92.851 0.3863-92.851 0.3863-92.851 0.3862-92.851" stroke="#0000c0"/></g></svg>
import xml.etree.ElementTree as ET
import numpy as np
from svg.path import parse_path
from svg.path.path import Line, Move
cubeSVG = '<?xml version="1.0" encoding="UTF-8"?><svg viewBox="0 0 900 900" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#00c000" stroke-linecap="round"><path d="m324.56 326.77h62.721 62.721 62.721 62.721"/><path d="m575.44 326.77 0.1772 62.891 0.1771 62.891 0.1772 62.891 0.1771 62.891"/><path d="m576.15 578.33h-63.075-63.075l-63.075-1e-4h-63.075"/><path d="m323.85 578.33 0.1772-62.891 0.1772-62.891 0.1772-62.891 0.1771-62.891"/><path d="m575.44 326.77 29.765-32.469 29.765-32.469" stroke="#c00000"/><path d="m634.97 261.83h-92.486-92.486l-92.486-1e-4h-92.486" stroke="#c00000"/><path d="m265.03 261.83 44.647 48.704 14.882 16.235" stroke="#c00000"/><path d="m323.85 578.33-15.092 13.725-30.183 27.45-15.092 13.725" stroke="#c0c000"/><path d="m263.48 633.23h93.258 93.258l93.258 1e-4h93.258" stroke="#c0c000"/><path d="m636.52 633.23-60.366-54.9" stroke="#c0c000"/><path d="m634.97 261.83 0.3863 92.851 0.3862 92.851 0.3863 92.851 0.3863 92.851" stroke="#0000c0"/><path d="m636.52 633.23h-93.258l-93.258-1e-4h-93.258-93.258" stroke="#0000c0"/><path d="m263.48 633.23 0.3863-92.851 0.3863-92.851 0.3863-92.851 0.3862-92.851" stroke="#0000c0"/></g></svg>'
def svg_to_stroke3(svg_string):
# parse the doc
doc = ET.fromstring(svg_string)
# get paths
paths = doc.findall('.//{http://www.w3.org/2000/svg}path')
strokes = []
# previous x, y
px, py = 0, 0
for path_index, path in enumerate(paths):
stroke = parse_path(path.attrib['d'])
was_moving = False
for operation_index, operation in enumerate(stroke):
if isinstance(operation, Move):
mx = int(operation.start.real)
my = int(operation.start.imag)
# prep this end point for check as next line first point
was_moving = True
strokes.append([mx-px, my-py, 1])
# update previous (absolute) coordinates
px = mx
py = my
if isinstance(operation, Line):
sx = int(operation.start.real)
sy = int(operation.start.imag)
ex = int(operation.end.real)
ey = int(operation.end.imag)
if was_moving:
# append delta x, y relative to previous move operation
strokes.append([sx-px, sy-py, 0])
was_moving = False
# append delta x,y (line end relative to line start)
strokes.append([ex-sx, ey-sy, 0])
# update previous (absolute) coordinates
px = ex
py = ey
# update previous end point
strokes_np = np.array(strokes, dtype=np.int16)
return strokes_np
print(svg_to_stroke3(cubeSVG))
此外,我已将上述内容作为易于运行的工具提供
Google Colab Notebook .
最佳答案
您的转换是正确的,错误在渲染代码中。必须是 is_down = data[i][2] == 0
而不是 is_down = data[i-1][2] == 0
在 draw_stroke3
.
此错误没有出现在其他路径中,但在两种情况下,新路径从前一条路径的末尾开始。在您真正移动到新起点的另一种情况下,附加线与已绘制的线重合。
更新和更正:
我注意到我误解了上笔位的含义:实际上它表明在绘制当前笔画后要提起笔,而不是像我一开始那样为当前笔画。因此,您的渲染代码似乎没问题,并且错误出在 stroke3 文件生成中。
我想您可以通过记录每个操作的终点以及当前操作的操作代码(1
= 移动,0
= 绘制)来简单得多。转换为 numpy 数组后,我们可以通过前两列的差值轻松地将这些绝对位置转换为相对位移,然后将带有操作码的第三列向后移动一个位置:
def svg_to_stroke3(svg_string):
doc = ET.fromstring(svg_string)
paths = doc.findall('.//{http://www.w3.org/2000/svg}path')
strokes = [[0,0,0]]
for path in paths:
stroke = parse_path(path.attrib['d'])
for op in stroke:
if isinstance(op, Move):
strokes.append([op.start.real, op.start.imag, 1])
if isinstance(op, Line):
strokes.append([op.end.real, op.end.imag, 0])
strokes_np = np.array(strokes, dtype=np.int16)
# convert x,y columns to relative displacements
strokes_np[1:,:2] -= strokes_np[:-1,:2]
# shift back op codes
strokes_np[:-1,2] = strokes_np[1:,2]
# remove [0,0,0]s and set previous op to 0
m = (strokes_np == 0).all(1)
strokes_np[np.argwhere(m)-1,2] = 0
return strokes_np[~m]
这提供了一个相当紧凑的表示(示例立方体为 49 行)并使用您的原始代码和 David Ha 的
draw_strokes()
正确呈现。 (如果按照惯例,您可以像
draw_strokes()
那样将笔向上举起,则可以不用我添加的第一行)。
关于python - 如何将 SVG 折线转换为 quickdraw stroke-3 numpy 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65985435/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!