Rysoowanie siatki

0

Witam. Jak można narysować taką siatkę, jaka jest na formatce w delphi?

0
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 ;))

0

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

0

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

0

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!!

0

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

0

Dzięki, ale ta twoja funkcja rysuje tylko w jednej linii te kropki.. ale ja już sobie z nią poradziłem;]

0

To dlatego, że Marooned nie wyzerował "x"`a w odpowiednim miejscu.. ale lepiej zrobić to na pętli "for".

0

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ść

0

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.

0

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ść :>

0

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ć?

1 użytkowników online, w tym zalogowanych: 0, gości: 1