eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingnastepny punkt › Re: nastepny punkt
  • Data: 2017-03-13 12:38:12
    Temat: Re: nastepny punkt
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    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


Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: