0

個々の隣接するポリゴン (gnuplot の fillcurve モードで描画) が 1 つのポリゴンに変換されるように、Postscript ファイルを変換しようとしています。この関連する質問も参照してください。

gnuplot アーティファクト

そのために、私は次の問題に直面しています。

ポリゴンはpsファイルにそのような構造を持っています

some statements
A1 A2 A3 A4 A5
B1 B2 B3 B4 B5
some statements

A1、A2..などは数字です。処理されたファイルは次のようになります (ここでは任意の例)

some statements
A1    A2
B1    B2
B1+A2 B5-A4
B1+A2 B5-A5
B1    B2
A1    A2
some statements

ここで、たとえば、B1+A2 は算術演算の結果、つまり float である必要があります。どうすれば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
..   ..   ..
..   ..   ..

したがって、絶対座標をポイントごとに定義したいので、新しいポリゴンにはより多くのコード行があります。単一行の置換は機能しません。

4

2 に答える 2

1

数字で行を識別する方法、そのような行の数字の数など、ファイル形式に関するより多くの情報が必要ですが、基本的にはファイルを開いて行ごとに処理します。

with open('data.txt') as inf, open('out.txt', 'w') as outf:
   for line in inf:
      if # line with numbers
         # then code similar to what's shown below
         # generating a new value for variable line
         line = .... # see below

      outf.write(line+'\n') # write out "line" to output file, either the
                            # original non-number line, or the "modified"
                            # line with the parsed/math results.

ファイルからデータを収集する方法の詳細には、データ/ファイル形式に関する詳細情報が必要ですが、一般に、数値を含む行の場合、split()を使用して解析し、次のようなリスト内包表記を使用してパーツをfloat値に変換できます。 :

line = '5.5 6.09 8.0 12.2'
n = [float(i) for i in line.split()]

これnが値のリストfloatです。

n
[5.5, 6.09, 8.0, 12.2]

これを使用して、計算と印刷を行うことができます(ただし、ここでは結果が文字列として変数に割り当てられます)。

line = "%.2f %.2f" %((n[0]+n[1]), (n[2]+n[3]))
11.59 20.20

余談withですが、ファイルを開くために使用する利点は、完了したとき、または例外が発生したときにファイルが閉じられることです。

于 2012-06-21T14:57:55.693 に答える
0

あなたを助けるためにもう少し情報が必要です:

  • 疑似コードではなく、ポリゴンが定義されているファイルの実際のセクションを指定してください。

  • 必要なポリデータとそうでないものを認識する明白な方法はありますか? 探しているファイルのチャンクをどのように判断できますか? それを考えると、(Levon が示すように) ファイルを開き、データを取得するのは非常に簡単なはずです。

  • ポリゴン データを取得したら、連続した一致する頂点がない限り、2 つのポリゴンの結合を見つけるのは少し複雑です。「複雑なポリゴンを結合するにはどうすればよいですか?」を参照してください。. これをShapelyのようなジオメトリ ライブラリに委譲する方が簡単かもしれません。

于 2012-06-21T21:07:57.600 に答える