[ Srdjan1702 @ 21.01.2010. 09:52 ] @
Ovako ja sam student i dobi sam za zadatak izracunati matricu. Potrebno je nacrtati algoritam i napisati program pa Vas molim da mi pomognete. Zadatak glasi ovako:

Članovi celobrojne kvadratne matrice L dimenzije M predstavljaju tačke na monitoru (slika je sastavljena od tacaka). Ako član L (i,j) ima vrednost i onda tačka sa koordinatama i,j svetli, a ne svetli ako ima vrednost 0. Nacrtati algoritam i napisati opšti potprogram koji "crta" svetlu liniju na tamnoj pozadini od tačke (i1,j1) do tačke (i2,j2). (podrazumeva se da su 1 ≤ i1, j1, i2, j2 ≤ M). Napomena: linija je izlomljena što je posledica zaokruživanja realnih koordinata duž linije na celobrojne vrednosti.



Hvala unapred
[ Mihajlo Cvetanović @ 21.01.2010. 10:47 ] @
Ono što ti treba je algoritam za crtanje linije, iliti u gugl-jeziku "line drawing algorithm". Jedan koristan link je i ka Vikipediji: http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
[ Srdjan1702 @ 21.01.2010. 12:31 ] @
uuf ja tebe nista ne razumem , pogledao sam to ali ni to nista ne razumem , ne razumem se u programiranje uopste , to je za mene spansko selo :/
[ Mihajlo Cvetanović @ 21.01.2010. 13:03 ] @
Neću da ti dajem gotovo rešenje, ali ako proguglaš ovo "line drawing algorithm" moguće je da ćeš pronaći gotovo rešenje na internetu u onom programskom jeziku koji ti treba. A možda ti se i ovde neka dobra duša smiluje :-)
[ X Files @ 21.01.2010. 13:29 ] @
Srdjane, na ovom forumu se ne daju gotova resenja, vec se pruza pomoc u izradi.

Posto imam malo slobodnog vremena i volje, pomocicu ti oko skeleta programa, koji se odnosi na:
1. dinamicko kreiranje matrice L (pretpostavljam da treba dinamicki jer se pominje M)
2. unos svih potrebnih podataka
3. inicijalizovanje matrice (imaginarnog ekrana)
4. PRAZNO MESTO GDE SAMO TREBA DA IMPLEMENTIRAS ALGORITAM KOJI TI JE MIHAJLO DAO
5. ispis
6. oslobadjanje zauzete memorije


Code:

/*
Članovi celobrojne kvadratne matrice L dimenzije M predstavljaju
tačke na monitoru (slika je sastavljena od tacaka).

Ako član L (i,j) ima vrednost i onda tačka sa koordinatama i,j
svetli, a ne svetli ako ima vrednost 0.

Nacrtati algoritam i napisati opšti potprogram koji "crta" svetlu
liniju na tamnoj pozadini od tačke (i1,j1) do tačke (i2,j2).
(podrazumeva se da su 1 ≤ i1, j1, i2, j2 ≤ M).

Napomena: linija je izlomljena što je posledica zaokruživanja realnih
koordinata duž linije na celobrojne vrednosti.
*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    /* dimenzija kvadratne matrice */
    int M;

    /* Pokazivac na pokazivac na int (za matricu cija se dimezija odredjuje dinamicki) */
    int **L;

    /* brojaci za petlju za dinamicko kreiranje matrice L*/
    int i, j;

    /* koordinate tacaka 1 i 2*/
    int i1, j1, i2, j2;

    /* Unos dimenzije matrice */
    do
    {
        printf ( "Unesite dimenziju M matrice L: " ); scanf ( "%d", &M );
    } while ( M<1 );


    /* Dinamicko kreiranje matrice: */

    /* kolone */
    L = (int**) malloc ( M * sizeof( int* ) );
    if ( L == NULL )
    {
        printf( "Matrica L nije kreirana!\n" );
        exit( EXIT_FAILURE );
    }

    /* vrste */
    for ( i=0; i<M; i++ )
    {
        *(L+i) = (int*) malloc ( M * sizeof( int ) );

        if ( *(L+i) == NULL )
        {
            printf( "Matrica L nije kreirana!\n" );
            exit( EXIT_FAILURE );
        }
    }


    /* inicijalizovanje na NULU (simulacija prazanog ekrana)*/
    /* ovo se moglo i sa calloc() */
    for ( i=0; i<M; i++ )
        for ( j=0; j<M; j++ )
            *(*(L+i)+j) = 0;

    /* Unos tacke 1 */
    printf("UNOS TACKE 1\n");
    do
    {
        printf ( "X1=" ); scanf ( "%d", &i1 );
    } while ( i1<1 || i1>M );

    do
    {
        printf ( "Y1=" ); scanf ( "%d", &j1 );
    } while ( j1<1 || j1>M );

    /* Unos tacke 2 */
    printf("UNOS TACKE 2\n");
    do
    {
        printf ( "X2=" ); scanf ( "%d", &i2 );
    } while ( i2<1 || i2>M );

    do
    {
        printf ( "Y2=" ); scanf ( "%d", &j2 );
    } while ( j2<1 || i2>M );



    /*
        OVDE TREBA FUNKCIJA ILI KOD KOJI RADI SA ARGUMENTIMA i1, j1, i2, j2,
        (RECIMO PO ALGORITMU KOJI SI DOBIO), I DA UPISUJE JEDINICU:
        *(*(L+KOORDINATA_X)+KOORDINATA_Y) = 1;
        ...TAMO GDE ALGORITAM KAZE.
    */


    /* Ispis */
    for (i=0; i<M; i++)
    {
        for ( j=0; j<M; j++ )
            printf ("%d", *(*(L+i)+j));
        putchar ('\n');
    }


    /* Unistavanje matrice */
    for ( i=0; i<M; i++)
        free( *(L+i) );
    free ( L );

    return 0;
}
[ Srdjan1702 @ 21.01.2010. 17:40 ] @
Ljudi puno vam Hvala , pomogli ste mi puno od ovog mi zavisi ocena , i da znate da vam zavidim , pozdrav
[ X Files @ 21.01.2010. 20:23 ] @
Malo sam bio dokon.
Code (c):

/*
Članovi celobrojne kvadratne matrice L dimenzije M predstavljaju
tačke na monitoru (slika je sastavljena od tacaka).

Ako član L (i,j) ima vrednost i onda tačka sa koordinatama i,j
svetli, a ne svetli ako ima vrednost 0.

Nacrtati algoritam i napisati opšti potprogram koji "crta" svetlu
liniju na tamnoj pozadini od tačke (i1,j1) do tačke (i2,j2).
(podrazumeva se da su 1 ≤ i1, j1, i2, j2 ≤ M).

Napomena: linija je izlomljena što je posledica zaokruživanja realnih
koordinata duž linije na celobrojne vrednosti.
*/


#include <stdio.h>
#include <stdlib.h>


