Nejste přihlášen/a.

Přihlásit se do poradny

 

Bresenhamův algoritmus - Java

Od: nufan odpovědí: 11 změna:

Zdravím,

mám naimplementovaného Bresenhama, ale nefunguje pro úsečky s úhlem>45°. Nevíte proč? Je to ze skript od vyučujícího,

pocatecni bod(xz, yz)

koncovy bod(xk, yk)

int deltaY = yk - yz;
int deltaX = xk - xz;

if(yz>yk)d = -1;
else d = 1;
h1 = 2*Math.abs(deltaY); h2 = h1 - 2*deltaX; h = h1 - deltaX;
for(int x = xz; x putPixel(x, yz, color);
if(h>0){yz+=d; h+=h2;}
else h+=h1;
}
putPixel(xk, yk, color);


if(xz>xk)d = -1;
else d = 1;
h1 = 2*Math.abs(deltaX); h2 = h1 - 2*deltaY; h = h1 - deltaY;
for(int y = yz; y < yk; y++){
putPixel(xz, y, color);
if(h>0){xz += d; h+=h2;}
else h+=h1;
}
putPixel(xk, yk, color);

Díky za rady.

 

 

11 odpovědí na otázku
Řazeno dle hodnocení

 

 

nufan

Jinak ta prvni cast, kde mam v cyklu for x mi funguje i bez te druhe casti dole, kde mam v cyklu for y. Ale naopak ne a je tam problem s tim uhlem.

 

laik*

0x

Aniz bych o problematice cokoliv vedel, tak z tech par stranek, co jsem si ted na Internetu u Bresenhamove algoritmu precetl, tak je definovan jen pro uhly (0° - 45° (a z logiky algoritmu - tedy "pristi bod rovne nebo o jeden pixel nahoru", i vyplyva, ze vetsi uhel nez 45° vykreslit nemuze.

Prvni, co me napada, jak to osetrit, je zkonvertovat ten algoritmus pro hlavni posun ve smeru osy "y"misto "x"(zrejme jen vhodnym prohozenim dodavanim parametru "x"a "y"do algoritmu). Jak se to ale dela v praxi, to jsem si jeste nenacetl a necham to na tobe

nufan

Máš pravdu. Počítá se s tím, že je do 45% a rostoucí (xz

Pak mám uvedeno ve skriptech: případ úsečky se sklonem>45° se řeší přehozením x a y. A následuje ta druhá část:

h1 = 2*Math.abs(deltaX); h2 = h1 - 2*deltaY; h = h1 - deltaY;
for(int y = yz; y < yk; y++){
putPixel(xz, y, color);
if(h> 0){xz += dx; h+=h2;}
else h+=h1;
}
putPixel(xk, yk, color);}

To mi dává smysl. Sklon> 45°je, když deltaY> deltaX - velmi rostoucí úsečka. Proto když deltaX> deltaY, tak mám v kladné větvi IFu tu první část a v ELSE mám tady tuto druhou část...no jenže nefunguje...jak s rostoucím úhlem na 45° se úsečka zmenšuje(pravděpodobně to h je záporné).

Tak kde je chyba?
laik*
Snazim se tady ten algoritmus pochopit, ale Javovy zapis smycky "for" me nejak mate a navic uz se mi unvaou zaviraji oci, takze mi to nemysli na 100%. Proc to nefunguje, to v tom ted nevidim. Mozna zitra s cistou hlavou.
laik*
Jestli to potrebujes odladit dneska v noci, tak to budes muset odkrokovat nebo to doplnit "printama" a misto Plot tam dat vypsani aktualni [x,y]. Pak si to projet pro nejake kratke usecky (treba vzrust 4 pixelu ("y") na 10 pixelu delky ("x") a koukej, kudy ti ten program leze a jak se ti vyviji ty "hacka".
nufan

Kdyžtak koukni sem: skripta odkud to mám.

Na straně 3 začíná Bresenham, na konci strany 5 je výsledný algoritmus, na začátku strany 6 ten pro sklon>45°. Tak kdyžtak pls koukni. Na obrázku je jak to mám v programu.

laik*

Ted v tom screenshotu uz alespon vidim parametry toho "for"a odkud kam vedou bloky, coz v tom tvem predchozim vypisu nebylo mozne a dokonce to tam uplne chybelo (nepouzil si tagy CODE pro neformatovani textu, jak je zde doporuceno).

Pises to v peknych NetBeans. To musi byt uplne trivialni to odladit pres pozorovani promennych.

Dneska uz jdu vazne do postele.

nufan

Tak co, nedloubal ses v tom trochu?

laik*

Myslel jsem na to cely den, ale jeste jsem se k tomu nedostal. Musim to odsunout na dnesni pozdni noc.

Stejne se mi jako nejlepsi reseni jevi to, ze si tam zapnes to monitorovani obsahu promennych, pustis na to tu moji doporucnenou krivku (stoupani o 10 pixelu ("y") na 4 pixely osy "x") a budes se koukat, jak se ti to tam meni a proc to nefunguje.

nufan

Ok, diky za rady.

Kdyby ses k tomu náhodou dostal do zítřka, tak by mi to hodně pomohlo.

laik*

Ja tam zadnou chybu nevidim

Zadavas tam jen pocatecni a koncove body tak, aby lezely v 1.kvadrantu (tj. uhly 0°..90°)? Protoze pro ostatni kvadranty to nemas podle me spravne osetrene. Myslim, ze by stacilo, kdyby jsi misto if(deltaX>deltaY) mel if(abs(deltaX)>(abs(deltaY)).

Vic uz k tomu asi nevymyslim.

Je to ale pekny algoritmus. Musim si ho pamatovat.

 

 


 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.

Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.

Copyright © 2004-2025 Poradna Poradte.cz. Všechna práva vyhrazena. Prohlášení o ochraně osobních údajů. | [tmavý motiv]