Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156

    [C++] plot di funzioni: scelta dell'intervallo tra i punti

    ho ripreso dopo molto tempo un progetto che avevo iniziato un po' di tempo fa: un programma scritto in c++ (framework QT) che disegnasse grafici (sia nella forma y=f(x) sia f(x,y)=0 )

    nonostante sto utilizzando Qt il mio problema è al livello dell'algoritmo ideale per riuscire a disegnare il grafico "senza lasciare spazi vuoti". mi spiego meglio.
    Ecco il codice (semplificato, per ora mi interessa capire il metodo da seguire)
    codice:
    //...
    QGraphicsScene *scena;
    //...
    
    
    
    //mi trovo in uno slot che viene chiamato alla pressione di un bottone
    void MainWindow::on_pushButton_clicked()
    {
    //inizializzo l'ambiente grafico
        scena=new QGraphicsScene;
        ui->graphicsView->setScene(scena);
    
    //disegno gli assi cartesiani    
    scena->addLine(-(ui->graphicsView->width()/2)-1,0,(ui->graphicsView->width()/2)-1,0);
    scena->addLine(0,-(ui->graphicsView->height()/2)-1,0,(ui->graphicsView->height()/2)-1);
        ui->graphicsView->setAlignment(Qt::AlignCenter);
    questa invece è la parte dove trovo i punti da disegnare

    codice:
    //PARTE IMPORTANTE QUI 
    //513x338 sono le dimensioni del graphicsview
    
    double convertx;
    convertx=(double)20/(double)513;    //francamente non ricordo perchè questo 20 a numeratore, ma avrò avuto un buon motivo...forse
    double converty;
    converty=(double)20/(double)338;
       //fattore di conversione=1/step
    
        for(int x=-256;x<256;x++)
        {
    
            double tempx;
            tempx=x*convertx;
    
            double tempy;
            tempy=1/sin(tempx*tempx); //questa è solo una funzione di prova, nella versione definitiva l'utente potrà inserirla run time
    
            double y;
            y=tempy/convertx;
            scena->addLine(x,-y,x,-y);
    
    
    
        }
    
        ui->graphicsView->centerOn(0,0);
    
    }
    in pratica ho usato le variabili convertx e converty per passare a valori di x e y che potessero meglio essere utilizzati per rappresentarli sul piano, ma il risultato è quello allegato.

    a parte che mi sembra di aver confuso un po' troppo il codice, ma oltretutto il risultato non è quello sperato (non pretendo questo http://www.google.it/#rlz=1C2_____en...&q=y%3D1%2Fsin(x)&oq=y%3D1%2Fsin(x)&gs_l=hp.3..0i30l2j0i8i30l2.9 6993.97147.4.97940.2.2.0.0.0.1.204.402.0j1j1.2.0.. .0.0.0..1c.1.17.psy-ab.7TR-StobswY&pbx=1&bav=on.2,or.r_qf.&bvm=bv.47883778,d. bGE&fp=d5b4d4f11448880b&biw=1280&bih=638
    però almeno vorrei evitare quei punti la cui distanza l'uno con l'altro va sempre più aumentando)
    Immagini allegate Immagini allegate

  2. #2
    Il classico modo per risolvere è non disegnare singoli punti, ma unirli con delle linee.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    hai ragione, e ci avevo pure pensato, ma i problemi nascono qualora devo disegnare, ad esempio.

    x-sin(y)=0

    dato che l'algoritmo che utilizzo per trovare i punti da disegnare è il seguente:
    -scorro le x da "min" a "max" (inseriti dall'utente)
    -per ogni xval:
    *uso il metodo delle tangenti di newton per trovare tutte le ordinate dei punti con ascissa xval (trovando gli zeri della funzione f(xval,y) )
    *salvo tali punti in un vettore
    *stampo i punti

    come faccio a sapere, dati due vettori che genero trovando i punti con ascissa xval e xval+step (dove step è l'intervallo), quali devo unire tra loro con una linea?

    http://www.wolframalpha.com/input/?i=x-sin%28y%29%3D0

    metti che in un vettore ho tutti i punti con ascissa -1 e in un altro quelli con ascissa -1+step per esempio.

    spero di aver spiegato chiaramente i miei dubbi

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 © 2025 vBulletin Solutions, Inc. All rights reserved.