Anonymní profil Gamecam – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Gamecam – Programujte.comAnonymní profil Gamecam – Programujte.com

 

Příspěvky odeslané z IP adresy 78.128.144.–

Java › Phongov osvetlovací model
23. 11. 2015   #206618

Čaute, tak som to úspešne vyriešil. Aspoň postačujúco na môj projekt. 

Pre tých čo to budú niekedy hladať tak postup:

1) Umiestnim si svetlo najlepšie do stredu plátna čo bude vektor (0,0,200) cca 

2) Vypočítam normálu osvetlovanej strany (u strany A,B,C,D) vektory AB, AC, urobím z nich vektorový súčin = normála strany.

3) Naprogramujeme si vzorec (obr1.)

4) Týmto vzorcom dostaneme cos alfa ciže číslo od 0 do 1 (difuzna zložka) (Ak je uhol alfa väčší ako 90° strana nie je osvetlená pri osvetlení do stredu plátna ani viditeľná. )

5) Farbu RGB vynásobíme difuznou zložkou red*diff, green*dif, blue*diff

Potom už stačí iba jedlotlivé strany vyfarbiť.

Dúfam že to niekomu pomôže ak mám niekde chybu opravte ma. 

obr 1

Připojen obrázek.

Gamecam
Java › Seed fill (vyplňovací algori…
13. 11. 2015   #206315

#14 Kit
Ďakujem 1000x, vnukol si mi nápad ktorý fungoval. Spravil som to tak že som upravil čiaru a urobil som myslenú čiaru v každej stene ktorá bola naplnená vyplnovacím algoritmom. za následok to má to že nech je kocka v akomkolvek uhle tak vždy každú plochu nejaká myslená uhlopriečka pretína. Stačilo to dať do kódu. Ďakujem ;)

Gamecam
Java › Seed fill (vyplňovací algori…
13. 11. 2015   #206309

#12 Kit
Práve že keď som tam tie ifi nemal tak sa program zasekol. S kolekciou som ešte nerobil takže som sa do toho ani nejak nepúšťal. Teraz skôr potrebujem vyriešiť akým spôsobom tú kocku vyfarbím. Najhoršie na tom je že kocka môže rotovať takže nech som bádal ako som bádal nevymyslel som nič čím by som tú kocku na 100% vyfarbil. 

1) Skúšal som rozdeliť kocku na 4 časti a podľa x,y bodov v ktorej časti sa nachádzali som použil vyplňovací algoritmus. Bohužiaľ to sa moc neosvedčilo a dosť často vznikali miesta ktoré sa nevyfarbili, poprípade sa zafarbilo aj plátno.

2) Skúsil som kružnicu vpísať do kocky a následne po celom obvode kružnice vyvolať vyplňovací algoritmus. Bohužiaľ aj tu som sa stretol s pár miestami kam proste kružnica nedočiahne a proste sa nevyplnia.

Aktuálne mi dneska už došli nápady čo by som ešte mohol vyskúšať a už ani google nevyhľadáva žiadne zaujímavé odkazy ktoré by pomohli. Uvidíme, možno sa mi to v noci rozleží v hlave a čosi vymyslím ale ak má niekto nejaký nápad ako by to šlo, bol by som moc rád. 

