Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C] Stampare parte di una matrice

    Salve ragazzi vorrei cercare di stampare solo una parte di una matrice, cioè io conosco una punto della matrice (x,y) e vorrei stampare il riquadro di lunghezza 5 per esempio:

    se ho tipo una matrice 10x10 e voglio stampare il riquadro avente punto centrale (6,5) di dimensione due devo:

    0000000000
    0000000000
    0000000000
    0011111000
    0011111000
    0011c11000
    0011111000
    0011111000
    0000000000
    0000000000

    c=centro , devo stampare solo dove compare 1 poichè il riquadro è di lunghezza due.

    Qualcuno può aiutarmi?

    Aggiungo, la matrice è toroidale.
    Ultima modifica di gaten; 08-02-2014 a 19:09
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Uhm, non mi pare ci sia nulla di così difficile... se chiami il punto centrale C=(cx, cy) e la "semilunghezza" del quadrato l:
    • calcola gli estremi del quadrato da stampare: UL=(cx-l, cy-l), LR=(cx+l, cy+l) (UL e LR stanno per "upper-left" e "lower-right");
    • "clippa" i valori così calcolati rispetto alle dimensioni effettive dell'array (ovvero, se una qualunque delle coordinate così ottenute è negativa la imposti a zero, se una delle x supera o è uguale alla larghezza la imposti alla larghezza-1, analogamente per le y);
    • stampa i valori che ti interessano con due for annidiati:
      codice:
      for(int x=ulx; x<lrx; ++x)
          for(int y=uly; y<lry; ++y)
              printf("%d", matrice[y][x]);


    --- edit --- per matrice toroidale intendi che è periodica? in tal caso, invece di clippare gli estremi devi prenderli in modulo rispetto alla larghezza (per le x) e all'altezza (per le y). Nota che, dato che in C non è definito il funzionamento dell'operatore modulo (%) per numeri negativi, la cosa migliore è ricondursi sempre ai positivi aggiungendo a tutte le x la larghezza e a tutte le y l'altezza prima di effettuare il modulo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Io ho Risolto così:

    codice:
    void StampaRiquadro(MAPPA *Mappa, COORDINATE Pos, int LunghezzaRiq){
    	i=Pos.X-LunghezzaRiq;
    	j=Pos.Y-LunghezzaRiq;
    
    
    	while ( i < LunghezzaRiq*2)
    	{
    		if ( i > Mappa->NColonne )
    			i=0;
    		while( j < LunghezzaRiq*2)
    		{
    			if ( j > Mappa->NRighe )
    				j=0;
    			if (Mappa->Mappa[i][j] != 0)
    				printf("%c", 250);	// Stampo labirinto
    			else if(Mappa->Mappa[i][j] == 0)
    				printf("%c", 178);	// stampo muro
    		
    		   	j++;
    		}
    		i++;
    	} 
    }
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    MItaly, ho provato la mia funzione ma non va, praticamente io ho un ciclo(gameloop) del tipo:

    do {
    ...
    }
    while (!Terminato)

    Ora ad ogni iterazione io ottengo delle coordinate x e y e in base a queste devo un intorno a questo punto intorno che vale "lunghezzaIntorno". Inoltre la matrice è toroidale,quindi quando mi trovo sulla ultima colonna , se ottengo una x > numero righe matrice, allora x vale 0, cioè colonna opposta(la prima), analogamente per la prima e l'ultima riga.

    praticamente devo fare in modo che appena vi è una coordinata che occupa l'area con centro (cx,cy), setto un flag a 1 altrimenti resta a 0;

    codice:
    // se (nx,ny) è un punto che appartiene all'area la funzione deve restituire 1
    int foo(int cx, int cy, int lunghezzaArea, int nx, int ny)
    {
        int ulx, lrx;
        int uly, lry;
        int flag=0;
     
        // bisogna prenderle in modulo poichè l'universo è toroidale
        ulx=cx-Nemico->AreaIns;
        lrx=cx+Nemico->AreaIns;
        uly=cy-Nemico->AreaIns;
        lry=cy+Nemico->AreaIns;
    
    
        for(int x=ulx; x<lrx; ++x)
                for(int y=uly; y<lry; ++y)
                       if(ulx <= nx <= lrx || uly <= ny <= lry)
                              flag=1;
    
    
        return flag;
    }
    Ultima modifica di gaten; 12-02-2014 a 20:07
    Con i sogni possiamo conoscere il futuro...

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Aggiungo:

    Riguardo al calcolo degli indici in una matrice toroidale, il problema non c'è se sono sulla prima colonna o ultima colonna dove calcolo in questo modo il prossimo indice:

    NewY=((y-1)+NColonne) % NColonne,
    esempio:

    in una matrice 3x3:

    111
    111
    q11

    sono nella prima colonna (2,0) , l'elemento che si trova sulla sua sinistra è: (2,2) quindi:

    NewY=((0-1)+3) % 3 = 2 % 3 = 2 quindi va bene, analogamente se mi trovo nell'ultima colonna

    (0,2)

    NewY=((y+1) % NColonne)=((2+1) % 3) = 3 % 3 = 0

    Il problema sorge se sono nella prima riga o ultima riga, se uso la stessa formula ho:
    esempio sono in (0, 1) , l'elemento in alto dovrebbe essere (2,1) quindi:

    NewX = ( (x-1) % NRighe ) = (2-1) % 3 = 1 % 3 = 1 e non va bene, mentre la formula va benissimo se tipo non mi trovo nella prima.
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Allora ragazzi io ho risolto (in parte) così:

    codice:
    int foo(int x1,int y1, int x2, int y2, int l)
    {
        int ulx, lrx;
        int uly, lry;
        int flag=0;
    
    
        // bisogna prenderle in modulo poichè l'universo è toroidale
        ulx=(x1-2+l) % l;
        lrx=(x1+2) % l;
        uly=(y1-2+l) % l;
        lry=(y1+2) % l;
        
        if ( (ulx <= x2 && x2 <= lrx) &&
             (uly <= y2 && y2 <= lry))
        flag=1;
    
    
    
    
        return flag;
    }
    Funziona , tranne in un solo caso, cioè se tipo mi trovo

    0,0,0,0,0,0,0,0
    0,0,0,0,0,0,0,0
    0,0,0,0,0,0,0,0
    0,2,0,0,0,0,0,1
    0,0,0,0,0,0,0,0
    0,0,0,0,0,0,0,0
    0,0,0,0,0,0,0,0
    0,0,0,0,0,0,0,0

    Se il centro è dove stà il 2(x1,y1) e 1(x2,y2) invece indica la coordinata del punto che invade l'area, in questo caso non va bene perchè calcolando ulx , questo è uguale a 7 e fa:

    if (7 <= 7 && 7 <= 3) && ( 1<=3 && 3 <= 5) , dovrebbe andare bene ma nella prima condizione fa 7<= 3 e sballa.
    Con i sogni possiamo conoscere il futuro...

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.