PDA

View Full Version : [c++] come creare un grafico di una funzione


vermaccio
14-03-2006, 13:01
avete una funzione y=f(t) nota.

Ogni t=1s valutate la funzione e ogni coppia (t,y) volete graficarla su un grafico con ascissa=t, ordinata=y.

che istruzioni devo scrivere in c++ perchè a video appaia il grafico?

e una volta creato il grafico se volessi farne apparire anche un secondo distinto in cui graficare un altra funzione z=f(w)?

huNewbie
17-03-2006, 10:46
avete una funzione y=f(t) nota.

Ogni t=1s valutate la funzione e ogni coppia (t,y) volete graficarla su un grafico con ascissa=t, ordinata=y.

che istruzioni devo scrivere in c++ perchè a video appaia il grafico?

e una volta creato il grafico se volessi farne apparire anche un secondo distinto in cui graficare un altra funzione z=f(w)?

La risposta dipende da un bel po' di questioni, del tipo:


Quale ambiente di sviluppo usi? Dev-C++, Mingw, Visual Studio 6, Visual Studio .NET?
Quale libreria grafica vuoi usare? MFC, Windows Forms, GTK, le API di Windows?

vermaccio
17-03-2006, 13:47
1)uso visual studio .net e lo uso solo per visual c++

2)non ho la più pallida idea di che cambia da una all'altra. sicuramente preferirei usare una libreria che sia dentro visual studio per non impazzire a compilare.

mi serve una cosa anche semplice, giusto per fare un grafico.

huNewbie
17-03-2006, 17:46
1)uso visual studio .net e lo uso solo per visual c++

2)non ho la più pallida idea di che cambia da una all'altra. sicuramente preferirei usare una libreria che sia dentro visual studio per non impazzire a compilare.

mi serve una cosa anche semplice, giusto per fare un grafico.

Allora sei incredibilmente fortunato: se hai VC++ .NET 2003 puoi usare Windows Forms. Quello che devi fare è semplicemente creare un nuovo progetto Windows Forms .NET, e aggiungere al form che appare un tasto "Traccia" e una PictureBox. A quel punto, nella procedura del clic di "Traccia" (che ti appare facendoci doppio clic... meno male che il visual è visuale :D ) e iniziare a disegnare la funzione usando pictureBox1->CreateGraphics()->DrawLine, che ti permette di disegnare segmenti (meglio dei punti se vuoi un risultato buono). Basta ricordare che le PictureBox hanno un sistema di coordinate del tipo

(0, 0) in ALTO a sinistra
(larghezza, altezza) in BASSO a destra
In pratica l'asse y è ribaltato: ovviamente ti servirà fare una qualche traslazione degli assi...