Gamecam
Java › Seed fill (vyplňovací algori…
12. 11. 2015   #206301

#10 Kit
V jave profík nie som ale ak sa nepletiem tak tam používa už vstavané funkcie ktoré ten polygon vyfarbia, lenže zadanie našeho semestrálneho projektu je že môžeme použiť kresliace funkcie ktoré sami spravíme. Respektíve ak chcem vykresliť úsečku musím si ju naprogramovať (bresenhamov algoritmus), ak chcem nakresliť krychlu musím si ju naprogramovať ak s ňou chcem točiť tak to isté. Bohužiaľ dokážem robiť len s tým k čomu mám nejaké materiály a aspoň trošku ovládam princíp. Ciže sčítané podtrhnuté musím vymyslieť spôsob ako tú krychlu vyfarbiť a tieńovanie a viditeľnosť hrán ešte bude iný level.... (to ma ešte čaká).

Takže asi tak

Gamecam
Java › Seed fill (vyplňovací algori…
12. 11. 2015   #206299

Takže po pár hodinách sedenia pri tom som sa dostal k finálnej verzii algoritmu cez nerekurzivnu možnosť za pomoci zásobníka. Posledná vec čo mi zostáva je zistiť ako vypočítam body použitia algoritmu pre každú s plôch krychle. 

Mám krychlu (napriklad):

Připojen obrázek.

Nejaký nápad ako by som dostal 7 rôznych bodov odkial použijem vyplňovací algoritmus? 

Nerekurzívna verzia vyplnenia:

 public void flood(int x, int y) 
        {
        
        Zasobnik zacatek, konec;
        zacatek = null;
        konec = null;
        
        Zasobnik p= new Zasobnik (x,y);
        zacatek = p;
        konec = p;
        
        while (zacatek!=null)
            {
          if (!graphic.compare(graphic.getPixel(zacatek.x+1, zacatek.y), cervena) && !(graphic.compare(graphic.getPixel(zacatek.x+1, zacatek.y), farba)))
                {
                p = new Zasobnik (zacatek.x+1,zacatek.y);
                konec.dalsi=p;
                konec=p;
                graphic.putPixel(zacatek.x+1, zacatek.y, cervena);
                }
            
            if (!graphic.compare(graphic.getPixel(zacatek.x-1, zacatek.y), cervena) && !(graphic.compare(graphic.getPixel(zacatek.x-1, zacatek.y), farba)))
                {
                p = new Zasobnik (zacatek.x-1,zacatek.y);
                konec.dalsi=p;
                konec=p;
                graphic.putPixel(zacatek.x-1, zacatek.y, cervena);
                }
            
            if (!graphic.compare(graphic.getPixel(zacatek.x, zacatek.y+1), cervena) && !(graphic.compare(graphic.getPixel(zacatek.x, zacatek.y+1), farba)))
                {
                p = new Zasobnik (zacatek.x,zacatek.y+1);
                konec.dalsi=p;
                konec=p;
                graphic.putPixel(zacatek.x, zacatek.y+1, cervena);
                }
            
            if (!graphic.compare(graphic.getPixel(zacatek.x, zacatek.y-1), cervena) && !(graphic.compare(graphic.getPixel(zacatek.x, zacatek.y-1), farba)))
                {
                p = new Zasobnik (zacatek.x,zacatek.y-1);
                konec.dalsi=p;
                konec=p;
                graphic.putPixel(zacatek.x, zacatek.y-1, cervena);
                }
            zacatek=zacatek.dalsi;
            }
        }
Gamecam
Java › Seed fill (vyplňovací algori…
12. 11. 2015   #206297

#7 Kit
No okresal som to ako sa dalo a aj tak to nejde. Došiel som k názoru že algoritmus je správny, pretože na malý objekt cca 100x100 funguje ale pri 200x200 už nie. Otázka je čo teraz. Potrebujem vyfarbiť steny 3D krychle no nenapadá ma nijaká možnosť ako by som to spravil. 

Gamecam
Java › Seed fill (vyplňovací algori…
12. 11. 2015   #206294

#4 lukas.balaz
Celé plátno mám ohraničené čiarnou farbou takže kontrolujem len či nenačítava černu farbu (farba). 

Gamecam
Java › Seed fill (vyplňovací algori…
12. 11. 2015   #206293

Jednu chybu už som našiel a to sú špatné súradnice tých pridavaných a porovnávaných bodov, ale po opravení na zaciatok.x a zaciatok.y sa program zacyklí. 

Gamecam
Java › Seed fill (vyplňovací algori…
12. 11. 2015   #206289

#2 lukas.balaz
Skúsil som dať na teba a naprogramoval som to zo zásobníkom. Aktuálne to nehádže error ale vyfarbí iba pár pixelov v okolí (cca 8-9). Myslím že som s toho sedenia pri tom asi niečo prehliadol.

Aktuálne to vyzerá nejak takto

public void flood(int x, int y) 
        {
        Zasobnik zacatek, konec;
        zacatek = null;
        konec = null;
        
        Zasobnik p= new Zasobnik (x,y);
        zacatek = p;
        konec = p;
        
        while (zacatek!=null)
            {
            graphic.putPixel(zacatek.x, zacatek.y, cervena);
            
            if (!graphic.compare(graphic.getPixel(x+1, y), cervena) && !(graphic.compare(graphic.getPixel(x+1, y), farba)))
                {
                p = new Zasobnik (x+1,y);
                konec.dalsi=p;
                konec=p;
                }
            
            if (!graphic.compare(graphic.getPixel(x-1, y), cervena) && !(graphic.compare(graphic.getPixel(x-1, y), farba)))
                {
                p = new Zasobnik (x-1,y);
                konec.dalsi=p;
                konec=p;
                }
            
            if (!graphic.compare(graphic.getPixel(x, y+1), cervena) && !(graphic.compare(graphic.getPixel(x, y+1), farba)))
                {
                p = new Zasobnik (x,y+1);
                konec.dalsi=p;
                konec=p;
                }
            
            if (!graphic.compare(graphic.getPixel(x, y-1), cervena) && !(graphic.compare(graphic.getPixel(x, y-1), farba)))
                {
                p = new Zasobnik (x,y-1);
                konec.dalsi=p;
                konec=p;
                }
            zacatek=zacatek.dalsi;
            }
        }
Gamecam
Java › Seed fill (vyplňovací algori…
12. 11. 2015   #206285

Čaute, znova a opäť ja. Narazil som dneska na problém ohľadne vyplňovanie farbou. Potrebujem vyplniť strany 3D kocky lenže pri pokuse o vyplnenie mi program vždy spadne. Na internete som študoval veľa kódov podľa ktorých som to písal.

Môj kód

public void flood(int x, int y) {
        
        //Overovanie či X,Y neni za hranicou    
        if (x < 0) return;
        if (y < 0) return;
        if (x >= canvas.getWidth()-1) return;
        if (y >= canvas.getHeight()-1) return;
        
       
        if ((graphic.getPixel(x, y).r==cervena.r) && (graphic.getPixel(x, y).g==cervena.g) && (graphic.getPixel(x, y).b==cervena.b)) return;
        
        graphic.putPixel(x, y, cervena);
        
        flood(x - 1, y);
        flood(x + 1, y);
        flood(x, y - 1);
        flood(x, y + 1);
        return;
        }

Bohužiaľ keď to spustím vypíše mi chybu: Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError

Myslím že sa jedná o tú rekurziu. Každopádne potrebujem poradiť nejaký algoritmus ktorý by mi to 3D teleso dokázal v rôznych uhloch pohľadu vyfarbiť. Mne osobne už dochádzajú nápady.

Ak máte nejaké nápady budem rád.

Gamecam
Java › Deformacia pri vykreslovani
11. 11. 2015   #206268

#2 Saguaro
Vynikajúci nápad. 100x ďakujem ;) Po ukladaní skutočných hodnôt bez zaokrúhlovania všetko funguje parádne bez akejkoľvek deformácie.

Môžete lock. :)

Gamecam
Java › Deformacia pri vykreslovani
11. 11. 2015   #206267

#2 Saguaro
Nápad dobrý, skúsim to tam nejak implementovať :) 

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032020 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý