-
1. Data: 2012-03-30 20:17:52
Temat: iterowanie po kwadracie
Od: " " <f...@g...pl>
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)
??
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
2. Data: 2012-03-30 22:57:49
Temat: Re: iterowanie po kwadracie
Od: " M.M." <m...@g...pl>
<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;
}
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
3. Data: 2012-03-31 10:06:19
Temat: Re: iterowanie po kwadracie
Od: " " <f...@g...pl>
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
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
4. Data: 2012-03-31 11:59:38
Temat: Re: iterowanie po kwadracie
Od: Marcin Biegan <a...@u...lama.net.pl>
On 2012-03-31 10:06, f...@g...pl wrote:
> 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
http://pl.wikipedia.org/wiki/Algorytm_Bresenhama
Nie wiem co próbujesz zrobić, ale "iterowanie po obróconym kwadracie" brzmi
jakbyś próbował zrobić coś bardzo dziwnego i niepotrzebnego.
--
MB
-
5. Data: 2012-03-31 12:20:49
Temat: Re: iterowanie po kwadracie
Od: " M.M." <m...@g...pl>
<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
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
6. Data: 2012-03-31 16:15:43
Temat: Re: iterowanie po kwadracie
Od: bartekltg <b...@g...com>
W dniu 2012-03-30 20:17, f...@g...pl pisze:
> 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)
Ale Ty nie chcesz iterować po obróconym kwadracie.
Chcesz iterować po normalnym kwadracie, tylko trochę większym.
Ty chcesz zrobić coś takiego:
Wstaw( cel, źródło, x,y, alfa )
for(int j=A; j<C; j++)
for(int i=B; i<D; i++)
cel[x+j][y+i] = źródło ( (transformata wspolrzednych(i,j,alfa)) )
gdzie A,B,C,D są pewnymi liczbami wynikającymi z transformaci
(tak aby zmiweścił sie tam obrócony o alfa prostokąt)
i kwadrat A,B,C,B zawiera 0,0,200,200.
oczywiście transformacje odwikłujemy i w pętli mamy tylko dodawanie
w indeksach źródła.
pzdr
bartekltg
-
7. Data: 2012-03-31 16:36:12
Temat: re: iterowanie po kwadracie
Od: " " <f...@g...pl>
>> nie chesz iterowac po odwroconym kwadracie tylko po normalnym
>> tylko troche wiekszym
zdaje mi sie ze lepiej iterowac po przekrzywionym kwadracie
(moze faktycznie najprosciej by bylo stablicowac brzegi
i jechac po poziomych paskach) - ten troche wiekszy kwadrat
to nawet 2 razy wiekszy kwadrat (1-2 razy wiekszy)
(pozatym ew zajeta 2 wiecej miejsca w buforze tekstur)
wydaje sie ze iterujac tylko po tym co trzeba nie byloby
1-2 raza wolniej
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
8. Data: 2012-03-31 16:39:18
Temat: Re: iterowanie po kwadracie
Od: bartekltg <b...@g...com>
W dniu 2012-03-31 16:36, f...@g...pl pisze:
>>> nie chesz iterowac po odwroconym kwadracie tylko po normalnym
>>> tylko troche wiekszym
>
> zdaje mi sie ze lepiej iterowac po przekrzywionym kwadracie
Nie.
> (moze faktycznie najprosciej by bylo stablicowac brzegi
> i jechac po poziomych paskach) - ten troche wiekszy kwadrat
> to nawet 2 razy wiekszy kwadrat (1-2 razy wiekszy)
Ale nie iterujesz po całym, tylko po odpowiedniem
fragmencie. W każdej linii masz inne start i stop
w pętli for.
> (pozatym ew zajeta 2 wiecej miejsca w buforze tekstur)
?
> wydaje sie ze iterujac tylko po tym co trzeba nie byloby
> 1-2 raza wolniej
Dobra, rób jak Ci się wydaje, ja odpadam.
pzdr
bartekltg
-
9. Data: 2012-03-31 16:58:42
Temat: re: iterowanie po kwadracie
Od: " " <f...@g...pl>
>> (..) (blad w gazecie czy przegladarce czasem wycina mi przedpiscow)
jak to nie? - teraz z artefaktami jade po zrodle po kolei i
jakby plotterem po celu (to daje dziury)
rozumiem ze mialbym jechac po pixelach (przekrzywionego) celu
i trafiac nimi w zrodlo (nie bedzie dziur)
sylwetke celu moge sobie wyznaczyc - lepiej jest jechac tylko
po tych pixelach celu, ktore sa mi potrzebne (naleza do sylwetki)
a nie jechac poza nia i nie trafiac w zrodlowa teksture marnujac
niepotrzebne obliczenia
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
10. Data: 2012-04-02 14:51:35
Temat: Re: iterowanie po kwadracie
Od: g...@n...invalid (Adam Wysocki)
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()
{
long i;
const float factor = 1.11;
float f = 0;
for (i = 0; i <= 100000; ++i)
{
if (!(i % 1000))
printf("i=%d i*factor=%.4f f=%.4f diff=%.4f\n", i, i *
factor, f, f - i * factor);
f += factor;
}
return 0;
}
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.
--
Gof