eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingiterowanie po kwadracie › Re: iterowanie po kwadracie
  • Data: 2012-04-06 16:31:34
    Temat: Re: iterowanie po kwadracie
    Od: " " <f...@g...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    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/

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: