Поверхность участка трубопровода к гнуплоту от С

Я сделал функцию, которая успешно передает данные из моей программы на 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");    
}
Другие вопросы по тегам