Поверхность участка трубопровода к гнуплоту от С
Я сделал функцию, которая успешно передает данные из моей программы на C в gnuplot:
void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{
int i,j;
fprintf(gp, "splot '-'\n");
for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
fprintf(gp, "%g %g %g\n", x[i],x[j],sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
}
}
fflush(gp);
fprintf(gp, "e\n");
}
Сама функция находится в цикле, благодаря чему двумерные массивы RE и IM постоянно обновляются.
Мой вопрос: как я могу сделать этот график сплошной поверхностью, а не отдельными точками или линиями?
Если я скажу gnuplot set pm3d\n
, он возвращает ошибку:
Для сканирования pm3d одной изолинии
недостаточно
Есть ли способ обойти это?
Спасибо
1 ответ
Чтобы получить график поверхности, вы должны разделить два блока с одинаковыми значениями x, но изменить значение y (или наоборот) пустой строкой:
x1 y1 z11
x1 y2 z12
...
x1 yN z1N
x2 y1 z21
x2 y2 z22
..
x2 yN z2N
x3 y1 z31
...
т.е. печатать новую строку после внутреннего цикла for
void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{
int i,j;
fprintf(gp, "splot '-'\n");
for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
fprintf(gp, "%g %g %g\n", x[i],x[j],sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
}
fprintf(gp, "\n");
}
fflush(gp);
fprintf(gp, "e\n");
}
Если пропускная способность может быть проблемой, и ваши x- и y-шаги равноудалены, вы также можете записать свои данные в матричном формате:
void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{
int i,j;
fprintf(gp, "x0 = %e; dx = %e; y0 = %e; dy = %e;\n", x[0], x[1]-x[0], y[0], y[1]-y[0]);
fprintf(gp, "splot '-' matrix using (x0+dx*$1):(y0+dy*$2):3\n");
for (i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
fprintf(gp, "%g ", sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
}
fprintf(gp, "\n");
}
fflush(gp);
fprintf(gp, "e\n");
}