8

Mi sono chiesto come programmi come mathematica e mathlab, e così via, disegnino grafici di funzioni in modo così elegante e veloce. Qualcuno può spiegarmi come lo fanno e, inoltre, come posso farlo? È legato a un aspetto o corso in Programmazione del computer o Matematica? Quale allora?In che modo programmi come Matematica disegnano grafici e come posso creare un programma del genere?

+3

Potresti essere interessato a dare un'occhiata a [matplotlib] (http://matplotlib.sourceforge.net/), una libreria di disegno 2D in python. È sotto una licenza in stile BSD, quindi puoi leggere e utilizzare il codice sorgente per il contenuto del tuo cuore. – Cascabel

+0

Penso che il commento @ di Jefromi sia la migliore risposta possibile, dato che nessuno sarà in grado di dirti come funziona Matlab o Mathematica. Ci sono molti, molti problemi da risolvere in una libreria grafica robusta, nessuna risposta facile per te, mi dispiace –

+0

Il [rendering sottostante di grafici in saggio] (http://hg.sagemath.org/sage-main/file/f24ce048fa66 /sage/plot/plot.py#l1) è anche fatto con matplotlib. – Simon

risposta

5

Bene, con un po 'di incoraggiamento da Belisario, ecco un mio commento come risposta: prova a guardare matplotlib. Dalla pagina iniziale:

matplotlib è una libreria di plottaggio 2D in pitone che produce dati di qualità di pubblicazione in una varietà di formati di stampa e ambienti interattivi su piattaforme diverse. matplotlib può essere utilizzato negli script python, nella shell python e ipython (ala MATLAB® * o Mathematica® †), nei server di applicazioni Web e in sei toolkit di interfaccia utente grafica.

Originariamente è stato ispirato dalle capacità di tracciamento di MATLAB, sebbene da allora sia cresciuto molto. È un software solido - ed è open source, sotto una licenza BSD, quindi non solo puoi leggere il codice sorgente, puoi hackerarlo e usarlo in qualsiasi cosa tu voglia.

Un altro posto che si potrebbe guardare è gnuplot. Non è una delle comuni licenze open source, ma è certamente open source, con alcune autorizzazioni per la modifica e così via.

Gnuplot è un programma di utilità di grafica portatile basato su riga di comando per linux, OS/2, MS Windows, OSX, VMS e molte altre piattaforme. Il codice sorgente è protetto da copyright ma distribuito gratuitamente (ad esempio, non devi pagare per questo). È stato originariamente creato per consentire a scienziati e studenti di visualizzare in modo interattivo funzioni matematiche e dati, ma è cresciuto per supportare molti usi non interattivi come lo scripting web. Viene anche utilizzato come motore di tracciamento da applicazioni di terze parti come Octave. Gnuplot è stato supportato e in sviluppo attivo dal 1986.

Fa anche il plottaggio 3D, che matplotlib non funziona, ed è durato molto più a lungo. Il motivo per cui ho pensato prima a matplotlib è che è inteso come una libreria per un linguaggio di livello superiore, non un'applicazione autonoma, quindi suppongo che potrebbe essere un po 'più facile da leggere.

Un altro suggerimento, solo per avere un'idea del tipo di cose che Mathematica sta facendo sotto il cofano, è guardare lo documentation for Plot. In particolare, se si guardano le opzioni disponibili, è possibile dedurre le cose.

MaxRecursionAutomatic il numero massimo di suddivisioni ricorsive permesso MethodAutomatic il metodo da utilizzare per le curve di raffinazione PerformanceGoal$PerformanceGoal aspetti delle prestazioni per cercare di ottimizzare PlotPointsAutomatic numero iniziale di punti campione

Da il MaxRecursion e PlotPoints, puoi vedere che sta facendo un campionamento iniziale, quindi in qualche modo decidere quale regio ns deve essere suddiviso (ricampionato) per avere una visione accurata della trama. E da lì in poi, è magico: ci sono alcuni Method per questo, e un PerformanceGoal per guidarlo ...

1

Per MATLAB, a causa del suo fabbisogno multipiattaforma non vi sono alternative all'uso di OpenGL. Il runtime MATLAB è scritto in C++ e la GUI non assi utilizza Java Swing. Pertanto MATLAB Plot è probabilmente una miscela C++/OpenGL/Swing.

In realtà la grafica MATLAB è molto meno complessa di una grafica di videogiochi. Penso che sia più facile trovare tutorial sulla grafica dei videogiochi e quindi "ridimensionarli" in funzionalità MATLAB, come disegnare una singola linea con lo stesso colore.

Il concetto più importante è probabilmente Transformation Matrix.

+0

Sospetto che MATLAB abbia un numero di motori di rendering oltre a OpenGL, anche se non posso affermarlo per un fatto. È comune che tali ambienti multipiattaforma utilizzino l'API grafica 2D/3D nativa del sistema su cui sono in esecuzione (GDI/DirectX, X11, Quartz, ...) – Amro

1

Fondamentalmente la maggior parte dei programmi che tracciano qualsiasi tipo di grafico (in particolare qualsiasi grafico di ragionevole complessità) utilizzerà un tipo di libreria di terze parti.

La libreria specifica utilizzata dipende dal linguaggio di programmazione utilizzato. Ad esempio:

Per un'applicazione .Net è possibile utilizzare report Crystal. http://en.wikipedia.org/wiki/Crystal_Reports

Per Java è possibile utilizzare JFreeChart. http://www.jfree.org/jfreechart/ E così via ...

È probabile trovare librerie numerious per qualsiasi lingua si decide di codice.

Se si vuole realizzare questa funzionalità nel progetto speciali Io suggerisco di usare una libreria, soprattutto se si sono un principiante. Le complessità interne di come queste librerie di grafi sono implementate sarebbero significative a causa di molti problemi come la compatibilità multipiattaforma, l'ottimizzazione della resa grafica (ad esempio: assicurandosi che la grafica renda rapidamente e 'graziosamente'), la matematica associata al posizionamento degli elementi su il grafico e così via.

Infine dubito che troverà corsi specifici in questo argomento (o li richiederà) come di nuovo escludendo MOLTO casi specifici i programmatori useranno sempre le librerie che già esistono.

Perché codificarlo da soli quando qualcuno ha già risolto il problema con lo ?

+1

Quindi i corsi di informatica non si occupano mai, diciamo, della creazione di compilatori, perché ci sono già compilatori, giusto? – Cascabel

+0

Sei un idiota! Leggi cosa ho scritto e letto nel contesto prima di rispondere a me in futuro. (o semplicemente non!) Sono sicuro che potrei snocciolare la tua risposta e trovare una simile affermazione stupida se volessi agire come un ignorante. –

+0

Sempre acceso. L'OP non vuole disegnare un grafico, desidera imparare alcuni dettagli di come vengono disegnati i grafici. Il suggerimento di Jefromi di guardare i dettagli di matplotlib aiuta con quello; il tuo no. –

0

Un buon punto di partenza è capire che c'è una grammatica per la grafica e cosa si vuole costruire su ricevere un comando plot è una rappresentazione simbolica del grafico. Per Mathematica, puoi fare qualcosa come

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

per vedere la rappresentazione interna utilizzata da Mathematica. Fondamentalmente è necessario descrivere i segmenti di linea (2D) o le mesh (3D) che si vogliono disegnare in termini di colore e coordinate. Inoltre, c'è bisogno di informazioni sulla scala del grafico e su come disegnare segni di graduazione, assi di etichette, ecc.

Questo ci porta al cuore della domanda, come si determina il segmento di linea che si desidera trarre da una funzione e una gamma? Se fai un giro nel file di aiuto per la trama, vedi alcune cose. Innanzitutto c'è un'opzione per i punti di trama e un'opzione MaxRecursion. Questo mi porta a credere (e questa è solo una supposizione istruita, ma è come lo farei io) che Mathematica traccia il numero iniziale di punti su un intervallo pari nell'intervallo per ottenere un valore iniziale. La parte successiva consiste nell'identificare le regioni in cui le modifiche superano alcune soglie e quindi campionare più punti fino a quando il "cambiamento" tra due punti qualsiasi nel segmento di linea è inferiore alla soglia. Mathematica fa questo in modo ricorsivo, da qui l'opzione MaxRecursion.

Finora sono stato piuttosto vago nel definire il tasso di cambiamento.Un modo più utile per descrivere il cambiamento è quello di prendere 3 punti sul tuo segmento di linea. Assumi una relazione lineare tra il 1 ° e il 3 ° punto e, assumendo questa relazione lineare, fai una previsione su quale sarebbe il secondo punto. Se l'errore di questa previsione è sufficientemente basso, considera il prossimo gruppo di tre punti. Se l'errore è superiore a una soglia, è necessario campionare altri punti in questa regione fino a quando non viene soddisfatta la soglia. In questo modo avrete bisogno di relativamente pochi punti in cui la curva è relativamente diritta e più nelle parti "interessanti" dove si piega in nuove direzioni. La scorrevolezza della curva che si disegna sarà proporzionale all'errore che si è disposti a tollerare nella previsione lineare dei punti.

Problemi correlati