int main()
{
    /* potrebno algoritmu */
    int dy, dx;
    int stepx, stepy;
    int fraction;
    /* potrebno algoritmu - kraj */

    /* dimenzija kvadratne matrice */
    int M;

    /* Pokazivac na pokazivac na int (za matricu cija se dimezija odredjuje dinamicki) */
    int **L;

    /* brojaci za petlju za dinamicko kreiranje matrice L*/
    int i, j;

    /* koordinate tacaka 1 i 2*/
    int i1, j1, i2, j2;

    /* unos dimenzije matrice */
    do
    {
        printf ( "Unesite dimenziju M matrice L: " ); scanf ( "%d", &M );
    } while ( M<1 );


    /* dinamicko kreiranje matrice */

    /* kolone */
    L = (int**) malloc ( M * sizeof( int* ) );
    if ( L == NULL )
    {
        printf( "Matrica L nije kreirana!\n" );
        exit( EXIT_FAILURE );
    }

    /* vrste */
    for ( i=0; i<M; i++ )
    {
        *(L+i) = (int*) malloc ( M * sizeof( int ) );

        if ( *(L+i) == NULL )
        {
            printf( "Matrica L nije kreirana!\n" );
            exit( EXIT_FAILURE );
        }
    }


    /* inicijalizovanje na NULU (simulacija prazanog ekrana)*/
    /* ovo se moglo i sa calloc() */
    for ( i=0; i<M; i++ )
        for ( j=0; j<M; j++ )
            *(*(L+i)+j) = 0;

    /* Unos tacke 1 */
    printf("UNOS TACKE 1\n");
    do
    {
        printf ( "X1=" ); scanf ( "%d", &i1 );
    } while ( i1<1 || i1>M );

    do
    {
        printf ( "Y1=" ); scanf ( "%d", &j1 );
    } while ( j1<1 || j1>M );

    /* Unos tacke 2 */
    printf("UNOS TACKE 2\n");
    do
    {
        printf ( "X2=" ); scanf ( "%d", &i2 );
    } while ( i2<1 || i2>M );

    do
    {
        printf ( "Y2=" ); scanf ( "%d", &j2 );
    } while ( j2<1 || i2>M );


    /* ovim sinhronizujemo zahteve zadatka, gde indeksi pocinju od 1*/
    /* sa zahtevima algoritma gde indeksi pocinju od 0 */
    --i1;
    --i2;
    --j1;
    --j2;



    /* ALGORITAM: http://www.cs.unc.edu/~mcmillan/comp136/Lecture6/Lines.html */
    /*   i1=X0, j1=Y0, i2=X1, j2=Y1 */

    dy = j2 - j1;
    dx = i2 - i1;


    if (dy < 0) { dy = -dy;  stepy = -1; } else { stepy = 1; }
    if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
    dy <<= 1;
    dx <<= 1;

    *(*(L+j1)+i1) = 1;
    if ( dx > dy )
    {
        fraction = dy - ( dx >> 1 );
        while ( i1 != i2 )
        {
            if ( fraction >= 0 )
            {
                j1 += stepy;
                fraction -= dx;
            }
            i1 += stepx;
            fraction += dy;
            *(*(L+j1)+i1) = 1;
        }
    }
    else
    {
        fraction = dx - (dy >> 1);
        while ( j1 != j2 )
        {
            if ( fraction >= 0 )
            {
                i1 += stepx;
                fraction -= dy;
            }
            j1 += stepy;
            fraction += dx;
            *(*(L+j1)+i1) = 1;
        }
    }
    // ALGORITAM: kraj


    /* ispis */
    for (i=0; i<M; i++)
    {
        for ( j=0; j<M; j++ )
            printf ("%d", *(*(L+i)+j));
        putchar ('\n');
    }

    /* unistavanje matrice */
    for ( i=0; i<M; i++)
        free( *(L+i) );
    free ( L );

    /* izlaz iz programa */
    return 0;
}
 



Unesite dimenziju M matrice L:8
UNOS TACKE 1
X1=2
Y1=2
UNOS TACKE 2
X2=7
Y2=2
00000000
01111110
00000000
00000000
00000000
00000000
00000000
00000000



Unesite dimenziju M matrice L:8
UNOS TACKE 1
X1=1
Y1=1
UNOS TACKE 2
X2=8
Y2=8
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001



Unesite dimenziju M matrice L:8
UNOS TACKE 1
X1=1
Y1=2
UNOS TACKE 2
X2=2
Y2=7
00000000
10000000
10000000
10000000
01000000
01000000
01000000
00000000



Unesite dimenziju M matrice L:8
UNOS TACKE 1
X1=8
Y1=1
UNOS TACKE 2
X2=2
Y2=8
00000001
00000010
00000100
00001000
00001000
00010000
00100000
01000000