Per cominciare ti consiglierei di sceglierti un sistema di riferimento tuo (che ne so, l'origine al centro, l'asse x che va da -5 a 5 e l'asse y che va da -3 a 3... o come preferisci) e di capire come trasformare le coordinate cartesiane del sistema scelto in quelle corrispondenti della PictureBox.
C'è solo da divertirsi un po'... IntelliSense è una vera goduria... :D

vermaccio
17-03-2006, 18:23
io ho visual studio .net 7.0.9254, credo del 2001.

considerando che sono iper-ignorante di visual mi serevirebe un listato "già fatto" o istruzioni precisissime su cosa fare e come compilare, dando per scontato di avere un file .cpp di c++ in cui istante per istante si calcola la funzione.

huNewbie
18-03-2006, 11:03
io ho visual studio .net 7.0.9254, credo del 2001.

considerando che sono iper-ignorante di visual mi serevirebe un listato "già fatto" o istruzioni precisissime su cosa fare e come compilare, dando per scontato di avere un file .cpp di c++ in cui istante per istante si calcola la funzione.

Ops...
Quindi ti conviene andare su MFC, dato che se scegli di creare un progetto Win32 devi praticamente scrivere tutto il codice, compreso quello per creare finestra, riquadro...
Comunque penso che il principio sia lo stesso: devi creare (con il mitiko drag&drop dalla casella degli strumenti) un riquadro su cui disegnare, e poi capire come si fa a disegnarci sopra: dovrebbero esistere funzioni come MoveTo (che sposta il cursore su un pixel) e LineTo (che traccia una linea dal punto corrente a un altro. Tutte queste funzioni sono metodi di un oggetto, noto come CDC, che rappresenta l'oggetto su cui vuoi disegnare. Una volta ottenuto il CDC del riquadro (se il riquadro si chiama R, prova a scrivere R-> e a vedere se IntelliSense ti suggerisce un DC() o GetDC() o simile), insomma, puoi disegnarci sopra.

Magari in rete si trova qualche esempio o tutorial su MFC che potrebbe fare al caso tuo...

vermaccio
18-03-2006, 11:52
<<dato che se scegli di creare un progetto Win32 devi praticamente scrivere tutto il codice, compreso quello per creare finestra, riquadro... >>

è questo il metodo che vorrei usare. cioè restare dentro la programmazione c++ (file .cpp che poi compilo e trasformo in .exe. questo almeno so farlo:basta cliccare "build" hehehe) e scrivere codice da li dentro.

potete incollarmi qui il codice, gli include da inserire nel mio listato per graficare (ad esempio) y=sin(x) con x che va da 0 a 6.28?

purtroppo non so nulladi visual se non scribacchiare dentro un listato c++ per fare semplici programmi.

aiutatemi, per favore....

wisher
18-03-2006, 12:04
purtroppo non so aiutarti, ma prova a controllare sulle msdn o sul sito di ms, in genere ci sono degli esempi

tomminno
18-03-2006, 14:46
Scusa, ma hai mai scritto programmi con interfaccia grafica?
Dalle tue domande sembrerebbe di no.

Secondo me le soluzioni migliori sono librerie QT o wxWidgets, (la classe per il plotting delle QT è però decisamente migliore), le MFC per me sono sempre state arabo.
Ma devi imparare un bel pò di cose su come funzionano le interfacce grafiche e soprattutto fare una scelta.

vermaccio
18-03-2006, 15:06
èquesto il problema:
non so nulla sulle interfacce grafiche e non mi serve saperne il funzionamento.
devo solo usarla per fare UNA cosa (più volte nel programma ma semprw quella, cioè graficare pl'andamento di più funzioni, una in una finestra diversa. Ad esempio spazio percorso, velocità, accelerazione: 3 grafici che vengono "creati" punto a punto a mano a mano che il programma cicla nel tempo (=ascissa).

quindi mi servono delle istruzioni da mettere nude e crdude da mettere nel listato c++, da usare così come sono, alla cieca, anche senza capire perchè sono scritte così.

immaginate di avere 2 funzioni.
a=funzione1(t)
b=funzione2(t)

t varia nel tempo con un ciclo for.

come faccio a diseganre:

finestra1--> ascissa t, ordinata a
finestra 2-->ascissa t, ordinata b

tutto li.

potreste incollare qui il codice c++ da inserire nel listato e l'elenco degli eventuali "include" o altro che devo infilare in testa al programma?

grazie

vermaccio
18-03-2006, 15:07
logico che finestra1 e finestra2 devono essere separate.

ah! io uso visual studio .net prima versione (credo 2001).
Sarebbe meglio usare, se possibile, libreire grafiche di "default".
Insomma senza installare altra roba.
devo solo inserire il codice, compilare cliccando su "build" e fine.
oppure divento scemo.

sandor78
18-03-2006, 21:40
prova ad uare la libreria CPlot, la puoi trovare su sf.net

tomminno
19-03-2006, 14:59
èquesto il problema:
non so nulla sulle interfacce grafiche e non mi serve saperne il funzionamento.


Però vuoi creare un programma con interfaccia grafica :confused:
O meglio vuoi che qualcuno lo faccia al posto tuo senza che tu muova un dito.


potreste incollare qui il codice c++ da inserire nel listato e l'elenco degli eventuali "include" o altro che devo infilare in testa al programma?

grazie

Anche se qualcuno facesse il lavoro al posto tuo, poi dovresti riadattare il codice scritto da te. Quindi dovresti comunque imparare qualcosa su come funzionano le interfacce grafiche.

vermaccio
20-03-2006, 08:48
Però vuoi creare un programma con interfaccia grafica :confused:
O meglio vuoi che qualcuno lo faccia al posto tuo senza che tu muova un dito.

una cosa non la capisco: ma è così difficile creare in c++ una serie di istruzione del tipo "apri una finestra e schiaffaci una serie di puntini a queste coordinate"? questo solo mi serve. nulla di più.


Anche se qualcuno facesse il lavoro al posto tuo, poi dovresti riadattare il codice scritto da te. Quindi dovresti comunque imparare qualcosa su come funzionano le interfacce grafiche.

un conto è "riadattare", vedendo però quali istruzioni sono state usate. un altro conto è partire da zero senza sapere nemmeno di che sto parlando o cosa mi serve.

non potete scrievre qualche riga di codice che stampi il grafico di una funzione a punti?

tomminno
20-03-2006, 09:07
una cosa non la capisco: ma è così difficile creare in c++ una serie di istruzione del tipo "apri una finestra e schiaffaci una serie di puntini a queste coordinate"? questo solo mi serve. nulla di più.


Intanto ti ci vuole qualcosa tipo WinMain al posto del normale main, a meno di non usare altre librerie grafiche, che rifiuti a priori.
Poi devi creare un panel, poi inserirci l'area per disegnare, poi devi impostare il brush per disegnare ed infine traslare le coordinate dei punti in modo conforme a quello della finestra di disegno, magari ricordandoti di impostare uno zoom adeguato...


un conto è "riadattare", vedendo però quali istruzioni sono state usate. un altro conto è partire da zero senza sapere nemmeno di che sto parlando o cosa mi serve.

non potete scrievre qualche riga di codice che stampi il grafico di una funzione a punti?

Il metodo più veloce che conosco è utilizzando le FLTK, che funzionano anche con codice C, ma sono sempre librerie esterne al compilatore, che devi scaricare e compilare.
Altrimenti devi arrenderti e disegnare quello che ti serve con le MFC.
In ogni caso non sono proprio 2 righe di codice, ma molte di più.

vermaccio
20-03-2006, 12:58
<<In ogni caso non sono proprio 2 righe di codice, ma molte di più.>>

nessuna anima pia mi aiuta e me le scrive? :cry:

huNewbie
20-03-2006, 17:23
<<In ogni caso non sono proprio 2 righe di codice, ma molte di più.>>

nessuna anima pia mi aiuta e me le scrive? :cry:

Dammi mille euro e l'anima pia l'hai trovata :D

Ripeto: prova a usare MFC. Avventurarsi in Win32 non è per niente facile... e poi richiede moooooolto tempo. Per iniziare, intanto creati un nuovo progetto MFC dal Visual Studio e aggiungi alla finestra un riquadro per disegnare: richiede molto meno codice (e tempo) rispetto a Win32, perchè a quel punto l'unico codice che serve è quello per calcolare i punti e disegnarli.
Per darti un'idea, in un'applicazione Win32 nativa (che penso sia quel che vuoi usare tu... ma chi te lo fa fare :mc: ) devi scrivere TU il codice per creare la finestra di dialogo, mostrarla, disegnarci tastini vari... non ti conviene.
Se poi hai la possibilità di creare un progetto Windows Forms .NET è molto meglio... il "nuovo C++" usato è abbastanza simile al VB.

Ma poi... la caratteristica migliore del Visual Studio è proprio l'essere... visuale!

Perry_Rhodan
20-03-2006, 19:09
IMHO
una alternativa semplice e veloce potrebbe essere quella di usare un programma esterno tipo GNUPlot che è in grado di fare un grafico utilizzando dati salvati su di un file:

Calcoli la tua tabella dati
Salvi su file
usando la funzione system("Gnuplot param Filedati") richiami GNUPlot esattamente come se lo facessi da riga di comando (non so quali sono i param adatti, GNUPlot ne ha tantissimi)
eventualmente ripeti il tutto in un loop

oppure, alternativa ancora più semplice e veloce, fai tutto su excel o su calc di Openoffice senza impelagarti nel C++ .