Macchia grigia

di il
3 risposte

Macchia grigia

Salve, devo scrivere un programma in C++ con allegro e non so da dove iniziare, di una macchia grigia (un puntino) che con il passare del tempo si allarga e poi diventa più scura al centro. Tutto in modo random.

3 Risposte

  • Re: Macchia grigia

    La domanda e' un po' troppo generica!

    1) quanto ne sai di programmazione in C/C++
    2) quanto ne sai di computer grafica
    3) quanto ne sai di sprite
    4) quanto ne sai utilizzo di librerie di terze parti
    5) per quale sistema operativo

    In pratica:
    1) SAPENDO programmare in C/C++
    2) SAPENDO come funziona la compuer grafica
    3) SAPENDO come scaricare, compilare ed installare una libreria di terze parti

    non faresti questo tipo di domanda.

    In altri termini: la cosa e' ragionevolmente complicata e non puo' essere spiegata a suon di POST.
    Non per cattiveria, sia chiaro, ma per la QUANTITA' di informazioni necessarie per rispondere ragionevolmente ad ogni punto.

    Se hai un problema SPECIFICO si puo' fare sicuramente qualcosa.
  • Re: Macchia grigia

    Scusate, volevo mantenermi sul generico per non farla troppo difficile...
  • Re: Macchia grigia

    Comunque il problema specifico è che questo codice non va, e non riesco a capire perchè..

    questo il codice..


    #include <allegro>
    #include <vector>
    #include <algorithm>
    #include <stdlib.h>
    #include <time.h>

    using namespace std;
    struct cell {//defining cell
    int place;
    char p;
    bool is_stem;
    };
    static const int N = 2000; //lattice size
    bool lattice[N*N] = {false}; //empty lattice
    vector<cell> cells; //vector containing all cells present in the system

    static const int indcNeigh[] = {-N-1, -N, -N+1, -1, 1, N-1, N, N+1};//neighborhood
    char pmax=10; //proliferation capacity
    double pDiv=1./24.; //division probability
    double alpha=0.05; //spontaneous death probability
    double ps=0.05; //probability of symmetric division
    double pmig=10./24.; //probability of migration
    void initialize() {
    for (int i=0; i<N; i++) {lattice=true;};//filling left
    for (int i=0; i<N*N; i=i+N) {lattice=true;};//filling top
    for (int i=N-1; i<N*N; i=i+N) {lattice=true;};//filling bottom
    for (int i=N*(N-1); i<N*N; i++) {lattice=true;};//filling right

    lattice[N/2*N+N/2] = true; //initial cell in the middle
    cell initialCell = {N/2*N+N/2,pmax,true};//initial cell definition
    cells.push_back(initialCell);
    }
    int returnEmptyPlace(int indx) {
    int neigh[8], nF = 0;
    for(int j=0;j<8;j++) {//searching through neighborhood
    if (!lattice[indx+indcNeigh[j]]) {//if free spot
    neigh[nF] = indx+indcNeigh[j]; //save the index
    nF++; //increase the number of found free spots
    }
    }
    if(nF) {//selecting free spot at random
    return neigh[rand() % nF];
    } else {//no free spot
    return 0;
    }
    }
    void simulate(int nSteps) {

    vector<cell> cellsTmp;
    int newSite;
    cell currCell, newCell;

    for (int i=0; i<nSteps; i++) {
    random_shuffle(cells.begin(), cells.end()); //shuffling cells
    while (!cells.empty()) {
    currCell=cells.back(); //pick the cell
    cells.pop_back();
    newSite = returnEmptyPlace(currCell.place);

    if (newSite) {//if there is a new spot
    newCell = currCell;
    newCell.place = newSite;
    if ((double)rand()/(double)RAND_MAX < pDiv) {
    if (currCell.is_stem) {
    lattice[newSite]=true;
    cellsTmp.push_back(currCell);
    if ((double)rand()/(double)RAND_MAX > ps) {//asymmetric division
    newCell.is_stem = false;
    }
    cellsTmp.push_back(newCell);
    } else if (currCell.p > 0 && (double)rand()/(double)RAND_MAX > alpha) {
    currCell.p--;
    newCell.p--;
    lattice[newSite] = true;
    cellsTmp.push_back(currCell);
    cellsTmp.push_back(newCell);
    } else {
    lattice[currCell.place] = false;
    }
    } else if ((double)rand()/(double)RAND_MAX < pmig) {
    lattice[currCell.place] = false;
    lattice[newSite] = true;
    cellsTmp.push_back(newCell);
    } else {//doing nothing
    cellsTmp.push_back(currCell);
    }
    } else {//no free spot
    cellsTmp.push_back(currCell);
    }
    }
    cells.swap(cellsTmp);
    }
    }
    int main() {
    srand(time(NULL)); //initialize random number generator
    initialize(); //initialize CA
    simulate(24*30*6);
    return 0;
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte