Algorytm rysowania linii

0

Czy ktos moze to pokazac? Chodzi mi glownie o obliczenie współżędnych wszytkich punktów linii, nie o rysowanie.

0

ile ty masz lat (<15 ??), że nie znasz wzoru y=ax+b. ((do tego wzorku podstawiasz po kolei wszystkie x, i otrzymujesz y ))

Jeżeli chcesz rysować linię na podstawie 2 pktów to musisz rozwiązać układ równań

void pisał o tym niedawno:
Majac 2 punkty A i B liczysz wsp. kierunkowy:
float m = (B.y-A.y)/(B.x-B.y);
I teraz juz prosto wzorek:

//y = mx-mA.x + A.y;
float a,b;
a = m;
b = -m*A.x + A.y;
if(b<0)
printf(" y = %.3fx - %.3f",a,fabs(b));
else
if(b>0)
printf(" y = %.3fx + %.3f",a,fabs(b));
else
printf(" y = %.3fx",a);

0

ile ty masz lat (<15 ??), że nie znasz wzoru y=ax+b. ((do tego wzorku podstawiasz po kolei wszystkie x, i otrzymujesz y ))

A czy ten wzór uwzględnia, że ekran nie jest kwadratowy? ;> i linia czasem wygląda w ten sposób

00110
01100
10000, gdzie 0 to tło a 1 to zapalony piksel?

pzdr,

y.

0

A czy ten wzór uwzględnia, że ekran nie jest kwadratowy? ;> i linia czasem wygląda w ten sposób

a zastanów się gdzie we wzorku jest wzięty pod uwagę rozmiar ekranu??
jak masz kwadrat 10/10 to jest on 10/10

0

kod w ASm pod Pascala
(do przetlumaczenia)

procedure wpixel(x,y,kolor:word);
procedure wpixel (x,y,kolor:word);
var offset :longint;
numer_banku :word;
begin
offset := longint(y)*640+x;
numer_banku := (offset) shr 16;
if numer_banku <> bank then
begin
bank := numer_banku;
asm
mov ax, $4f05
xor bx, bx
mov dx, numer_banku
int $10
end;
end;
mem[$a000:offset mod 65536] := color;
end;
procedure wline(x1,y1,x2,y2:word);
procedure wline;
assembler;
var dy,xs,ys,dp,dd:word;
col:byte;
asm
  mov   ax,x1
  mov   bx,y1
  mov   cl,col 
  xor   ch,ch
  mov   di,cx
  push  ax
  push  bx
  push  di
  call  wpixel
  mov   ax,x2
  mov   bx,x1
  mov   cx,1
  sub   ax,bx
  jnb   @dal1
  mov   cx,65535
  neg   ax
  @dal1:
  mov   xs,cx
  mov   dx,ax
  mov   cx,1
  mov   ax,y2
  mov   bx,y1
  sub   ax,bx
  jnb   @dal2
  mov   cx,65535
  neg   ax
  @dal2:
  mov   ys,cx
  mov   cx,ax
  push  cx
  sub   ax,dx
  ja    @inny
  mov   si,xs
  mov   cl,1
  shl   ax,cl
  mov   dd,ax
  pop   ax
  shl   ax,cl
  mov   dp,ax
  sub   ax,dx
  dec   dx
  mov   cx,dx
  mov   dx,ax
  mov   ax,x1
  mov   bx,y1
  @petla:
  push  cx
  add   ax,si
  test  dx,dx
  js    @1
  add   bx,ys
  add   dx,dd
  jmp   @2
  @1:
  add   dx,dp
  @2:
  push  ax
  push  bx
  push  dx
  push  ax
  push  bx
  push  di
  call  wpixel
  pop   dx
  pop   bx
  pop   ax
  pop   cx
  loop  @petla
  jmp   @koniec
  @inny:
  mov   si,ys
  mov   bx,dx
  sub   dx,cx
  mov   cl,1
  shl   dx,cl
  mov   dd,dx
  mov   ax,bx
  shl   ax,cl
  mov   dp,ax
  pop   cx
  sub   ax,cx
  dec   cx
  mov   dx,ax
  mov   ax,x1
  mov   bx,y1
  @petla1:
  push  cx
  add   bx,si
  test  dx,dx
  js    @3
  add   ax,xs
  add   dx,dd
  jmp   @4
  @3:
  add   dx,dp
  @4:
  push  ax
  push  bx
  push  dx
  push  ax
  push  bx
  push  di
  call  wpixel
  pop   dx
  pop   bx
  pop   ax
  pop   cx
  loop  @petla1
  @koniec:
end;
0

A czy ten wzór uwzględnia, że ekran nie jest kwadratowy? ;> i linia czasem wygląda w ten sposób

a zastanów się gdzie we wzorku jest wzięty pod uwagę rozmiar ekranu??
jak masz kwadrat 10/10 to jest on 10/10

No nie wiem, może mnie zaćmiło i nie wiem co chciałeś przez to powiedzieć, że rozmiar 10/10 to jest 10/10. No, ale załóżmy że mamy erkan o rozmiarze MaxX=3 MaxY=2 i chcemy linię między punktami (1,1) i (3,1). Jak dla mnie to można narysować na 2 sposoby: (lewy dolny róg to (1,1))

011 001
100 oraz 110

i to zależy od zaokrągleń wg mnie. Twój wzorek nie podaje jak zaokrąglać i czy przyjmując tylko zaokrąglanie w dół otrzymamy ładną linię (bez dziur). Jak ten wzó daję ładną linię i moje rozważania są nie na miejscu to proszę moderatora o usunięcie posta coby nie śmiecił ;>

pzdr,

y.

przy czym to zależy jak będziemy brali zaokrąglenia

0

Nie czytam asma wiec nie wiem czy ten kod uwzglednia problem "bezdziurowosci" ale opierajac sie tylko na y=ax+b dostaniesz szereg kropek przy duzym nachyleniu zamiast jednolitej linii:

zle:  dobrze:
0001   0001
0000   0001
0010   0010
0000   0010
0100   0100
0000   0100
1000   1000

wiece proponuje zrobic petle od y[n-1]+1 do y[n] przy rysowaniu x[n]

0

google + DDA
google + Bresenham
google + Wu

Wybierz sobie, najbardziej odpowiadajacy.

0

Nie czytam asma wiec nie wiem czy ten kod uwzglednia problem "bezdziurowosci" [...]

rysowales linie w paincie?
ten kod tworzy wlasnie taka linie. nie ma "dziur"

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