8

Me he estado preguntando cómo programas como mathematica y mathlab, y así sucesivamente, trazan gráficas de funciones de forma tan elegante y rápida. ¿Alguien puede explicarme cómo lo hacen y, además, cómo puedo hacer esto? ¿Está relacionado con un aspecto o curso de Programación de Computación o Matemáticas? ¿Cuál entonces?¿Cómo dibujan gráficos los programas matemáticos y cómo puedo crearlos?

+3

Puede que le interese echar un vistazo a [matplotlib] (http://matplotlib.sourceforge.net/), una biblioteca de trazado 2D en python. Está bajo una licencia de estilo BSD, por lo que puede leer y usar el código fuente al contenido de su corazón. – Cascabel

+0

Creo que el comentario de @ Jefromi es la mejor respuesta posible, ya que nadie podrá decirle cómo funcionan realmente Matlab o Mathematica. Hay muchos, muchos problemas sutiles para resolver en una biblioteca de gráficos robusta, no hay una respuesta fácil para usted, lo siento –

+0

La representación subyacente de tramas en sabio] (http://hg.sagemath.org/sage-main/file/f24ce048fa66 /sage/plot/plot.py#l1) también se hace con matplotlib. – Simon

Respuesta

5

Bueno, con un poco de aliento de belisarius, aquí hay un mi comentario como respuesta: intente mirar matplotlib. Desde la página de inicio:

matplotlib es una biblioteca de trazado 2D de python que produce figuras de calidad de publicación en una variedad de formatos impresos y entornos interactivos en todas las plataformas. matplotlib se puede usar en scripts de Python, el shell python e ipython (a la altura de MATLAB® * o Mathematica® †), servidores de aplicaciones web y seis juegos de herramientas de interfaz gráfica de usuario.

Originalmente fue inspirado por las capacidades de trazado de MATLAB, aunque ha crecido mucho desde entonces. Es un software sólido, y es de código abierto, bajo una licencia BSD, por lo que no solo puedes leer la fuente, puedes hackearla y usarla en lo que quieras.

Otro lugar en el que podría mirar es gnuplot. No es una de las licencias de código abierto más comunes, pero ciertamente es de código abierto, con algunos permisos para modificar y demás.

Gnuplot es una utilidad portátil de gráficos por línea de comandos para Linux, OS/2, MS Windows, OSX, VMS y muchas otras plataformas. El código fuente tiene copyright pero se distribuye libremente (es decir, no tiene que pagarlo). Fue creado originalmente para permitir a los científicos y estudiantes visualizar las funciones matemáticas y los datos de forma interactiva, pero ha crecido para admitir muchos usos no interactivos, como los scripts web. También se utiliza como un motor de trazado por aplicaciones de terceros como Octave. Gnuplot ha sido admitido y está en desarrollo activo desde 1986.

Realiza el trazado 3D también, lo que matplotlib no hace, y ha estado mucho más tiempo. La razón por la que pensé en matplotlib primero es que está pensado como una biblioteca para un lenguaje de nivel superior, no como una aplicación independiente, así que supongo que podría ser un poco más fácil de leer para usted.

Otra sugerencia, solo para tener una idea del tipo de cosas que Mathematica está haciendo bajo la cubierta, es mirar el documentation for Plot. En particular, si mira las opciones disponibles, puede deducir cosas.

MaxRecursionAutomatic el máximo número de subdivisiones recursivas permitió MethodAutomatic el método a utilizar para las curvas de refinación PerformanceGoal$PerformanceGoal aspectos de actuación para tratar de optimizar PlotPointsAutomatic número inicial de puntos de muestra

De MaxRecursion y PlotPoints, se puede ver que está haciendo un muestreo inicial y luego de alguna manera decidir qué regio ns deben subdividirse (remuestrear) para obtener una vista precisa de la trama. Y a partir de ahí, es mágico: hay algunos Method para esto, y PerformanceGoal para guiarlo ...

1

Para MATLAB, debido a su requisito multiplataforma no hay alternativas como usar OpenGL. El tiempo de ejecución de MATLAB está escrito en C++ y la GUI que no es de eje usa Java Swing. Por lo tanto, MATLAB Plot es probablemente una mezcla C++/OpenGL/Swing.

En realidad los gráficos de MATLAB son mucho menos complejos que los gráficos de un videojuego. Creo que es más fácil encontrar tutoriales sobre gráficos de videojuegos y luego "reducir" la funcionalidad de MATLAB, como dibujar una sola línea con el mismo color.

El concepto más importante es probablemente Transformation Matrix.

+0

Sospecho que MATLAB tiene varios motores de renderizado además de OpenGL, aunque no puedo afirmar eso de hecho ... Es común que dichos entornos multiplataforma utilicen la API nativa de gráficos 2D/3D del sistema en el que se ejecutan. (GDI/DirectX, X11, Quartz, ...) – Amro

1

Básicamente, la mayoría de los programas que grafican cualquier tipo de gráfico (particularmente cualquier gráfico de complejidad razonable) utilizará algún tipo de bibliotecas de terceros.

La biblioteca específica utilizada dependería del lenguaje de programación que se utiliza. Por ejemplo:

Para una aplicación .Net, puede utilizar Crystal reports. http://en.wikipedia.org/wiki/Crystal_Reports

Para Java, puede utilizar JFreeChart. http://www.jfree.org/jfreechart/ Y así sucesivamente ...

Es probable encontrar bibliotecas numerious para cualquier idioma que decide código en.

Si usted quiere lograr esta funcionalidad en su proyecto específico se sugiere emplear una biblioteca especialmente si eres un principiante Las complejidades internas de cómo se implementan estas bibliotecas de gráficos serían significativas debido a muchos problemas, como la compatibilidad multiplataforma, las optimizaciones de representación gráfica (es decir, asegurarse de que los gráficos se procesen de manera rápida y "bonita"), las matemáticas asociadas al posicionamiento de los elementos el gráfico y demás.

Por último, dudo que encuentre cursos específicos en este tema (o los requiera) como nuevamente, excluyendo casos MUY específicos, los programadores siempre usarán las bibliotecas que ya existen.

¿Por qué codificar usted mismo cuando alguien tiene ya resuelto el problema para usted?

+1

Así que las clases de informática nunca tratan, por ejemplo, creando compiladores, porque ya hay compiladores, ¿no? – Cascabel

+0

¡Eres un idiota! Lea lo que escribí y léalo en contexto antes de responderme en el futuro. (¡o simplemente no!). Estoy seguro de que podría criticar tu respuesta y llegar a una declaración similar si quisiera actuar como un ignorante. –

+0

Steady on. El OP no quiere dibujar un gráfico, quiere aprender algunos de los detalles de cómo se dibujan los gráficos. La sugerencia de Jefromi de mirar los detalles de matplotlib ayuda con eso; el tuyo no. –

0

Un buen lugar para comenzar es comprender que hay una gramática en los gráficos y en qué se quiere construir recibir un comando de trazado es una representación simbólica del gráfico. Para Mathematica, se puede hacer algo como

FullForm[Plot[Sin[x], {x, 0, 2 Pi}]] 

para ver la representación interna usa Mathematica. Básicamente, necesita describir los segmentos de línea (2D) o mallas (3D) que desea dibujar en términos de su color y coordenadas. Además, se necesita información sobre la escala del gráfico y cómo dibujar marcas, ejes de etiquetas, etc.

Esto nos lleva al corazón de la pregunta, ¿cómo se determina el segmento de línea que desea dibujar desde una función y un rango? Si busca en el archivo de ayuda la trama, verá algunas cosas. Primero hay una opción de puntos de trazado y una opción de MaxRecursion. Esto me lleva a creer (y esto es sólo una suposición educada, pero es cómo lo haría) que Mathematica traza la cantidad inicial de puntos en un intervalo par sobre el rango para obtener un valor inicial. La siguiente parte es identificar las regiones donde el cambio excede cierto umbral y luego muestrear más puntos hasta que el "cambio" entre dos puntos cualquiera en su segmento de línea esté por debajo de un umbral. Mathematica hace esto recursivamente, de ahí la opción MaxRecursion.

Hasta ahora he sido bastante vago sobre la definición de la tasa de cambio.Una forma más útil de describir el cambio es tomar 3 puntos en su segmento de línea. Suponga una relación lineal entre el 1er y el 3er punto y, suponiendo esta relación lineal, haga una predicción sobre cuál sería el 2º punto. Si el error de esta predicción es suficientemente bajo, entonces considere el siguiente grupo de tres puntos. Si el error está por encima de un umbral, entonces debe probar algunos puntos más en esta región hasta que se cumpla el umbral. De esta manera requerirá relativamente pocos puntos donde la curva es relativamente recta y más en las partes "interesantes" donde se dobla en nuevas direcciones. La suavidad de la curva que dibuje será proporcional al error que está dispuesto a tolerar en la predicción lineal de los puntos.

Cuestiones relacionadas