我尝试转换一个postscript文件,以便将单个相邻的多边形(由gnuplot的filledcurve模式绘制)转换为一个单独的多边形。另见相关问题:
为此,我面临以下问题。在
多边形在ps文件中具有这样的结构
some statements
A1 A2 A3 A4 A5
B1 B2 B3 B4 B5
some statements
A1,A2。。等等是数字。处理后的文件应该如下所示(这里是任意示例)
^{pr2}$这里,例如B1+A2应该是算术运算的结果,即浮点。在python中怎么能有这样的东西呢?不知怎么的,我需要扫描文件,计算某些行并保存它们(例如,awk中的各个字段)?在
编辑:
原始postscript文件中的一个部分如下所示
5918 4703 N
399 0 V
0 70 V
-399 0 V
0 -70 V
Z stroke
LT0
630 399 N 0 -3498 586 131 0 3490 h
1216 522 N 0 -3525 1171 204 0 3498 h
2387 699 N 0 -3557 1171 134 0 3525 h
3558 801 N 0 -3587 1171 55 0 3557 h
4729 826 N 0 -3613 1171 -20 0 3587 h
5900 780 N 0 -3624 585 -43 0 3613 h
% End plot #1
1.000 UL
LTb
0.500 UL
LTa
0.13 0.13 0.13 C 630 280 M
5855 0 V
stroke
其中N和h代表
/N {newpath moveto} bind def
/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
在这个文件中,我们有6个多边形,它们定义在行“LT0”和“%end plot#1”之间。定义多边形的线很容易与正则表达式匹配
/^[0-9,-]+\ [0-9,-]+\ N\ [0-9]\ [0-9,-]+\ [0-9,-]+\ [0-9,-]+\ [0-9,-]+\ [0-9,-]+ h/
我想把它们转换成
newpath
630 399 moveto
1216 522 lineto
2387 699 lineto
3558 801 lineto
4729 826 lineto
5900 780 lineto
.. .. ..
.. .. ..
新的多边形因此有更多的代码行,因为我想逐点定义绝对坐标。替换单行线不起作用。在
我们需要更多信息来帮助您:
请给出文件中定义多边形的实际部分,而不是伪代码。
有没有一种明显的方法可以识别出所需的多边形数据是什么,不是什么?我们如何判断我们在寻找哪个文件块?鉴于此,打开文件(如Levon所示)并获取数据应该非常容易。
一旦我们得到多边形数据,找到两个多边形的并集就有点麻烦了,除非它们有连续的重合顶点-参见How do I combine complex polygons?。将其委托给像Shapely这样的几何库可能更容易。
我们需要更多关于文件格式的信息,比如如何用数字标识行,这些行上有多少个数字等等,但实际上你打开文件并逐行处理它。在
有关如何从文件中收集数据的详细信息需要有关数据/文件格式的更多信息,但通常对于包含数字的行,可以使用split()对其进行解析,然后使用list comprehension将各部分转换为浮点值,如下所示:
^{pr2}$现在,
n
是float
值的列表。在你可以用它来计算和打印(尽管这里的结果是作为一个字符串分配给变量的):
旁白:使用
with
打开文件的好处是,当您完成操作或遇到异常时,它们会被关闭。在相关问题 更多 >
编程相关推荐