Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    24

    [C++] Rappresentare una funziona su di un grafico prelevando dati su di una tabella.

    Salve,
    Avrei bisogno di alcuni suggerimenti, correzioni ed ulteriori implementazioni per completare il mio obbiettivo finale, ovvero una piccola applicazione che sfrutti 20 input (LabeledEdit) separate in due gruppi (10 appartenenti ad una grandezza e 10 ad un altra grandezza, in breve 10 misure per ognuna) e ne rappresenti la retta o comunque la grafichi su di una PaintBox tramite un tasto Button.

    Spero di essere stato chiaro, e passo quindi al mostrarvi fin dove la mia logica riesce a navigare (studente del terzo anno di elettronica con una passione in programmazione, linguaggi browser soprattutto, ma da qualche mese C++ in DOS e ora in ambiente Windows).

    codice:
    void __fastcall TForm1::Button1Click(TObject *Sender) { float X, x, Y, y, z, yd, xd, Xmax, Xmin, Ymax, Ymin; PaintBox1->Refresh(); PaintBox1->Canvas->Rectangle(0,0,681,361); //cancella stringhe Canvas->TextOutA(10,320," "); Canvas->TextOutA(10,335," "); //acquisisce coordinate y=(Y1->Text).ToDouble(); x=(X1->Text).ToDouble(); //traccia gli assi PaintBox1->Canvas->MoveTo(0,280); PaintBox1->Canvas->MoveTo(500,280); PaintBox1->Canvas->MoveTo(20,0); PaintBox1->Canvas->MoveTo(20,300); //disegna retta yd=280-ceil((Y*260)/8); PaintBox1->Canvas->MoveTo(20,yd); PaintBox1->Canvas->LineTo(500,yd); //disegna grafico for(z=Xmin; z<=Xmax; z=z+0.001) { Ymax=(YMAX->Text).ToDouble(); Xmax=(XMAX->Text).ToDouble(); yd=280-ceil((y*260)/Ymax); xd=20+ceil((x*480)/Xmax); PaintBox1->Canvas->Pixels[xd][yd]=clRed; } }
    Ora il problema:
    1. Per il momento ho soltanto preso in considerazione XMAX, YMAX, X (X1), Y (Y1) e di certo non è difficile questa parte ma desidererei avere prima un risultato senza espandermi troppo sulle misure perchè ci sono priorità piu alte come il fatto che non disegna neanche gli assi;
    2. Non disegna gli assi delle ascisse e delle ordinate;
    3. Non disegna la retta;
    4. Devo fare in modo che ogni LabeledEdit debba essere riempita correttamente prima di disegnare il grafico, e quindi visualizzare un errore che inviti l'utente a riempire la casella mancante;

    Altre informazioni: Desidero fissare un XMIN e un YMIN a 0, e tramite apposita casella fissare sul grafico XMAX e YMAX. Tra XMIN e XMAX ci saranno tutte le X (X1, X2, X3...) e tra YMin e YMAX tutte le Y (Y1, Y2, Y3...). E di queste misure venga tracciato un grafico con una retta Z o qualsiasi.

    Potete darmi qualche delucidazione e qualche aiuto per completare il mio piccolo progetto?
    Grazie C=

    PS: Per qualsiasi informazione non chiara, sono pronto a rispondere alle vostre (spero semplici) domande ^-^

    Buona Domenica.

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    24
    Risolto Punto 1 e Punto 2.

    Cerco soluzioni riguardo:

    3. Non disegna la retta; (devo inserire i punti Z a coordinate X,Y come fare? )
    4. Devo verificare che ogni casella sia piena, altrimenti deve dare errore;

    Sono in attesa di aiuto C= Grazie ^-^

  3. #3
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Devi normalizzare il tutto alla dimensione del tua area di disegno. Esempio se hai 640x480

    la tua X andra' da -320 a 319 e la Y da -240 a 239, devi rapportare i punti da disegnare a queste dimensioni considera che o il min od il max deve rispettare l'estremo.
    Per gli Spartani e Sparta usa spartan Il mio github

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    24
    Si questo è abbastanza chiaro, ho bisogno di:

    1. Quando inserisco i dati e clicco il bottone di disegno del grafico, appaiono gli assi e dovrebbero (non ancora) apparire i punti con la retta che li unisce, ma se non inserisco tutti i dati nella tabella si blocca il programma, e devo fare in modo che invece di farlo bloccare, e utilizzare task manager, visualizzi un errore che invita a riempire la casella (dopo che si preme il bottone);

    2. Devo visualizzare i punti sul piano, come fare? Ho X e Y, deve trovare Z, X2 e Y2 deve trovare Z2 ed unirli assieme tramite un segmento, una retta.


    Puoi aiutarmi con esempi concreti? Con la logica ci sono arrivato, ma in pratica non so come ottenere i due risultati richiesti =) Grazieee ^-^

  5. #5
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Per il punto 1 hai problemi a controllare i valori inseriti xche? Il tuo codice nn è funzionante? Dove sta il problema?

    Per tracciare la linea in Windows puoi usare la LineTo altrimenti tocca che ti disegni punto punto la retta ma poi cmq devi passare il SO a questo punto ti tocca usare le GDI.

    codice:
    i = 0;
    x = x_point[i];
    y = y_point[i];
    to_video_coords(x,y);
    MoveToEx(hdc,x,y,NULL);
    for(;i<10;i++){
    	x = x_point[i];
    	y = y_point[i];
    	to_video_coords(x,y);
    	LineTo(hdc,x,y);
    }
    grosso modo il tuo codice è questo.
    Per gli Spartani e Sparta usa spartan Il mio github

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    24
    Per il primo problema è semplice.

    Esempio concreto: Un esperienza su un circuito elettrico mi consente di effettuare 10 misure di tensione V e 10 misure di corrente I. Inserisco i dati ricavati in un apposita tabella, dove V saranno le X e I saranno le Y. Ora, sbadatamente dimentico di riempire la casella 5 delle X e clicco il tasto Disegna Grafico. Il programma Non Risponde, si blocca (va chiuso forzatamente) o si chiude automaticamente dando errore. Desidero visualizzare un errore che mi avverta che la casella 5 è vuota e va riempita. (evitando strani effetti)

    Capisci?

    Per il secondo problema credo di essere prossimo al suicidio C=

    Praticamente ho 10 X e 10 Y, X e Y si incontrano nel punto Z, X2 e Y2 si incontrano in Z2 e cosi via. E in seguito Z si unisce con Z2, Z3, Z4 e cosi via tracciando una retta che parte dall'origine.

    Praticamente:

    codice:
    xd=350+ceil((x*350)/Xmax); 
    yd=180-ceil((y*180)/Ymax); 
    PaintBox1->Canvas->MoveTo((xo*xd),(yo*yd)); 
    PaintBox1->Canvas->LineTo((x1*xd),(y1*yd)); 
    PaintBox1->Canvas->LineTo((x2*xd),(y2*yd)); 
    PaintBox1->Canvas->LineTo((x3*xd),(y3*yd)); 
    PaintBox1->Canvas->LineTo((x4*xd),(y4*yd)); 
    PaintBox1->Canvas->LineTo((x5*xd),(y5*yd)); 
    PaintBox1->Canvas->LineTo((x6*xd),(y6*yd)); 
    PaintBox1->Canvas->LineTo((x7*xd),(y7*yd));
    PaintBox1->Canvas->LineTo((x8*xd),(y8*yd)); 
    PaintBox1->Canvas->LineTo((x9*xd),(y9*yd)); 
    PaintBox1->Canvas->LineTo((Xmax*xd),(Ymax*yd));

    Dove yd e xd sono le mie unità di misura. In teoria se stabilisco un segmento (unità di misura) che può essere supponiamo 20 pixel, se io ho una misura di 12 dovrei moltiplicare 12 per 20 pixel e vengono quindi fuori 12 segmenti su quell'asse.

    E qui ho un problema, perchè i punti sono sfalzati, non li visualizza come dovuto.

    Traccia la retta si, ma prende tutti e quattro i quadranti del piano cartesiano mentre dovrebbe limitarsi ad uno essendo solo dati positivi.

  7. #7
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    é una semplice proporzione poi la centri

    codice:
    x_point : x_max = x : x_vmax
    x = x_point * x_vmax / x_max
    Per gli Spartani e Sparta usa spartan Il mio github

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    24
    x = (x_point*pix_larg)/Xmax

    y = (y_point*pix_alt)/Ymax

    Dove:
    - x_point è la coordinata corrente della grandezza;
    - pix_larg è il numero dei pixel della larghezza del contenitore grafico;
    - pix_alt è il numero dei pixel dell'altezza del contenitore grafico;
    - Xmax è il valore massimo della grandezza presa in considerazione (fisica o elettrica);

    x = (1*350)/20 = 17,5 pixel

    Se la mia misura X5 è 5, la moltiplico per l'unità (17,5 pixel) e ottengo la misura dell'ascissa.

    y = (1*180)/20 = 9 pixel

    Se la misura Y5 è 2, la moltiplico per l'unità (9 pixel) e ottengo la misura dell'ordinata.

    L'incontro di questi due punti sul piano cartesiano è Z5. E deve passare una retta che dall'origine passi per Z5. Come realizzare quest'ultima operazione?

    Il ragionamento dell'unità di misura ti risulta? in teoria l'unità di misura non dovrebbe essere la stessa per entrambi gli assi? Perchè si fa eccezione qui? Grazie C=

  9. #9
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Il grafico è una rappresentazione appunto grafica di valori, non è detto che gli assi siano uguali, ci sono rappresantazioni dove i valori oltre ad avere un range completamente diverso sono di natura diversa, tipo un grafico finanziario etc etc.

    Per Z5, sinceramente mi è poco chiaro, non risolvi con

    codice:
    MoveToEx(hdc,0,0,NULL);
    LineTo(hdc,Z5x,Z5y);
    ?
    Per gli Spartani e Sparta usa spartan Il mio github

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2011
    Messaggi
    24
    Il grafico è una rappresentazione appunto grafica di valori, non è detto che gli assi siano uguali, ci sono rappresantazioni dove i valori oltre ad avere un range completamente diverso sono di natura diversa, tipo un grafico finanziario etc etc.
    Chiarissimo C=

    Per Z5, sinceramente mi è poco chiaro, non risolvi con codice:

    MoveToEx(hdc,0,0,NULL);
    LineTo(hdc,Z5x,Z5y);

    ?
    HDC che significato ha?
    Praticamente io ho X5 (abbiamo detto 5) e Y5 (abbiamo detto 2) e si incontrano in un punto che si chiama Z5. Purtroppo non esiste un Z5x e un Z5y.

    Ora è un esempio Z5, ma in realtà ci sono altri 10 valore X e Y per un risultato di 10 Z.
    Il punto 0 deve essere collegato da un segmento fino a Z1, Z1 fino a Z2, Z2 fino a Z3, Z3 fino a Z4, Z4 fino a Z5, Z5 fino a Z6, Z6 fino a Z7, Z7 fino a Z8, Z8 fino a Z9, Z9 fino a Z10 (che naturalmente sarà la misura massima, coordinate (Xmax, Ymax).

    Deve venire fuori una retta, anche se molto "geometrica e segmentata". Non del tutto diritta sicuramente.

    Chiaro piu o meno il dilemma? Sai risolvere?
    Grazie del tuo aiuto, non diretto con l'algoritmo ma molto centrato ed efficace sulla logica.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.