eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › nastepny punkt
Ilość wypowiedzi w tym wątku: 17

  • 1. Data: 2017-03-12 22:46:27
    Temat: nastepny punkt
    Od: fir <p...@g...com>

    szukam dosyc prostego algorytmu

    mam punkt int x,y np 0,0
    i chce znalezc nastepny punkt
    w kierunku jakiegos dowolnego punktu
    int dist_x, dist_y, tak jak gdybym
    rysowal linie prostą

    jak wzynaczyc ten przylegly punkt?


  • 2. Data: 2017-03-12 22:57:04
    Temat: Re: nastepny punkt
    Od: bartekltg <b...@g...com>

    On 12.03.2017 22:46, fir wrote:
    > szukam dosyc prostego algorytmu
    >
    > mam punkt int x,y np 0,0
    > i chce znalezc nastepny punkt
    > w kierunku jakiegos dowolnego punktu
    > int dist_x, dist_y, tak jak gdybym
    > rysowal linie prostą
    >
    > jak wzynaczyc ten przylegly punkt?
    >

    Algorytm Bresenhama

    pzdr
    bartekltg


  • 3. Data: 2017-03-12 23:23:34
    Temat: Re: nastepny punkt
    Od: fir <p...@g...com>

    W dniu niedziela, 12 marca 2017 22:57:05 UTC+1 użytkownik bartekltg napisał:
    > On 12.03.2017 22:46, fir wrote:
    > > szukam dosyc prostego algorytmu
    > >
    > > mam punkt int x,y np 0,0
    > > i chce znalezc nastepny punkt
    > > w kierunku jakiegos dowolnego punktu
    > > int dist_x, dist_y, tak jak gdybym
    > > rysowal linie prostą
    > >
    > > jak wzynaczyc ten przylegly punkt?
    > >
    >
    > Algorytm Bresenhama
    >
    raczej fragment bressenhama ale jaki
    dokladnie?


  • 4. Data: 2017-03-12 23:47:03
    Temat: Re: nastepny punkt
    Od: fir <p...@g...com>

    W dniu niedziela, 12 marca 2017 23:23:35 UTC+1 użytkownik fir napisał:
    > W dniu niedziela, 12 marca 2017 22:57:05 UTC+1 użytkownik bartekltg napisał:
    > > On 12.03.2017 22:46, fir wrote:
    > > > szukam dosyc prostego algorytmu
    > > >
    > > > mam punkt int x,y np 0,0
    > > > i chce znalezc nastepny punkt
    > > > w kierunku jakiegos dowolnego punktu
    > > > int dist_x, dist_y, tak jak gdybym
    > > > rysowal linie prostą
    > > >
    > > > jak wzynaczyc ten przylegly punkt?
    > > >
    > >
    > > Algorytm Bresenhama
    > >
    > raczej fragment bressenhama ale jaki
    > dokladnie?

    w sumie to chyba bedzie cos takiego

    int2 NextPointTowards(int x, int y, int dest_x, int dest_y)
    {
    int2 n = {x, y};

    int dx = dest_x - x;
    int dy = dest_y - y;

    int sx = sign(dx);
    int sy = sign(dy);

    if(sx==0) n.y += sy;
    else if(sy==0) n.x += sx;
    else
    {
    float m = fabs(((float)dy)/dx);

    if( m < 0.5) n.x += sx;
    else if( m > 2.0) n.y += sy;
    else { n.x += sx; n.y += sy; }
    }

    return n;

    }

    mozna by wywalic dzielenie zastepujac ifem ale nie wiedomo czy if szybszy

    pozatym w dzialaniu to chyba nie zastpi bresenhama (trzebby sprawdzic) choc mw o to
    mi chodzi bo taka procedura jest jaby bardziej ogolna


  • 5. Data: 2017-03-13 01:15:11
    Temat: Re: nastepny punkt
    Od: fir <p...@g...com>

    W dniu niedziela, 12 marca 2017 23:47:04 UTC+1 użytkownik fir napisał:
    > W dniu niedziela, 12 marca 2017 23:23:35 UTC+1 użytkownik fir napisał:
    > > W dniu niedziela, 12 marca 2017 22:57:05 UTC+1 użytkownik bartekltg napisał:
    > > > On 12.03.2017 22:46, fir wrote:
    > > > > szukam dosyc prostego algorytmu
    > > > >
    > > > > mam punkt int x,y np 0,0
    > > > > i chce znalezc nastepny punkt
    > > > > w kierunku jakiegos dowolnego punktu
    > > > > int dist_x, dist_y, tak jak gdybym
    > > > > rysowal linie prostą
    > > > >
    > > > > jak wzynaczyc ten przylegly punkt?
    > > > >
    > > >
    > > > Algorytm Bresenhama
    > > >
    > > raczej fragment bressenhama ale jaki
    > > dokladnie?
    >
    > w sumie to chyba bedzie cos takiego
    >
    > int2 NextPointTowards(int x, int y, int dest_x, int dest_y)
    > {
    > int2 n = {x, y};
    >
    > int dx = dest_x - x;
    > int dy = dest_y - y;
    >
    > int sx = sign(dx);
    > int sy = sign(dy);
    >
    > if(sx==0) n.y += sy;
    > else if(sy==0) n.x += sx;
    > else
    > {
    > float m = fabs(((float)dy)/dx);
    >
    > if( m < 0.5) n.x += sx;
    > else if( m > 2.0) n.y += sy;
    > else { n.x += sx; n.y += sy; }
    > }
    >
    > return n;
    >
    > }
    >
    > mozna by wywalic dzielenie zastepujac ifem ale nie wiedomo czy if szybszy
    >
    > pozatym w dzialaniu to chyba nie zastpi bresenhama (trzebby sprawdzic) choc mw o to
    mi chodzi bo taka procedura jest jaby bardziej ogolna

    zrobilem testy i okazalo sie ze to nie dziala dobrze

    http://minddetonator.htw.pl/compact.jpg

    gorna linia to normalne a dolna dolna linia to wynik generowania tych punktow
    wyzej

    teraz pytaine czy da sie to przepisac tak by generowalo porzadna linie (tez biorac za
    helper tylko punkt docelowy) czy tez trzeba uzyc wersji na floatach


  • 6. Data: 2017-03-13 12:38:12
    Temat: Re: nastepny punkt
    Od: bartekltg <b...@g...com>

    On 13.03.2017 01:15, fir wrote:
    > W dniu niedziela, 12 marca 2017 23:47:04 UTC+1 użytkownik fir napisał:
    >> W dniu niedziela, 12 marca 2017 23:23:35 UTC+1 użytkownik fir napisał:
    >>> W dniu niedziela, 12 marca 2017 22:57:05 UTC+1 użytkownik bartekltg napisał:
    >>>> On 12.03.2017 22:46, fir wrote:
    >>>>> szukam dosyc prostego algorytmu
    >>>>>
    >>>>> mam punkt int x,y np 0,0
    >>>>> i chce znalezc nastepny punkt
    >>>>> w kierunku jakiegos dowolnego punktu
    >>>>> int dist_x, dist_y, tak jak gdybym
    >>>>> rysowal linie prostą
    >>>>>
    >>>>> jak wzynaczyc ten przylegly punkt?
    >>>>>
    >>>>
    >>>> Algorytm Bresenhama
    >>>>
    >>> raczej fragment bressenhama ale jaki

    Z testów wygląda, że całego.



    >>
    >> w sumie to chyba bedzie cos takiego
    >>
    >> int2 NextPointTowards(int x, int y, int dest_x, int dest_y)
    >> {
    >> int2 n = {x, y};
    >>
    >> int dx = dest_x - x;
    >> int dy = dest_y - y;
    >>
    >> int sx = sign(dx);
    >> int sy = sign(dy);
    >>
    >> if(sx==0) n.y += sy;
    >> else if(sy==0) n.x += sx;
    >> else
    >> {
    >> float m = fabs(((float)dy)/dx);

    a to da się zrobić bez floatów. Choćby tak:
    if ( 2*abs(dx) < abs(dy) )...
    else if ( abs(dx) > 2*abs(dy) )...

    >>
    >> if( m < 0.5) n.x += sx;
    >> else if( m > 2.0) n.y += sy;
    >> else { n.x += sx; n.y += sy; }
    >> }
    >>
    >> return n;
    >>
    >> }
    >>
    >> mozna by wywalic dzielenie zastepujac ifem ale nie wiedomo czy if szybszy
    >>
    >> pozatym w dzialaniu to chyba nie zastpi bresenhama (trzebby sprawdzic) choc mw o
    to mi chodzi bo taka procedura jest jaby bardziej ogolna
    >
    > zrobilem testy i okazalo sie ze to nie dziala dobrze

    >
    > http://minddetonator.htw.pl/compact.jpg
    >
    > gorna linia to normalne a dolna dolna linia to wynik generowania tych punktow
    > wyzej

    Nic dziwnego. Ten kod pozwala na wybór jednego z 8 kierunków.
    Będzie używał 2 kierunków na zmianę tylko wtedy, gdy jest na ich
    granicy.
    Efektywnie będzie wiec tworzył proste jedynie w 16 różnych kierunkach.

    Aby temu zapobiec, trzeba albo pamiętać linię, po której się porusza
    (skomplikowane, niepotrebne i, a do tego jak się domyślam, że śledzony
    punkt się porusza:) )
    albo pamiętać ułamkową pozycję i robić ideowo jak u Bresenhama.


    I teraz pytanie, co tak naprawdę robisz.

    Jeśli rysujesz linię,
    - Użyj Bresenhama.
    - Twoja biblioteka graficzna nie ma rysowania linii? Muis mieć. Niech
    ona to zrobi, wtedy karta graficzna narysuje linię, nie procek;-)

    Jeśli jets to ludzik goniący za być możę ruchomym punktem,
    idea jest ta sama (błąd-korekcja) - ludzik ma pozycję znaną
    dokałdniej niż 'ten piksel'. Nie da się sprowadzić do wspolnego
    mianownika jak dla stałej linii, więc albo float (najwygdniej) albo
    'stały przecinek', czyli np pozycja z to int z dokłądnosćią do 1/1024
    piksela.

    BTW, jesli to ludzik i pogoń, to tak, jak to opisałeś, ma jeszcze jedną
    wadę. Ruch pionowy i poziomy jest wolniejszy niż po przekątnych
    o sqrt(2).

    pzdr
    bartekltg



  • 7. Data: 2017-03-13 15:46:27
    Temat: Re: nastepny punkt
    Od: fir <p...@g...com>

    W dniu poniedziałek, 13 marca 2017 12:38:15 UTC+1 użytkownik bartekltg napisał:
    > On 13.03.2017 01:15, fir wrote:
    > > W dniu niedziela, 12 marca 2017 23:47:04 UTC+1 użytkownik fir napisał:
    > >> W dniu niedziela, 12 marca 2017 23:23:35 UTC+1 użytkownik fir napisał:
    > >>> W dniu niedziela, 12 marca 2017 22:57:05 UTC+1 użytkownik bartekltg napisał:
    > >>>> On 12.03.2017 22:46, fir wrote:
    > >>>>> szukam dosyc prostego algorytmu
    > >>>>>
    > >>>>> mam punkt int x,y np 0,0
    > >>>>> i chce znalezc nastepny punkt
    > >>>>> w kierunku jakiegos dowolnego punktu
    > >>>>> int dist_x, dist_y, tak jak gdybym
    > >>>>> rysowal linie prostą
    > >>>>>
    > >>>>> jak wzynaczyc ten przylegly punkt?
    > >>>>>
    > >>>>
    > >>>> Algorytm Bresenhama
    > >>>>
    > >>> raczej fragment bressenhama ale jaki
    >
    > Z testów wygląda, że całego.
    >
    >
    >
    > >>
    > >> w sumie to chyba bedzie cos takiego
    > >>
    > >> int2 NextPointTowards(int x, int y, int dest_x, int dest_y)
    > >> {
    > >> int2 n = {x, y};
    > >>
    > >> int dx = dest_x - x;
    > >> int dy = dest_y - y;
    > >>
    > >> int sx = sign(dx);
    > >> int sy = sign(dy);
    > >>
    > >> if(sx==0) n.y += sy;
    > >> else if(sy==0) n.x += sx;
    > >> else
    > >> {
    > >> float m = fabs(((float)dy)/dx);
    >
    > a to da się zrobić bez floatów. Choćby tak:
    > if ( 2*abs(dx) < abs(dy) )...
    > else if ( abs(dx) > 2*abs(dy) )...
    >
    > >>
    > >> if( m < 0.5) n.x += sx;
    > >> else if( m > 2.0) n.y += sy;
    > >> else { n.x += sx; n.y += sy; }
    > >> }
    > >>
    > >> return n;
    > >>
    > >> }
    > >>
    > >> mozna by wywalic dzielenie zastepujac ifem ale nie wiedomo czy if szybszy
    > >>
    > >> pozatym w dzialaniu to chyba nie zastpi bresenhama (trzebby sprawdzic) choc mw o
    to mi chodzi bo taka procedura jest jaby bardziej ogolna
    > >
    > > zrobilem testy i okazalo sie ze to nie dziala dobrze
    >
    > >
    > > http://minddetonator.htw.pl/compact.jpg
    > >
    > > gorna linia to normalne a dolna dolna linia to wynik generowania tych punktow
    > > wyzej
    >
    > Nic dziwnego. Ten kod pozwala na wybór jednego z 8 kierunków.
    > Będzie używał 2 kierunków na zmianę tylko wtedy, gdy jest na ich
    > granicy.
    > Efektywnie będzie wiec tworzył proste jedynie w 16 różnych kierunkach.
    >

    chyba sluszna uwaga raczej nie przemyslalem tego

    > Aby temu zapobiec, trzeba albo pamiętać linię, po której się porusza
    > (skomplikowane, niepotrebne i, a do tego jak się domyślam, że śledzony
    > punkt się porusza:) )
    > albo pamiętać ułamkową pozycję i robić ideowo jak u Bresenhama.
    >
    >
    > I teraz pytanie, co tak naprawdę robisz.
    >
    > Jeśli rysujesz linię,
    > - Użyj Bresenhama.
    > - Twoja biblioteka graficzna nie ma rysowania linii? Muis mieć. Niech
    > ona to zrobi, wtedy karta graficzna narysuje linię, nie procek;-)
    >
    > Jeśli jets to ludzik goniący za być możę ruchomym punktem,
    > idea jest ta sama (błąd-korekcja) - ludzik ma pozycję znaną
    > dokałdniej niż 'ten piksel'. Nie da się sprowadzić do wspolnego
    > mianownika jak dla stałej linii, więc albo float (najwygdniej) albo
    > 'stały przecinek', czyli np pozycja z to int z dokłądnosćią do 1/1024
    > piksela.
    >

    a masz jakis matematyczny/logiczny dowód
    ze tego sie nie da zrobic?

    dla mnie nie jest to takie pewne (nie mam zdania)

    tego co uzywam raczej uzywalbym do rysowania lini - taka forma jest bardziej 'ogolna'
    np latwo z tego zrobic rysowanie lini przerywanej, w dwu kolorach -- no i mozna tez
    uogolnic na nielinie (ale przypadek o ktory pytam to rysowanie lini)

    moge przerobic na floaty ale troche szkoda ze nie kojarze poprawnej wersji
    na intach - ew mozna kombinowac z zapamietywaniem tego subpixelowego przesuniecia
    jako wewnetrznej zmiennej statycznej - temat niby prosty a wymaga troche przemyslania



    > BTW, jesli to ludzik i pogoń, to tak, jak to opisałeś, ma jeszcze jedną
    > wadę. Ruch pionowy i poziomy jest wolniejszy niż po przekątnych
    > o sqrt(2).
    >


    > pzdr
    > bartekltg


  • 8. Data: 2017-03-13 17:09:31
    Temat: Re: nastepny punkt
    Od: fir <p...@g...com>

    W dniu poniedziałek, 13 marca 2017 15:46:29 UTC+1 użytkownik fir napisał:
    > W dniu poniedziałek, 13 marca 2017 12:38:15 UTC+1 użytkownik bartekltg napisał:
    > > On 13.03.2017 01:15, fir wrote:
    > > > W dniu niedziela, 12 marca 2017 23:47:04 UTC+1 użytkownik fir napisał:
    > > >> W dniu niedziela, 12 marca 2017 23:23:35 UTC+1 użytkownik fir napisał:
    > > >>> W dniu niedziela, 12 marca 2017 22:57:05 UTC+1 użytkownik bartekltg napisał:
    > > >>>> On 12.03.2017 22:46, fir wrote:
    > > >>>>> szukam dosyc prostego algorytmu
    > > >>>>>
    > > >>>>> mam punkt int x,y np 0,0
    > > >>>>> i chce znalezc nastepny punkt
    > > >>>>> w kierunku jakiegos dowolnego punktu
    > > >>>>> int dist_x, dist_y, tak jak gdybym
    > > >>>>> rysowal linie prostą
    > > >>>>>
    > > >>>>> jak wzynaczyc ten przylegly punkt?
    > > >>>>>
    > > >>>>
    > > >>>> Algorytm Bresenhama
    > > >>>>
    > > >>> raczej fragment bressenhama ale jaki
    > >
    > > Z testów wygląda, że całego.
    > >
    > >
    > >
    > > >>
    > > >> w sumie to chyba bedzie cos takiego
    > > >>
    > > >> int2 NextPointTowards(int x, int y, int dest_x, int dest_y)
    > > >> {
    > > >> int2 n = {x, y};
    > > >>
    > > >> int dx = dest_x - x;
    > > >> int dy = dest_y - y;
    > > >>
    > > >> int sx = sign(dx);
    > > >> int sy = sign(dy);
    > > >>
    > > >> if(sx==0) n.y += sy;
    > > >> else if(sy==0) n.x += sx;
    > > >> else
    > > >> {
    > > >> float m = fabs(((float)dy)/dx);
    > >
    > > a to da się zrobić bez floatów. Choćby tak:
    > > if ( 2*abs(dx) < abs(dy) )...
    > > else if ( abs(dx) > 2*abs(dy) )...
    > >
    > > >>
    > > >> if( m < 0.5) n.x += sx;
    > > >> else if( m > 2.0) n.y += sy;
    > > >> else { n.x += sx; n.y += sy; }
    > > >> }
    > > >>
    > > >> return n;
    > > >>
    > > >> }
    > > >>
    > > >> mozna by wywalic dzielenie zastepujac ifem ale nie wiedomo czy if szybszy
    > > >>
    > > >> pozatym w dzialaniu to chyba nie zastpi bresenhama (trzebby sprawdzic) choc mw
    o to mi chodzi bo taka procedura jest jaby bardziej ogolna
    > > >
    > > > zrobilem testy i okazalo sie ze to nie dziala dobrze
    > >
    > > >
    > > > http://minddetonator.htw.pl/compact.jpg
    > > >
    > > > gorna linia to normalne a dolna dolna linia to wynik generowania tych punktow
    > > > wyzej
    > >
    > > Nic dziwnego. Ten kod pozwala na wybór jednego z 8 kierunków.
    > > Będzie używał 2 kierunków na zmianę tylko wtedy, gdy jest na ich
    > > granicy.
    > > Efektywnie będzie wiec tworzył proste jedynie w 16 różnych kierunkach.
    > >
    >
    > chyba sluszna uwaga raczej nie przemyslalem tego
    >
    > > Aby temu zapobiec, trzeba albo pamiętać linię, po której się porusza
    > > (skomplikowane, niepotrebne i, a do tego jak się domyślam, że śledzony
    > > punkt się porusza:) )
    > > albo pamiętać ułamkową pozycję i robić ideowo jak u Bresenhama.
    > >
    > >
    > > I teraz pytanie, co tak naprawdę robisz.
    > >
    > > Jeśli rysujesz linię,
    > > - Użyj Bresenhama.
    > > - Twoja biblioteka graficzna nie ma rysowania linii? Muis mieć. Niech
    > > ona to zrobi, wtedy karta graficzna narysuje linię, nie procek;-)
    > >
    > > Jeśli jets to ludzik goniący za być możę ruchomym punktem,
    > > idea jest ta sama (błąd-korekcja) - ludzik ma pozycję znaną
    > > dokałdniej niż 'ten piksel'. Nie da się sprowadzić do wspolnego
    > > mianownika jak dla stałej linii, więc albo float (najwygdniej) albo
    > > 'stały przecinek', czyli np pozycja z to int z dokłądnosćią do 1/1024
    > > piksela.
    > >
    >
    > a masz jakis matematyczny/logiczny dowód
    > ze tego sie nie da zrobic?
    >
    > dla mnie nie jest to takie pewne (nie mam zdania)
    >
    > tego co uzywam raczej uzywalbym do rysowania lini - taka forma jest bardziej
    'ogolna' np latwo z tego zrobic rysowanie lini przerywanej, w dwu kolorach -- no i
    mozna tez uogolnic na nielinie (ale przypadek o ktory pytam to rysowanie lini)
    >
    > moge przerobic na floaty ale troche szkoda ze nie kojarze poprawnej wersji
    > na intach - ew mozna kombinowac z zapamietywaniem tego subpixelowego przesuniecia
    jako wewnetrznej zmiennej statycznej - temat niby prosty a wymaga troche przemyslania
    >
    >
    >
    > > BTW, jesli to ludzik i pogoń, to tak, jak to opisałeś, ma jeszcze jedną
    > > wadę. Ruch pionowy i poziomy jest wolniejszy niż po przekątnych
    > > o sqrt(2).
    > >
    >
    >
    przykladowa wersja float

    int MovePointTowards(float* x, float* y, float dest_x, float dest_y)
    {
    float nx = *x;
    float ny = *y;

    float dx = dest_x - nx;
    float dy = dest_y - ny;

    if(fabs(dx)<0.1 && fabs(dy)<0.1) return 0;

    float sx = fsign(dx);
    float sy = fsign(dy);


    if(sx==0) ny += sy;
    else if(sy==0) nx += sx;
    else
    if (dy<dx)
    {
    float m = fabs(dy/dx);

    nx += sx;
    ny += m*sy;
    }
    else
    {
    float m = fabs(dx/dy);

    ny += sy;
    nx += m*sx;
    }

    *x=nx;
    *y=ny;
    return 1;

    }

    void foo()
    {


    float x = 100;
    float y = 100;

    do SetPixel(x,y, 0xffffff);
    while(MovePointTowards(&x, &y, 234, 337));

    }

    dziala pytanie o ile to jest wolniejsze i
    o ile by bylo po maksymalnym wyoptymalizowaniu

    inne pytanie co mozna tym np ciekawego narysowac


  • 9. Data: 2017-03-13 17:50:52
    Temat: Re: nastepny punkt
    Od: fir <p...@g...com>

    W dniu poniedziałek, 13 marca 2017 17:09:32 UTC+1 użytkownik fir napisał:
    > W dniu poniedziałek, 13 marca 2017 15:46:29 UTC+1 użytkownik fir napisał:
    > > W dniu poniedziałek, 13 marca 2017 12:38:15 UTC+1 użytkownik bartekltg napisał:
    > > > On 13.03.2017 01:15, fir wrote:
    > > > > W dniu niedziela, 12 marca 2017 23:47:04 UTC+1 użytkownik fir napisał:
    > > > >> W dniu niedziela, 12 marca 2017 23:23:35 UTC+1 użytkownik fir napisał:
    > > > >>> W dniu niedziela, 12 marca 2017 22:57:05 UTC+1 użytkownik bartekltg
    napisał:
    > > > >>>> On 12.03.2017 22:46, fir wrote:
    > > > >>>>> szukam dosyc prostego algorytmu
    > > > >>>>>
    > > > >>>>> mam punkt int x,y np 0,0
    > > > >>>>> i chce znalezc nastepny punkt
    > > > >>>>> w kierunku jakiegos dowolnego punktu
    > > > >>>>> int dist_x, dist_y, tak jak gdybym
    > > > >>>>> rysowal linie prostą
    > > > >>>>>
    > > > >>>>> jak wzynaczyc ten przylegly punkt?
    > > > >>>>>
    > > > >>>>
    > > > >>>> Algorytm Bresenhama
    > > > >>>>
    > > > >>> raczej fragment bressenhama ale jaki
    > > >
    > > > Z testów wygląda, że całego.
    > > >
    > > >
    > > >
    > > > >>
    > > > >> w sumie to chyba bedzie cos takiego
    > > > >>
    > > > >> int2 NextPointTowards(int x, int y, int dest_x, int dest_y)
    > > > >> {
    > > > >> int2 n = {x, y};
    > > > >>
    > > > >> int dx = dest_x - x;
    > > > >> int dy = dest_y - y;
    > > > >>
    > > > >> int sx = sign(dx);
    > > > >> int sy = sign(dy);
    > > > >>
    > > > >> if(sx==0) n.y += sy;
    > > > >> else if(sy==0) n.x += sx;
    > > > >> else
    > > > >> {
    > > > >> float m = fabs(((float)dy)/dx);
    > > >
    > > > a to da się zrobić bez floatów. Choćby tak:
    > > > if ( 2*abs(dx) < abs(dy) )...
    > > > else if ( abs(dx) > 2*abs(dy) )...
    > > >
    > > > >>
    > > > >> if( m < 0.5) n.x += sx;
    > > > >> else if( m > 2.0) n.y += sy;
    > > > >> else { n.x += sx; n.y += sy; }
    > > > >> }
    > > > >>
    > > > >> return n;
    > > > >>
    > > > >> }
    > > > >>
    > > > >> mozna by wywalic dzielenie zastepujac ifem ale nie wiedomo czy if szybszy
    > > > >>
    > > > >> pozatym w dzialaniu to chyba nie zastpi bresenhama (trzebby sprawdzic) choc
    mw o to mi chodzi bo taka procedura jest jaby bardziej ogolna
    > > > >
    > > > > zrobilem testy i okazalo sie ze to nie dziala dobrze
    > > >
    > > > >
    > > > > http://minddetonator.htw.pl/compact.jpg
    > > > >
    > > > > gorna linia to normalne a dolna dolna linia to wynik generowania tych punktow
    > > > > wyzej
    > > >
    > > > Nic dziwnego. Ten kod pozwala na wybór jednego z 8 kierunków.
    > > > Będzie używał 2 kierunków na zmianę tylko wtedy, gdy jest na ich
    > > > granicy.
    > > > Efektywnie będzie wiec tworzył proste jedynie w 16 różnych kierunkach.
    > > >
    > >
    > > chyba sluszna uwaga raczej nie przemyslalem tego
    > >
    > > > Aby temu zapobiec, trzeba albo pamiętać linię, po której się porusza
    > > > (skomplikowane, niepotrebne i, a do tego jak się domyślam, że śledzony
    > > > punkt się porusza:) )
    > > > albo pamiętać ułamkową pozycję i robić ideowo jak u Bresenhama.
    > > >
    > > >
    > > > I teraz pytanie, co tak naprawdę robisz.
    > > >
    > > > Jeśli rysujesz linię,
    > > > - Użyj Bresenhama.
    > > > - Twoja biblioteka graficzna nie ma rysowania linii? Muis mieć. Niech
    > > > ona to zrobi, wtedy karta graficzna narysuje linię, nie procek;-)
    > > >
    > > > Jeśli jets to ludzik goniący za być możę ruchomym punktem,
    > > > idea jest ta sama (błąd-korekcja) - ludzik ma pozycję znaną
    > > > dokałdniej niż 'ten piksel'. Nie da się sprowadzić do wspolnego
    > > > mianownika jak dla stałej linii, więc albo float (najwygdniej) albo
    > > > 'stały przecinek', czyli np pozycja z to int z dokłądnosćią do 1/1024
    > > > piksela.
    > > >
    > >
    > > a masz jakis matematyczny/logiczny dowód
    > > ze tego sie nie da zrobic?
    > >
    > > dla mnie nie jest to takie pewne (nie mam zdania)
    > >
    > > tego co uzywam raczej uzywalbym do rysowania lini - taka forma jest bardziej
    'ogolna' np latwo z tego zrobic rysowanie lini przerywanej, w dwu kolorach -- no i
    mozna tez uogolnic na nielinie (ale przypadek o ktory pytam to rysowanie lini)
    > >
    > > moge przerobic na floaty ale troche szkoda ze nie kojarze poprawnej wersji
    > > na intach - ew mozna kombinowac z zapamietywaniem tego subpixelowego przesuniecia
    jako wewnetrznej zmiennej statycznej - temat niby prosty a wymaga troche przemyslania
    > >
    > >
    > >
    > > > BTW, jesli to ludzik i pogoń, to tak, jak to opisałeś, ma jeszcze jedną
    > > > wadę. Ruch pionowy i poziomy jest wolniejszy niż po przekątnych
    > > > o sqrt(2).
    > > >
    > >
    > >
    > przykladowa wersja float
    >
    > int MovePointTowards(float* x, float* y, float dest_x, float dest_y)
    > {
    > float nx = *x;
    > float ny = *y;
    >
    > float dx = dest_x - nx;
    > float dy = dest_y - ny;
    >
    > if(fabs(dx)<0.1 && fabs(dy)<0.1) return 0;
    >
    > float sx = fsign(dx);
    > float sy = fsign(dy);
    >
    >
    > if(sx==0) ny += sy;
    > else if(sy==0) nx += sx;
    > else
    > if (dy<dx)

    powinno byc if(fabs(dy)<fabs(dx))

    > {
    > float m = fabs(dy/dx);
    >
    > nx += sx;
    > ny += m*sy;
    > }
    > else
    > {
    > float m = fabs(dx/dy);
    >
    > ny += sy;
    > nx += m*sx;
    > }
    >
    > *x=nx;
    > *y=ny;
    > return 1;
    >
    > }
    >
    > void foo()
    > {
    >
    >
    > float x = 100;
    > float y = 100;
    >
    > do SetPixel(x,y, 0xffffff);
    > while(MovePointTowards(&x, &y, 234, 337));
    >
    > }
    >
    > dziala pytanie o ile to jest wolniejsze i
    > o ile by bylo po maksymalnym wyoptymalizowaniu
    >
    > inne pytanie co mozna tym np ciekawego narysowac


  • 10. Data: 2017-03-13 18:10:26
    Temat: Re: nastepny punkt
    Od: bartekltg <b...@g...com>

    On 13.03.2017 15:46, fir wrote:

    >
    > dla mnie nie jest to takie pewne (nie mam zdania)
    >
    > tego co uzywam raczej uzywalbym do rysowania lini - taka forma jest
    > bardziej 'ogolna' np latwo z tego zrobic rysowanie lini przerywanej,
    > w dwu kolorach -- no i mozna tez uogolnic na nielinie (ale przypadek
    > o ktory pytam to rysowanie lini)


    No to gdzie problem, żby zastosować algorytm gościa na B?
    Żadnych floatów, tyle iteracji ile pikseli, same zalety.
    To naprawdę dopieszczony algorytm.


    pzdr
    bartekltg


strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: