2016-12-07 20 views
2

私は、ノードの座標(お互いが十分接近している点)を与えられた幾何学グラフのエッジを見つけるコードをC++で書いています。私は今、グラフをプロットし、リンクの座標をGnuplotに配管したいと考えています。これは、次のようになります。C++のgnuplotで幾何学グラフをプロットする

今リンクは(幅優先探索アルゴリズムを使用して)が発見されるたびに、私は

fprintf(pipe, "%g %g\n", RC[j].angle,RC[j].radius); 
fprintf(pipe, "%g %g\n", RC[start[ptr]].angle,RC[start[ptr]].radius); 
fprintf(pipe, "%g %g\n"); 

を行うと、検索アルゴリズムが終了したとき、私は

で終わる
FILE *pipe = popen("gnuplot -persist", "w"); 
fprintf(pipe, "\n"); 
fprintf(pipe, "set polar\n"); 
fprintf(pipe, "plot '-' with linespoints \n"); 

fprintf(pipe, "e\n"); 
fflush(pipe); 
fclose(pipe); 

しかし、これは私が期待する幾何学的グラフを印刷しません(遠く離れている点は接続されています)。この手順を使用してファイルにデータを書き込むと、

outfile << RC[j].angle << ", " << RC[j].radius << endl; 
outfile << RC[start[ptr]].angle << ", " << RC[start[ptr]].radius << endl; 
outfile << " " << endl; 

私は必要なグラフを取得します。パイプに何が問題なのですか?あなたのstd::ostreamfprintfバージョンから

+0

C++プログラムを標準ファイルに書き込んでgnuplotに与えます。この方法で、C++かgnuplotのエラーかどうかを知ることができます。 – YSC

+0

あなたの助言に従って、私が探しているグラフを標準的なファイルで取得します。したがって、エラーは配管アルゴリズムにあります。投稿が編集されました。 – DM037

+0

私の答えについてのフィードバックがありますか? – YSC

答えて

0

、私は違いは明白です伝えることができます:あなたはあなたのfprintfバージョンで昏睡(、)+空行を忘れてしまった:別の方法として

fprintf(pipe, "%g, %g\n", RC[j].angle, RC[j].radius); 
fprintf(pipe, "%g, %g\n", RC[start[ptr]].angle, RC[start[ptr]].radius); 
fprintf(pipe, " \n"); 

、私は希望古いC関数(テストされていない)の代わりにC++クラスを使用することをお勧めします:

class Pipe : public std::ofstream // in most cases this is bad, but ok here 
{ 
public: 
    Pipe(FILE* pf) : _pg(pf) {} 
    ~Pipe() { pclose(pf); } 
    // copy-ctr(), op=(), ... 
private: 
    FILE _pf; 
}; 

Pipe gnuplot(popen("gnuplot -persist", "w")); 
gnuplot << "\n" 
     << "set polar\n" 
     << "plot '-' with linespoints\n"; 

for (...) 
{ 
    gnuplot << RC[j].angle << ", " << RC[j].radius << "\n"; 
    gnuplot << RC[start[ptr]].angle << ", " << RC[start[ptr]].radius << "\n"; 
    gnuplot << " " << std::endl; 
}