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:
- crea una secuencia de salida que escribe los datos en un archivo
.dat
- abrir un tubo gnuplot
- make gnuplot trama todos los contenidos de
.dat
Como mis datos siempre han sido trazados 2D, x
, estoy bastante perdido aquí. Mi pregunta es:
- Cómo formatear el archivo
.dat
(por ejemplo, ¿utilizo llaves para agrupar componentes vectoriales?) - ¿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á:
Primero abre una tubería y llámala
pipe
:FILE *pipe = popen("gnuplot -persist 2>/dev/null", "w");
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.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