eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › iterowanie po kwadracie
Ilość wypowiedzi w tym wątku: 13

  • 11. Data: 2012-04-02 16:37:55
    Temat: Re: iterowanie po kwadracie
    Od: bartekltg <b...@g...com>

    W dniu 2012-04-02 14:51, Adam Wysocki pisze:
    > M.M.<m...@g...pl> wrote:
    >
    >> Kolejne punkty leza na prostych, wiec punkt nastepny uzyskuje
    >> sie przez dodanie dx i dy do punktu poprzedniego. Ze
    >> wzorow na obrot trzeb wyliczyc start_x i start_y a
    >> potem odpowiednio dodawac dx i dy.
    >
    > Może to kumulować błąd, jeżeli dx i dy są w jakiś sposób przybliżone
    > (np. float). Lepiej nie dodawać tylko mnożyć.
    >
    > Przykład tego o czym mówię:
    >
    > #include<stdio.h>
    >
    > int main()

    > Ostatnia linijka outputu:
    >
    > i=100000 i*factor=111000.0014 f=110948.9922 diff=-51.0092
    >
    > Kalkulator mówi, że 100000 * 1.11 to 111000 i mniej więcej tyle wyszło
    > z mnożenia, a z dodawania 0.05% mniej.

    Z tym, że raczej chcemy używać intów jako stałego przecinka
    (potem przesunięcie bitów o kilka i od razu do indeksu
    tblicy, bez kosztownego float->int)
    Wtedy dodawanie i mnożenie daje dokładnie ten sam wynik.

    No, chyba, że to GPU:)

    pzdr
    bartekltg



  • 12. Data: 2012-04-06 16:31:34
    Temat: Re: iterowanie po kwadracie
    Od: " " <f...@g...pl>

    M.M. <m...@g...pl> napisał(a):

    > <f...@g...pl> napisał(a):
    >
    > > M.M. <m...@g...pl> napisał(a):
    > >
    > > > <f...@g...pl> napisał(a):
    > > >
    > > > > jesli iteruje sie po kwadracie to robi sie to
    > > > > zwykle tak
    > > > >
    > > > > for(int j=0; j<200; j++)
    > > > > for(int i=0; i<200; i++)
    > > > > costam(i,j)
    > > > >
    > > > > jak przeiterowac po tym samym kwadracie 200x200
    > > > > gdy jest on przekrzywiony np o 7 stopni w prawo,
    > > > > - dane sa np wspolrzedne wierzcholkow)
    > > > >
    > > > > ??
    > > > Kolejne punkty leza na prostych, wiec punkt nastepny uzyskuje
    > > > sie przez dodanie dx i dy do punktu poprzedniego. Ze
    > > > wzorow na obrot trzeb wyliczyc start_x i start_y a
    > > > potem odpowiednio dodawac dx i dy.
    > > >
    > > > x = x_start;
    > > > y = y_start;
    > > > for( i=0 ; i<200 ; i++ ) {
    > > > xx = x;
    > > > yy = y;
    > > > for( j=0 ; j<200 ; j++ ) {
    > > > draw(xx,yy);
    > > > xx += dx2;
    > > > yy += dy2;
    > > > }
    > > > x += dx1;
    > > > y += dy1;
    > > > }
    > > >
    > >
    > > pytanie jednak czy to nie 'skipnie' pewnych punktow
    > > (chyba skipnie i beda dziury) - przydalaby sie taka
    > > metoda iterowania po kwadracie ktora by nie omijala
    > > punktow - wtedy np w odwrotnej metodzie rysowania
    > > obracanych bitmap nie trzebaby iterowac ekranu po
    > > otaczajacym wiekszym kwadracie i marnowac czesci obliczen
    > > tylko przeiterowac sam odwrocony kwadrat
    >
    > Hmmm pewnie sa gotowe liby do tego celu :)
    > Ciekawe co ma QT. Wygląda zachęcająco:
    > http://doc.trolltech.com/solutions/4/qtanimationfram
    ework/animation.html
    >
    > Kiedyś musiałem zrobić na szybko aplikację z animacją. Przekopiowałem
    > ten przykład:
    > http://doc.qt.nokia.com/4.7-snapshot/examples-graphi
    csview.html
    > Kilka rzeczy zmieniłem i działało choć nie bardzo rozumiałem dlaczego
    > działa. Może zrób tak samo?
    >
    > A jeśli chcesz się koniecznie bawić...
    > Ja bym wyznaczył cztery punkty tego kwadrata. Potem bym wyliczył
    > krawędzie. Następnie bym wziął dwie górne krawędzie i potraktował
    > je jako funkcje łamaną górną. Dwie dolne krawędzie jako łamaną
    > dolną. Zakładamy że nie jest obrócony o wielokrotność 90 stopni.
    > Potem dziedzina <xmin,xmax>, dla obu łamanych będzie ona taka
    > sama...
    >
    > for( x=xmin ; x<=xmax ; x++ )
    > for( y=lamana_gorna(x) ; y>=lamana_dolna(x) ; y-- )
    > draw( x , y );
    >
    > Taki algorytm zejdzie w dol po wszystkich pixelach, czyli zadnego
    > nie ominie i nie bedzie dziury.
    >
    > Żeby nie było pixelozy to trzeba sprawdzić ile procent skrajnych
    > pixeli należy do kwadrata i kolor ustalic mniej/wiecej tak:
    >
    > ile_nalezy * kolor_kopiowany + (1-ile_nalezy) * kolor_biezacy
    >
    > Pozdrawiam
    >
    w sumie to jesli quad jest przekrzywiony to
    jeden wierzcholek jest na gorze jeden na dole
    jeden z lewej drugi z prawej

    mozna zaczac od tego na gorze i dodawac skosy-
    poprawki dxs dxk do poczatku i konca rysowanej
    poziomej az a jak dojedzie sie do lewego to zaminic
    poprawke z poprawki w lewo na poprawke w prawo
    a jak do prawego to poprawke w prawo na poprawke w lewo
    i jechac dalej az sie dojedzie do dolnego


    int dxleft = ((up_x-left_x)<<10)/(left_y-up_y);
    int dxright = ((up_x-right_x)<<10)/(right_y-up_y);


    int y = up_y;
    int xs = up_x;
    int xk = up_x;

    int dxs = dxleft<<10;
    int dxk = dxright<10;

    for(;;)
    {

    draw_pozioma(y, xs>>10, xk>10);

    if(y==down_y) break;

    y--;
    xs+=dxs;
    xk+=dxk;

    if(y==left_y) dxs = dxright;
    if(y==right_y) dxk = dxleft;

    }

    nie sprawdzalem czy to dziala i niby warunki w srodku
    mozna by zamianiac na petle wykonana prekalkulawana
    ilosc razy co z poziomu asma mogloby byc moze szybsze
    (n przyrownan do zera a nie n odejmowan i przyrownan do
    zera - nie wiem czy w asmie takie petle sa lekko szybsze)
    ale nie wiem czy z poziomu c da sie to wykorzystac (*)

    tak ze nie wiem czy da sie to jakos poprawic i nie sprawdzalem
    czy to dziala - ale akurat bede potrzebowac tego uzywac

    (*) z tego mz wniosek ze w ce powinny byc moze latwo dostepne proste petle
    typu "for(ile razy)" np rugowanie mnozen z petli

    for(int i=0; i<100000; i++)
    {
    x+=5;

    // cos od x
    }

    zamiast

    for(int i=0; i<100000; i++)
    {
    x=i*5;

    // cos od x
    }

    przyspiesza niektore petle masakrycznie


    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 13. Data: 2012-04-08 07:13:45
    Temat: Re: iterowanie po kwadracie
    Od: darek <d...@o...eu>

    On 30.03.2012 20:17, f...@g...pl wrote:
    > jesli iteruje sie po kwadracie to robi sie to
    > zwykle tak
    >
    > for(int j=0; j<200; j++)
    > for(int i=0; i<200; i++)
    > costam(i,j)
    >
    > jak przeiterowac po tym samym kwadracie 200x200
    > gdy jest on przekrzywiony np o 7 stopni w prawo,
    > - dane sa np wspolrzedne wierzcholkow)
    >
    > ??
    >
    >
    Musisz się pobawić w matematykę i rozpracować kąty za pomocą funkcji
    trygonometrycznych
    i tak
    wsp(x,y) = cos(alfa)*a+sin(alfa)*b

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: