Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Aiuto FRATTALI in C

  1. #1

    Aiuto FRATTALI in C

    Ciao. Ho la passione per i frattali da ragazzino. Ho tentanto di fare un sorgente che generasse l'insieme di julia "parente di mandelbrot".
    Ho provato con le SDL e mi si è creata una enorme confusione in testa.
    SARA' LO STRESS!!
    Il problema è proprio rappresentare i punti sullo schermo all'interno di una finestra oppure memorizzarli in una superfice virtuale per poi stamparla a video. Usando le superfici virtuali si potrebbero creare infiniti frattali che differiscono per piccoli particolari da poter mostrare in sequenza per creare un animazione. Riporto l'algoritmo per generare l'insieme di JULIA.

    Spero qualcuno di voi mi aiuti a realizzarlo.

    L'insieme di mandelbrot come quello di julia si ottiene trasformando con delle funzioni le coordinate di tutti i punti di una porzione di piano. Otteniamo così un nuovo piano di forma differente "non rettangolare". Riapplicando la trasformazione al nuovo piano si ottiene un terzo piano. Iterando si ottiene l'intero frattale.


    int main()
    {
    // Queste quattro variabili definiscono la zona dell'insieme
    // di Julia
    const float xmin, ymin, xmax, ymax;
    xmin = -2;
    xmax = 2;
    ymin = -2;
    ymax = 2;
    // Queste due, invece, la risoluzione dello schermo
    const int xscr, yscr;
    xscr = 1280;
    yscr = 1024;
    // Queste ci servono per qualche conto: ogni pixel
    // rappresenterà una finestra sull'insieme di dimensioni
    // dx e dy
    float dx = (xmax - xmin) / xscr;
    float dy = (ymin - ymax) / yscr;
    // Questo sarà il massimo numero di iterazioni,
    // ossia il numero di iterazioni dopo il quale
    // un punto sarà dichiarato, d'ufficio,
    // sedentario
    const int maxiter = 2000;
    // Questa sarà la distanza dall'origine superata la quale
    // un punto sarà dichiarato, invece, irrecuperabile
    const float bailout = 4;
    // E adesso, la parte reale e quella immaginaria del parametro c
    float real_c = .11031;
    float imag_c = -.67037;
    // Inizia il ciclo principale, che prende ogni punto della finestra
    // di visualizzazione sul piano complesso, applica la formulaccia e
    // vede cosa succede
    // sx e sy saranno le coordinate di schermo;
    // rx e ry la parte reale ed immaginaria del punto corrispondente
    // al pixel di coordinate sx e sy
    // rx_squared e ry_squared i loro quadrati
    // modulus il modulo del punto

    float rx_squared, ry_squared;
    float modulus;
    int iter;
    for(int sy = 0; y <= ymax; y++)
    {
    for(int sx = 0; x <= xmax; x++)
    {
    rx = xmin + sx * dx;
    ry = ymax + sy * dy;
    rx_squared = rx^2;
    ry_squared = ry^2;
    // Ecco il ciclo che itera la successione
    iter = 0;
    // Togliendo il commento a queste due righe, si genera un insieme
    // di Mandelbrot, invece che uno di Julia... se ne parla più
    // avanti
    // float real_c = rx;
    // float imag_c = ry;
    do
    {
    // Queste due istruzioni elevano il numero complesso
    // di parte reale rx e parte immaginaria ry al quadrato,
    // ed aggiungono c
    ry = 2 * rx * ry + imag_c;
    rx = rx_squared - ry_squared + real_c;
    rx_squared = rx^2;
    ry_squared = ry^2;
    modulus = sqrt(rx_squared + ry_squared);
    } while ((++iter < maxiter) && (modulus < bailout));
    // Che facciamo, vogliamo anche tracciare qualcosa sullo schermo?
    // La funzione void plot(x, y, color) dovrebbe essere,
    // preferibilmente, una funzione che
    // tracci un pixel di colore color alle coordinate x, y
    //color dovrebbe essere l'indice di un colore nella palette dello
    //schermo attuale
    // Se volete fare i figaccioni, abbandonare le vetuste palette e
    // fare tutto in true color,
    // il discorso si complica, ma non troppo. Comunque, io non scendo
    // in dettagli
    // Voi e le vostre directx...
    // Nota: usare iter come colore ci dà la possibilità di colorare
    // ogni pixel
    // in base al numero di iterazioni che ha impiegato per dirigersi
    // verso l'infinito

    // Nel caso non si sia diretto verso l'infinito, il colore sarà
    // maxiter
    plot(sx, sy, iter);
    }
    }
    }

    "Questo Sorgente non lo ho scritto io"

    Aiutatemi
    :°°(

    Ciao

  2. #2

    Altro Sorgente FRATTALE

    SONO UN PO INSICURO SUL PRIMO SORGENTE.
    QUESTO ALGORITMO INVECE E' SICURAMENTE CORRETTO.

    /*VARIABILI GLOBALI*/
    double xmin=-2; /*PORZIONE DEL FRATTALE DA VISUALIZZARE*/
    double xmax=2.0; /*= = = = = = = = = = = = = = = = = = =*/
    double ymin=-2; /*= = = = = = = = = = = = = = = = = = =*/
    double ymax=2.0; /*= = = = = = = = = = = = = = = = = = =*(
    int pixelsX = 640; /*RISOLUZIONE IN LARGHEZZA*/
    int pixelsY = 480; /*ROSILUZIONE IN ALTEZZA*/
    int max_it = 255; /*NUMERO DI ITERAZIONI*/
    int x; /*ASCISSA DEL PUNTO SULLO SCHERMO*/
    int y; /*ORDINATA DEL PUNTO SULLO SCHERMO*/
    int iter; /*ITERAZIONE CORRENTE*/
    double real_C; /*PARTE REALE DI C*/
    double imag_C; /*PARTE IMMAGINARIA DI C*/
    double rx; /*PARTE REALE DEL PUNTO*/
    double ry; /*PARTE IMMAGINARIA DEL PUNTO*/
    double rx_quad; /*QUADRATO DELLA PARTE REALE DEL PUNTO*/
    double ry_quad; /*QUADRATO DELLA PARTE IMMAGINARIA DEL PUNTO*/

    double adattX = (xmax-xmin)/pixelX;
    double adattY = (ymax-ymin)/pixelY;

    DISEGNA_FRATTALE()
    {
    for(y=0; y<pixelY; y++)
    {
    for(x=0; x<pixelX; x++)
    {
    iter = 0;
    xc = yc = 0.0;
    real_C = xmin + adattY * ((float)x);
    imag_C = ymin + adattY * ((float)y);
    rx_quad = rx*rx;
    ry_quad = ry*ry;
    while((rx_quad + ry_quad) <= 16 && iter < max_it)
    {
    it++;
    rx = rx_quad - ry_quad + real_C;
    ry = 2.0 * xc * yc + imag_C;
    }
    if (iter < max_it) AccendiPixel(x,y,iterazione);
    }
    }

    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ti dirò: C non è il mio linguaggio di programmazione, ma nel Forum la regola generale è "fare una domanda". Hai postato del codice, ma non hai detto che cosa c'è che (non) va. Se non fai una domanda precisa (hai problemi su come rappresentare a schermo il risultato? Vuoi costruire punto a punto una immagine, o una sequenza di immagini? Etc...), difficilmente si riuscirà ad aiutarti.
    Ciao
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Be il secondo messaggio è solo un sorgente alternativo al primo nel caso il primo dovesse avere degli errori.
    Il probemi principali sono due. Dal momento che voglio realizzare il frattale sia statico che dinamico "animato"

    PROBLEMA1:
    Rappresenzate direttamente il punto sullo schermo usando una funzione del tip "accendiPixel(X,Y,COLOR);" usare i parametri RGB sarebbe un po un problema per creare tutte le sfumature possibili a seconda dell'interzione visto che COLOR=ITERAZIONE e un iterazioni non deve essere molto distinta dall'iterazione sucessiva. La funzione ideade e quella che prenda come parametro COLORE un valore che icrementando ripetutamente di 1 permetta di scorrerrere tutti i colori possibili ordinati in modo sfumato. Iterando infatti si deve ottenere una sfumatura.

    PROBLEMA2:
    Memorizzare tutti i punti dell'immagine, uno per volta all'interno di una superfice virtuale da poter stampare a video appena tale superfice contiene l'immagine completa. Per quanto riguarda i colori la situazione è la stessa del problema precedente.
    Considerare che nel caso volessi creare diverse immagini da mettere in sucessione per creare l'animazione vorrei usare una tecnica che mi garantisca la velocità massima nella rappresentazione. L'animazione può essere fatta di migliaia di immagini da 1024x768 e temo possano occupare molto spazio.

    ULTIMA COSA. Il tutto deve essere rappresentato dentro una finestra e per ora le so realizzare solo con le GTK

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.