vectores programacion matrices llenar imprimir funciones ejemplos con como arreglos c++ vector 3d field gnuplot

c++ - programacion - ¿Cómo debo formatear mi archivo.dat para que se pueda hacer un diagrama vectorial en 3D?



vectores y matrices en c++ (1)

Estoy trabajando en esta tarea de programación para la universidad donde tenemos que escribir un programa de c++ que calcula el vector de campo magnético para ciertas bobinas en el espacio 3D.

Logré escribir este programa y creo que lo estoy haciendo bastante bien.

Sin embargo, quiero agregar un thinh especial (¡es mi examen, así que tiene que ser muy bueno!): Quiero trazar los vectores.

Estoy acostumbrado a llamar a gnuplot desde c++ (a través de tuberías) y esto es lo que suelo hacer:

  1. crea una secuencia de salida que escribe los datos en un archivo .dat
  2. abrir un tubo gnuplot
  3. make gnuplot trama todos los contenidos de .dat

Como mis datos siempre han sido trazados 2D, x , estoy bastante perdido aquí. Mi pregunta es:

  1. Cómo formatear el archivo .dat (por ejemplo, ¿utilizo llaves para agrupar componentes vectoriales?)
  2. ¿Cuál es el comando real gnuplot para trazar un campo de vector 3D?

Sería fácil si pudiera formatear el archivo .dat esta manera:

# Px Py Pz Bx By Bz 1 0 2 0.7 0.5 0.25 #<= example data line ... more data ...

cuando el vector de campo magnético en el punto P=(1,0,2) es igual a un vector B=(0.7,0.5,0.25) . Esto sería fácil de programar, la verdadera pregunta es: ¿lo hará? y cómo trazarlo en gnuplot. (wow, he hecho la misma pregunta 3 veces, supongo).

Tubería para gnuplot

Ok, ya que alguien me pidió que describiera cómo gotear (no sé si es el término correcto) cosas para gnuplot . Aquí está:

  1. Primero abre una tubería y llámala pipe :

    FILE *pipe = popen("gnuplot -persist 2>/dev/null", "w");

  2. Dile a gnuplot qué hacer a través de la tubería:

    fprintf(pipe, "set term x11 enhanced /n"); fprintf(pipe, "plot x^2 ti ''x^2'' with lines/n");

    fíjate en /n que es absolutamente necesario. Es lo que ejecuta el comando.

  3. cierra la tubería:

    pclose(pipe);

La biblioteca necesaria se llama <fstream> , creo.


Hice este sencillo ejemplo para mostrarte cómo dibujar un campo vectorial. La salida sería algo así como esta foto:

El ejemplo de datos que usé para trazar esto fue:

# Px Py Pz Bx By Bz 0 0 0 0.8 0.8 0.45 0 0 1 0.5 0.7 0.35 0 0 2 0.7 0.5 0.25 0 1 0 0.65 0.65 0.50 0 1 1 0.6 0.6 0.3 0 1 2 0.45 0.45 0.20 1 0 0 0.5 0.7 0.35 1 0 1 0.75 0.75 0.4 1 0 2 0.85 0.85 0.25 1 1 0 0.90 0.85 0.23 1 1 1 0.95 0.86 0.20 1 1 2 0.98 0.88 0.13 2 0 0 0.73 0.83 0.43 2 0 1 0.53 0.73 0.33 2 0 2 0.73 0.53 0.23 2 1 0 0.68 0.68 0.52 2 1 1 0.63 0.57 0.23 2 1 2 0.48 0.42 0.22

El comando para trazarlo es:

gnuplot> splot "./data3d.dat" with vectors

Ahora debería leer la sección 44, página 53 del manual oficial (y aquí el pdf ). Puede encontrar este sitio también muy útil.

Editado:

Este comando no encaja en su descripción: mapeo from (x,y,z) to (t,u,v) . Realmente hace este mapeo: from (X,Y,Z) to (X+dX,Y+dY,Z+dZ) .

Saludos, Beco