Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)

[ Pregleda: 2397 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Srdjan1702
Srdjan Vojnovic
Student
Subotica , Srbija

Član broj: 247991
Poruke: 3
147.91.202.*

Sajt: www.allegroambulanta.com


Profil

icon [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)21.01.2010. u 09:52 - pre 173 meseci
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
PLAŠIM SE JEDINO BESMRTNOSTI DUŠE
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)21.01.2010. u 10:47 - pre 173 meseci
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
 
Odgovor na temu

Srdjan1702
Srdjan Vojnovic
Student
Subotica , Srbija

Član broj: 247991
Poruke: 3
109.93.150.*

Sajt: www.allegroambulanta.com


Profil

icon Re: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)21.01.2010. u 12:31 - pre 173 meseci
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 :/
PLAŠIM SE JEDINO BESMRTNOSTI DUŠE
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)21.01.2010. u 13:03 - pre 173 meseci
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 :-)
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
212.200.65.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)21.01.2010. u 13:29 - pre 173 meseci
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;
}
 
Odgovor na temu

Srdjan1702
Srdjan Vojnovic
Student
Subotica , Srbija

Član broj: 247991
Poruke: 3
109.93.150.*

Sajt: www.allegroambulanta.com


Profil

icon Re: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)21.01.2010. u 17:40 - pre 173 meseci
Ljudi puno vam Hvala , pomogli ste mi puno od ovog mi zavisi ocena , i da znate da vam zavidim , pozdrav
PLAŠIM SE JEDINO BESMRTNOSTI DUŠE
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)21.01.2010. u 20:23 - pre 173 meseci
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
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Crtanje linije na matrici (1=tacka, 0=prazno)

[ Pregleda: 2397 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.