Witam. Jak można narysować taką siatkę, jaka jest na formatce w delphi?
l:=1;
k:=1;
repeat
image1.canvas.moveto(k*10,0);
image1.canvas.lineto(k*10,100*10);
k:=k+1;
if l<=100 then
begin
image1.canvas.moveto(0,l*10);
image1.canvas.lineto(1000,l*10);
l:=l+1;
end;
until (l=100)and(k=100);
(najglupszy chyba kod, ale dziala ;))
Dzięki, ale nie bardzo o to mi chodziło. Bo to, co ty mi napisałeś, rysuje linie (i tworzy inną siatkę). Może źle napisałem w temacie, ale chodzi mi o coś takiego jak jest w delphi. Kropki co np. 10 px
mamma mia...
to zamiast
image1.canvas.moveto(k*10,0);
image1.canvas.lineto(k*10,100*10);
daj
image1.canvas.Pixels....
:|
aczkolwiek powyższy kod jest strasznie niezoptymalizowany i woooolny - lepiej dać to w podwójnej pętli for z odpowiednim krokiem, a bez tych wszystkich mnożeń
można też zamiast Pixels użyć Scanline - jeszcze szybciej
No fajnie, zrobiłem coś takiego:
var l, k: integer;
begin
l:=1;
k:=1;
repeat
image1.canvas.moveto(k*10,0);
image1.canvas.Pixels [k*10,100*10];
k:=k+1;
if l<=100 then
begin
image1.canvas.moveto(0,l*10);
image1.canvas.pixels [1000,l*10];
l:=l+1;
end;
until (l=100)and(k=100);
i teraz się nie robią linie... teraz się nie robi nic!!
szkoda słów... po co moveto przed pixels? czy ja niewyrażnie napisałem?
y:=0;
repeat
x:=0;
repeat
image1.Canvas.Pixels[x,y] := clBlack;
inc(x,8); //8 to krok - w pascalu pętla for nie może mieć kroku :|
until x>image1.Width;
inc(y,8);
until y>image1.Height;
//thx to studnia & detox for hint :)
[<font color="blue">dopisane</span>]
WeeR - pisałem to z głowy nawet bez helpa - jedynie na ircu jakieś podpowiedzi
Dzięki, ale ta twoja funkcja rysuje tylko w jednej linii te kropki.. ale ja już sobie z nią poradziłem;]
To dlatego, że Marooned nie wyzerował "x"`a w odpowiednim miejscu.. ale lepiej zrobić to na pętli "for".
To dlatego, że Marooned nie wyzerował "x"`a w odpowiednim miejscu.. ale lepiej zrobić to na pętli "for".
thx - dodałem zerowanie
ale wytłumacz mi, dlaczego lepiej to zrobić na for? w C++ to bym zrozumiał:
for (iny i=Image->Width-1; i>=0; i-=8){}
ale w Delphi nie można dać kroku innego niż 1 w pętli for :| a idiotyzmem byłoby mnożyć za każdym razem przez stałą wartość
na for móglbys zrobic tak:
for x:=0 to (width-1) div 8 do
for y:=0 to (height-1) div 8 do
canvas.pixels[x*8,y*8]:=clBlack;
:-)
//chyba zrobie test, i sprawdze co szybsze :>
//<font color="red">Wyniki</span>: zazwyczaj są po równo. Bez względu na cokolwiek.
Marooned własnie chodziło mi o mnożenie przez wartość ... nie wiem czemu ale zawsze wybieram rozwiązanie gdzie jest mniej kodu...
Dopisane: M. ja wiem, że to jest wolniejsze.. niestety ja jestem pedantem i przedkładam zgrabny kod nad szybkość :>
Marooned własnie chodziło mi o mnożenie przez wartość ... nie wiem czemu ale zawsze wybieram rozwiązanie gdzie jest mniej kodu...
No dobra... weźmy dla przykładu kod Pawel200x.5 z poprzedniej strony:
for x:=0 to (width-1) div 8 do
for y:=0 to (height-1) div 8 do
canvas.pixels[x*8,y*8]:=clBlack;
Zakładamy obraz 400x400px
więc mamy:
50 dzieleń i 4802 mnożeń - to są najwolniejsze operacje arytmetyczne wykonywane przez procesor! Mój kod daje dokładnie ten sam efekt a nie ma w nim ani jednej takiej operacji. Czy widzisz różnicę?
Oczywiście testy Pawel200x.5 na nic sie zdadzą, bo stawianie pixeli przez Pixels jest tu najwolniejsze - ale gdyby to wywalić i użyć ScanLine to efekty powinny być widoczne. Ale nawet jeśli nie, to czyż na pierwszy rzut oka ich nie widać?