2015-05-07 3 views
1

Я сделал функцию, которая успешно трубы данные из моей программы C до GNUPLOT:поверхности участка трубопровода к GNUPLOT от C

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

Сама функция в цикле посредством 2D-RE и IM массивы непрерывно обновлено.

Мой вопрос: как я могу сделать этот график сплошной поверхностью, а не одиночными точками или линиями?

Если я скажу GNUPLOT к set pm3d\n, он возвращает ошибку:

single isoline < scan > is not enough for pm3d plot

Есть ли способ обойти это?

Благодаря

ответ

2

Чтобы получить поверхность участка необходимо отделить два блока с одинаковыми значениями х, но изменение гамма-значение (или наоборот), пустая строка:

x1 y1 z11 
x1 y2 z12 
... 
x1 yN z1N 

x2 y1 z21 
x2 y2 z22 
.. 
x2 yN z2N 

x3 y1 z31 
... 

т.е. печать в символ новой строки после того, как внутренний для цикла

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

Если пропускная способность может быть проблемой, и ваш х- и у-шаги находятся на одинаковом расстоянии, вы также можете записать ваши данные в виде матрицы формата:

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");  
} 
+0

Обратите внимание, что алгоритм gnuplot pm3d на самом деле более общий, чем этот. Значения «x» внутри блока не все должны быть одинаковыми (это было огромным откровением для меня, когда я понял это). Это на самом деле рисование quadrilaterals на основе соответствия углов от N и N + 1 линии в первом блоке с N и N + 1 в следующем блоке. – mgilson

+0

@mgilson Я знаю, но тогда вы не можете использовать формат 'matrix', о котором я говорю. – Christoph

+1

Да. Комментарий не был расценен как критика на этот пост/ответ. Просто обратите внимание на будущих посетителей о том, как совершенно потрясающий pm3d. – mgilson