Bresenhamův algoritmus - Java

Od: Datum: 05.01.14 20:20 odpovědí: 11 změna: 07.01.14 20:21

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 putPixel(xz, y, color);
if(h>0){xz += d; h+=h2;}
else h+=h1;
}
putPixel(xk, yk, color);

Díky za rady.

Seznam odpovědí:
 
moment čekejte prosím, probíhá přenos dat...
Zobrazení struktury odpovědí v otázce
Skrytí struktury odpovědí v otázce
Zobrazení struktury odpovědí v otázce

 

Odpovědi na otázku:
Od: nufan
Datum: 05.01.14 20:27

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.

Od: laik
Datum: 05.01.14 20:56

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 :)

Ohodnoceno: 0x
 
Od: nufan
Datum: 05.01.14 21:17

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 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?
Od: laik
Datum: 05.01.14 21:55
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. *nevi*
Ohodnoceno: 0x
 
Od: laik
Datum: 05.01.14 22:03
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".
Ohodnoceno: 0x
 
Od: nufan
Datum: 05.01.14 22:48

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.

Od: laik
Datum: 05.01.14 22:58

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.

Ohodnoceno: 0x
 
Od: nufan
Datum: 06.01.14 17:49

Tak co, nedloubal ses v tom trochu? ;)

Od: laik
Datum: 06.01.14 18:10

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.

Ohodnoceno: 0x
 
Od: nufan
Datum: 06.01.14 18:22

Ok, diky za rady.

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

Od: laik
Datum: 07.01.14 20:21

Ja tam zadnou chybu nevidim :( *nevi*

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.

Ohodnoceno: 0x
 

 

 

 

 

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

 
Copyright © 2004-2016 Poradna Poradte.cz. Všechna práva na poradně Poradte.cz vyhrazena.