【问题标题】:Plotting geometric graph with gnuplot from C++使用 C++ 中的 gnuplot 绘制几何图
【发布时间】:2016-12-07 10:43:16
【问题描述】:

我用 C++ 编写了一个代码,它在给定节点坐标的情况下找到几何图的边(彼此足够接近的点是相连的)。我现在想绘制图表,将链接的坐标通过管道传输到 Gnuplot。这看起来像这样:

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; 

我确实得到了我想要的图表。管道有什么问题?

【问题讨论】:

  • 让你的C++程序写入一个标准文件并将这个文件交给gnuplot;这样你就可以知道是 C++ 还是 gnuplot 错误。
  • 听从您的建议,通过一个标准文件,我得到了我正在寻找的图表。所以错误在于管道算法。帖子已编辑。
  • 我可以对我的回答提出反馈意见吗?

标签: c++ pipe


【解决方案1】:

从您的 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; 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多