Czy ktos moze to pokazac? Chodzi mi glownie o obliczenie współżędnych wszytkich punktów linii, nie o rysowanie.
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);
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.
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
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;
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
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]
google + DDA
google + Bresenham
google + Wu
Wybierz sobie, najbardziej odpowiadajacy.
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"