2016-12-07 79 views
2

我已經用C++編寫了一個代碼,它給出了節點的座標(相互之間足夠接近的點),從而找到幾何圖形的邊緣。我現在想要繪製圖表,將管道的座標管道輸送到Gnuplot。這看起來是這樣的:使用gnuplot從C++繪製幾何圖形

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

現在每一個環節被發現(使用廣度優先搜索算法)的時候,我做

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"); 

當搜索算法結束後,我與

結束
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; 

將數據寫入到一個文件中我得到我想要的圖形。管子有什麼問題?

+0

使您的C++程序寫入標準文件並將此文件提供給gnuplot;這樣你就會知道它是C++還是gnuplot錯誤。 – YSC

+0

遵循你的建議,通過標準文件我得到我正在尋找的圖表。所以錯誤在管道算法中。發佈編輯。 – DM037

+0

我可以對我的回答有反饋嗎? – YSC

回答

0

從你std::ostreamfprintf版本,我能看出其中的差別是顯而易見的:你忘了昏迷(,)+空行你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; 
}