Sierpinski trojúhelník – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Sierpinski trojúhelník – Java – Fórum – Programujte.comSierpinski trojúhelník – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Siggi0
Návštěvník
17. 10. 2015   #1
-
0
-

Zdravím mám jeden problém a jeden dotaz. Dotaz je v komentáři  /*  */ a problém mám v metodě divide(int depth), kdy mám vykreslit sierpinski trojúhelník a to tak:

Vytvořte přetíženou metodu divide(int depth). Metoda bude rekurzivní, parametr depth udává rekurzivní hloubku dělení trojúhelníka. Pokud je hodnota větší než nula, dojde k rozdělení pomocí původní metody divide(). Poté se zavolá metoda divide(int depth) na všech třech nově vzniklých trojúhelnících s hodnotou parametru o jedničku menší. Pokud je hodnota vstupního parametru menší nebo rovna nule, trojúhelník se již dále nedělí.

public class Triangle {
    
    private final Vertex2D a; 
    private final Vertex2D b; 
    private final Vertex2D c; 
    private int depth;
    private boolean divide = false;
    private Triangle subA = null;
    private Triangle subB = null;
    private Triangle subC = null;
    
    /**
     * Set vertices triangle
     * @param a side a
     * @param b side b
     * @param c side c
     */
    public Triangle(Vertex2D a, Vertex2D b, Vertex2D c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    
    /**
     * Overloaded constructor with one param extra
     * @param a side a
     * @param b side b
     * @param c side c
     * @param depth depth sierpinski triangle
     */
    public Triangle(Vertex2D a, Vertex2D b, Vertex2D c, int depth) {
        this(a,b,c);
        this.depth = depth;
    }
    
    /**
    * Check if triangle was divided to sub triangle
    * @return  If triangle was divided then return true else false
    */
    public boolean isDivided() {
        return(divide);
    }
    
    /**
     * Check the number i and if was divided, then return sub triangle
     * @param i number of sub triangle (0 - 2)
     * @return sub triangle
     */
    public Triangle getSubTriangle(int i) {
        if(isDivided()){
            switch(i) {
                case 0: return subA;
                case 1: return subB;
                case 2: return subC;
                default: return null;
            }
        }
        return null;
    }
    
    /**
     * From big triangle count three sub triangles and sets them vertices
     * @return true or false depend if triangle was divided to sub triangle
     */
    public boolean divide() {
        if(isDivided()) {
            return false;
        } else {
            Vertex2D middleOfAB = new Vertex2D(((a.getX() + b.getX()) / 2), ((a.getY() + b.getY()) / 2));
            Vertex2D middleOfAC = new Vertex2D(((a.getX() + c.getX()) / 2), ((a.getY() + c.getY()) / 2));
            Vertex2D middleOfBC = new Vertex2D(((b.getX() + c.getX()) / 2), ((b.getY() + c.getY()) / 2));
            
            subA = new Triangle(a, middleOfAB, middleOfAC);
            subB = new Triangle(middleOfAB, b, middleOfBC);
            subC = new Triangle(middleOfAC, middleOfBC, c);
            
            divide = true;
            return true;
        }        
    }
    

 //*********** Tuto přetíženou metodu neumím ovládnout

    public boolean divide(int depth) {
        if(depth > 0) {
            boolean x = divide();
            if(x){
                this.divide = true;
            }
            for(int i = 0; i < 3; i++){
                getSubTriangle(i);
            }
            divide(depth--);
        }
        
        return true;
    }
    

//* Tady mám dotaz, jestli by šlo z jiné třídy ve stejném balíčku odkázat na metodu a nemuset 3x vypisovat totéž (dole dám   kód z druhé třídy    *//

    public boolean isEquilateral() {
        double pointA;
        double pointB;
        double pointC;

        pointA = Math.sqrt((Math.pow(a.getX() - b.getX(), 2) + Math.pow(a.getY() - b.getY(), 2)));
        pointB = Math.sqrt((Math.pow(a.getX() - c.getX(), 2) + Math.pow(a.getY() - c.getY(), 2)));
        pointC = Math.sqrt((Math.pow(b.getX() - c.getX(), 2) + Math.pow(b.getY() - c.getY(), 2)));
        
        return (Math.abs(pointA - pointB) < 0.001 && Math.abs(pointA - pointC) < 0.001 &&
                Math.abs(pointB - pointC) < 0.001);
    }
    
    public Vertex2D getVertexA() {
        return a;
    }
    
    public Vertex2D getVertexB() {
        return b;
    }
    
    public Vertex2D getVertexC() {
        return c;
    }
    
    @Override
    public String toString() {
        if(getVertexA() == null || getVertexB() == null || getVertexC() == null){
            return "INVALID TRIANGLE";
        }
        return "Triangle: vertices=" + getVertexA() + " " + getVertexB() + " " + getVertexC();
    }
    
}

druhá třída:

public class Vertex2D {

    public double distance(Vertex2D point) {
        if(point == null) {
            return -1;
        }
        return Math.sqrt((Math.pow(point.getX() - x, 2) + Math.pow(point.getY() - y, 2)));
    }
Nahlásit jako SPAM
IP: 46.229.123.–
Reklama
Reklama
Kit+11
Guru
17. 10. 2015   #2
-
0
-

#1 Siggi 

double pointA;
pointA = Math.sqrt((Math.pow(a.getX() - b.getX(), 2) + Math.pow(a.getY() - b.getY(), 2)));

To jsi kde vyhrabal tu metodu Math.pow()? Ta se k takovým účelům vůbec nemá používat.

double dx = a.getX() - b.getX();
double dy = a.getY() - b.getY();
double pointA = Math.sqrt(dx*dx + dy*dy);

Uznej, že takhle je to přehlednější a rychlejší.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #3
-
0
-

#2 Kit
To je euklidovská vzdálenost: odmocnina((x2 - x1)^2 + (y2 - y1)^2) a math.pow je na druhou.

Nic méně toto mi nijak neřeší ani jeden dotaz co jsem se ptal ;), ale díky za reakci

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #4
-
+1
-
Zajímavé

#3 Siggi
Tak nějakou odpověď. Distanci můžeš vpašovat do třídy Vertex2D. Volání pak vypadá takto:

    public boolean isEquilateral() {
        double pointA = b.distance(c);
        double pointB = c.distance(a);
        double pointC = a.distance(b);
        return (
                Math.abs(pointA - pointB) < 0.001 &&
                Math.abs(pointA - pointC) < 0.001 &&
                Math.abs(pointB - pointC) < 0.001
               );
    }

    @Override
    public String toString() {
        if (a == null || b == null || c == null) {
            return "INVALID TRIANGLE";
        }
        return "Triangle: vertices=" + a + " " + b + " " + c;
    }

a třída Vertex2D se trochu rozšíří:

class Vertex2D {
    private double x;
    private double y;

    public Vertex2D(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double distance(Vertex2D point) {
        double dx = point.x - x;
        double dy = point.y - y;
        return Math.sqrt(dx*dx + dy*dy);
    }

    @Override
    public String toString() {
        return "[" + x + ", " + y + "]";
    }
}

Všimni si, že zmizely gettery, protože už nejsou potřebné.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #5
-
0
-

#4 Kit
Já tam vynechával tu inicializační a-c a pořád mi to hlásilo chybu. Díky. Toto mi zpřehlední kód, než to tam 3x pastovat. Jinak já tu Vertex2D třídu mám pořádně rozepsanou :) jen jsem to vycucl na tu jednu metodu co mě zajímala. Gettry si tam, ale nechám, protože bych se měl řídit podle pokynů.

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #6
-
0
-

#5 Siggi
Někdo tě nutí používat gettery? Měli byste se učit programovat objektově.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #7
-
0
-

#6 Kit
Na začátku každého týdne si stáhneme iterace. Ze začátku jsme použili Gettery a Settery. Settery jsme později nahradili konstruktorama, ale o getterech se nezmínili, že by jsme je měli smazat nebo nějak vyměnit.

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #8
-
0
-

#7 Siggi
Aha, možná na to teprve přijde řada. Gettery a settery se totiž používají k naroubování procedurálních algoritmů do objektového jazyka. V OOP nejsou potřebné, ale je k tomu nutné zvládnout SOLID.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #9
-
0
-

A mohl by si mě popostrčit k problému co se týče toho trojúhelníku? Tam je to na mě nějak už moc zamotané a složitější.

Mělo to být bonusové, ale cvičící říkal, že jelikož si to můžeme doimplementovat doma, tak chce po nás i ty bonusové věci.

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #10
-
0
-

#9 Siggi
Rozdělením vzniknou 3 trojúhelníky (prostřední nebudeme uvažovat). Potřebuješ tedy zavolat 3 konstruktory třídy Triangle vždy se správnými třemi vertexy jako parametry. Na každý z těch trojúhelníků pak opět zavoláš metodu divide().

Ty booleovské proměnné podle mne nepotřebuješ, můžeš je v klidu vyhodit.

BTW: Nemohu ti to napsat kompletně, cvičící by to určitě poznal.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #11
-
0
-

#10 Kit
V zadání nikde nemám, že bych měl vytvářet nové konstruktory. Vytvořil jsem si jen jeden přetížený konstruktor o parametr navíc s depth, to tam bylo. Můžu využít jen to co tam mám naimplementováno. Přesněji tu metodu, ale nevím jak ji napsat. Jestli se chápeme dobře.

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #12
-
0
-

#11 Siggi
Další konstruktory už nepotřebuješ, stačí ti ten jeden. Další trojúhelník -> další objekt.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #13
-
0
-

#12 Kit
Takže.. podmínka > 0, zavolám divide(), zavolám 3konstruktory na výpočet a dám rekurzi o -1? Pokud ano, tak teoreticky to chápu a prakticky to bude horší.

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #14
-
0
-

#13 Siggi
Zdá se, že to chápeš. Metoda divide() bude potřebovat parametr depth, který nejprve zkontroluješ na >0 a pak ho předáš těm třem konstruktorům jako čtvrtý parametr -1.

Ty booleany vyhoď, dělají ti v tom jen paseku.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #15
-
0
-

#14 Kit
Ty tam, ale z předešlé iterace mají být a nikde není psáno smazat je. Takže bohužel je tam musím mít. Ale když mám volat divide() bez parametru a budu mu tam házet parametr depth, tak se zavolá sám sebe a ne ten bez parametru. Nebo si mně to teď zamotal :D:D

    public boolean divide() {
        if(isDivided()) {
            return false;
        } else {
            Vertex2D middleOfAB = new Vertex2D(((a.getX() + b.getX()) / 2), ((a.getY() + b.getY()) / 2));
            Vertex2D middleOfAC = new Vertex2D(((a.getX() + c.getX()) / 2), ((a.getY() + c.getY()) / 2));
            Vertex2D middleOfBC = new Vertex2D(((b.getX() + c.getX()) / 2), ((b.getY() + c.getY()) / 2));
            
            subA = new Triangle(a, middleOfAB, middleOfAC, depth-1);
            subB = new Triangle(middleOfAB, b, middleOfBC, depth-1);
            subC = new Triangle(middleOfAC, middleOfBC, c, depth-1);
            
            divide = true;
            return true;
        }        
    }
    
    public boolean divide(int depth) {
        if(depth > 0) {
            divide();
            divide(depth--);
        } 
        return true;
    }
Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #16
-
0
-

#15 Siggi
Mezitím jsem si přidal do třídy Vertex2D metodu a.middle(b), která mi vyrobí nový Vertex2D se správnými souřadnicemi uprostřed (a, b).

Ta metoda divide() bez parametrů jen vyrobí ten parametr a předá ho metodě divide(depth).

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #17
-
0
-

Vůbec se nechytám, vím teoreticky, mám to i nakreslené, ale jak to naimplemenotvat -.-

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
17. 10. 2015   #18
-
0
-

#17 Siggi
Mně to už funguje, ale řešení bych ti posílat neměl. Vše jsem ti už popsal.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
17. 10. 2015   #19
-
0
-

#18 Kit
Jasné, ani to po tobě nechci, odevzdám co mám, nedá se nic dělat. Takhle se to nenaučím.

Nahlásit jako SPAM
IP: 46.229.123.–
Siggi0
Návštěvník
18. 10. 2015   #20
-
0
-

   

    public boolean divide() {
        if(isDivided()) {
            return false;
        } else {
            Vertex2D middleOfAB = new Vertex2D(((a.getX() + b.getX()) / 2), ((a.getY() + b.getY()) / 2));
            Vertex2D middleOfAC = new Vertex2D(((a.getX() + c.getX()) / 2), ((a.getY() + c.getY()) / 2));
            Vertex2D middleOfBC = new Vertex2D(((b.getX() + c.getX()) / 2), ((b.getY() + c.getY()) / 2));
            
            subA = new Triangle(a, middleOfAB, middleOfAC, depth - 1);
            subB = new Triangle(middleOfAB, b, middleOfBC, depth - 1);
            subC = new Triangle(middleOfAC, middleOfBC, c, depth - 1);
            
            divide = true;
            return true;
        }        
    }
    
    public Vertex2D middle(Vertex2D pointA, Vertex2D pointB, Vertex2D pointC){
        Vertex2D middleNewSub = new Vertex2D(((pointA.getX() + pointB.getX()) / 2) + (pointB.getX() - pointC.getX()) / 2,
                                             ((pointA.getY() + pointB.getY()) / 2) + (pointB.getY() - pointC.getY()) / 2);    
        return middleNewSub;
    }
    
    public Vertex2D middleC(Vertex2D point){
        Vertex2D middleNewSubC = new Vertex2D(((a.getX() + b.getX()) / 2), ((b.getY() + c.getY()) / 2));
        return middleNewSubC;
    }
    
    /**
     * sdf
     * @param depth dsf
     * @return  dfs
     */
    public boolean divide(int depth) {
        if(depth > 0) {
            divide();
            middle(a,b,c);
            
            divide(depth--);
        } 
        return true;
    }

Motám se v tom, trošku popostrčit.

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
18. 10. 2015   #21
-
0
-

#20 Siggi
Ty 3 řádky v divide() jsem zjednodušil takto: 

Vertex2D middleOfAB = a.middle(b);
Vertex2D middleOfAC = a.middle(c);
Vertex2D middleOfBC = b.middle(c);

protože ten obsah se týkal vyloženě třídy Vertex2D. Doplnil jsem si do ní metodu middle():

public Vertex2D middle(Vertex2D point) {
    if (point == null) {
        return null;
    }
    return new Vertex2D((x + point.x) / 2, (y + point.y) / 2);
}

Jak vidíš, getterů a setterů se zbavuji injektováním algoritmů do příslušných tříd. Má to i svůj název: Déméteřin zákon.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+11
Guru
18. 10. 2015   #22
-
0
-

#20 Siggi
Dávej si pozor na zápis 

divide(depth--);

Dělá dvě operace, ale jednu z nich dělat nechceš. Správně bys to měl zapsat 

divide(depth - 1);

Tento zápis dělá jen operaci, kterou skutečně chceš.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
18. 10. 2015   #23
-
0
-

#22 Kit
Problém je, ať napíšu cokoliv nebo změním souřadnice, pořád tam mám jen jeden modrej trojúhelník a nevidím s kódem co píšu jak se mi to mění.

Nahlásit jako SPAM
IP: 147.251.212.–
Kit+11
Guru
18. 10. 2015   #24
-
0
-

#24 Siggi
Mám ho.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
18. 10. 2015   #25
-
0
-

#24 Kit
V main src je u 02.html je i to zadání z čeho jsem čerpal.

Nahlásit jako SPAM
IP: 147.251.212.–
Kit+11
Guru
18. 10. 2015   #26
-
0
-

#25 Siggi
V zadání není ani zmínka o metodě Math.pow(). Měl bys ji zrušit, strhávají se za ni body.

Nějak podivně voláš metodu middle(). Měla by být spíš 

Vertex2d stred = a.middle(b);

tedy souřadnice bodu uprostřed mezi body "a" a "b".

Všechno ostatní bys už snad měl mít. 

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
18. 10. 2015   #27
-
0
-

#26 Kit
Ani čárka navíc a ikdyž pozměním c za a atd.., nic se nevykreslí a nic se nezmění, jen když vymažu gettery, tak mi zmizne iniciální trojúhelník.

    public boolean divide() {
       /* if(isDivided()) {
            return false;
        } else { */
            
            subA = new Triangle(a, a.middle(b), a.middle(c));
            subB = new Triangle(a.middle(b), b, b.middle(c));
            subC = new Triangle(a.middle(c), b.middle(c), c); 

           /* divide = true;*/
            return true;
      //  }        
    }
       
    /**
     * Recursive sierpinski triangle
     * @param depth depth sierpinski triangle
     * @return boolean
     */
    public boolean divide(int depth) {
        if(depth > 0) {
            divide();
            
            subA = new Triangle(a, a.middle(b), a.middle(c), this.depth - 1);
            subB = new Triangle(a.middle(b), b, b.middle(c), this.depth - 1);
            subC = new Triangle(a.middle(c), b.middle(c), c, this.depth - 1);           
            
            divide(depth - 1);
        } 
        return true;
    }
Nahlásit jako SPAM
IP: 147.251.212.–
Kit+11
Guru
18. 10. 2015   #28
-
0
-

#27 Siggi
Při vykreslování trojúhelníku totiž kreslíš jen ten hlavní, ale nevoláš vykreslení těch vnitřních.

Klíčovým slovem "else" je potřeba šetřit. Osobně ho už nepoužívám vůbec. 

    public boolean divide() {
        if (isDivided()) {
            return false;
        }
        subA = new Triangle(a, a.middle(b), a.middle(c));
        subB = new Triangle(a.middle(b), b, b.middle(c));
        subC = new Triangle(a.middle(c), b.middle(c), c); 
        return true;
    }

Koukám, že to dělení děláš 2× - podruhé je přepíšeš. To není dobře.

Hodně tam zlobí proměnná this.depth vs. parametr depth. Ujasni si, kdy chceš který z nich použít.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
18. 10. 2015   #29
-
0
-

#28 Kit
Nějak nechápu jak bych to měl volat já? ...

Psali tam, pak zavolejte 3x konstruktory s 4 parametrem , už jsem z toho fakt zmatenej

Nahlásit jako SPAM
IP: 147.251.212.–
Kit+11
Guru
18. 10. 2015   #30
-
0
-

#29 Siggi
Jedna z těch dvou metod divide() vypadá, jako kdyby byla zbytečná. Pokud tam mají být obě, musíš tu práci rozdělit mezi ně. Třeba takto: 

public boolean divide() {
    if (isDivided()) {
       return false;
    }
    subA = new Triangle(a, a.middle(b), a.middle(c), depth - 1);
    subB = new Triangle(a.middle(b), b, b.middle(c), depth - 1);
    subC = new Triangle(a.middle(c), b.middle(c), c, depth - 1);
    return true;
}

public boolean divide(int depth) {
    if(depth <= 0) {
        return false;
    }
    this.depth = depth;
    divide();
    return true;
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+11
Guru
18. 10. 2015   #31
-
0
-

#29 Siggi
Možná to má být obráceně: 

public boolean divide() {
    if(depth <= 0) {
        return false;
    }
    divide(depth);
    return true;
}

private boolean divide(depth) {
    if (isDivided()) {
       return false;
    }
    subA = new Triangle(a, a.middle(b), a.middle(c), depth - 1);
    subB = new Triangle(a.middle(b), b, b.middle(c), depth - 1);
    subC = new Triangle(a.middle(c), b.middle(c), c, depth - 1);
    return true;
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
18. 10. 2015   #32
-
0
-

#30 Kit
V tomhle tvaru to stejnak vypisuje jen jeden trojuhelnik.

Obráceně ne, tam je jasně dané, zavolá se původní metoda na rozdělení divide() a pak se zavolá metoda divide(depth) na nově vzniklích.

Nahlásit jako SPAM
IP: 147.251.212.–
Siggi0
Návštěvník
18. 10. 2015   #33
-
0
-

Pokud máš řešení a funguje ti to na tom projektu co jsem poslal, pošleš mi to? Už to stejnak nemohu použít. Mám po limitu, ale to řešení mě fakt zajímá. Zase tam bude nějaká chyba, která mi to celá .......

Nahlásit jako SPAM
IP: 147.251.212.–
Kit+11
Guru
19. 10. 2015   #34
-
0
-

#33 Siggi
Na tom projektu jsem to nezkoušel. Pouze jsem to vypisoval metodou toString():

public class Triangle {

    public static void main(String[] args) {
        Triangle trojuhelnik = new Triangle(
                new Vertex2D(0, 0), 
                new Vertex2D(8, 0), 
                new Vertex2D(8, 8), 
                3
                );
        trojuhelnik.divide();
        System.out.println(trojuhelnik);
    }
    
    private final Vertex2D a;
    private final Vertex2D b;
    private final Vertex2D c;
    private int depth;
    private Triangle subA = null;
    private Triangle subB = null;
    private Triangle subC = null;

    public Triangle(Vertex2D a, Vertex2D b, Vertex2D c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public Triangle(Vertex2D a, Vertex2D b, Vertex2D c, int depth) {
        this(a, b, c);
        this.depth = depth;
    }

    public Triangle getSubTriangle(int i) {
        switch (i) {
            case 0:
                return subA;
            case 1:
                return subB;
            case 2:
                return subC;
        }
        return null;
    }

    public boolean divide() {
        if (depth <= 0) {
            return false;
        }
        divide(depth);
        return true;
    }

    public boolean divide(int depth) {
        if (depth <= 0) {
            return false;
        }
        Vertex2D middleOfAB = a.middle(b);
        Vertex2D middleOfAC = a.middle(c);
        Vertex2D middleOfBC = b.middle(c);
        subA = new Triangle(a, middleOfAB, middleOfAC);
        subA.divide(depth-1);
        subB = new Triangle(middleOfAB, b, middleOfBC);
        subB.divide(depth-1);
        subC = new Triangle(middleOfAC, middleOfBC, c);
        subC.divide(depth-1);
        return true;
    }

    public boolean isEquilateral() {
        double pointA = b.distance(c);
        double pointB = c.distance(a);
        double pointC = a.distance(b);
        return (
                Math.abs(pointA - pointB) < 0.001 &&
                Math.abs(pointA - pointC) < 0.001 &&
                Math.abs(pointB - pointC) < 0.001
               );
    }

    @Override
    public String toString() {
        if (a == null || b == null || c == null) {
            return "INVALID TRIANGLE";
        }
        return "Triangle: vertices=" + a + " " + b + " " + c +
            ((subA == null || subA == null || subA == null) ?
             "" :
             ("\n" + "Subtriangles:\n"+
              (subA + "\n") +
              (subB + "\n") +
              (subC + "\n")));
    }
}
public class Vertex2D {
    private double x;
    private double y;

    public Vertex2D(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double distance (Vertex2D point) {
        if (point == null) {
            return -1;
        }
        double dx = point.x - x;
        double dy = point.y - y;
        return Math.sqrt(dx*dx + dy*dy);
    }

    public Vertex2D middle (Vertex2D point) {
        if (point == null) {
            return null;
        }
        return new Vertex2D((x + point.x) / 2, (y + point.y) / 2);
    }

    @Override
    public String toString() {
        return "[" + x + ", " + y + "]";
    }
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
19. 10. 2015   #35
-
0
-

#34 Kit
divide() a přetíženou mám podle tebe a stejnak to nevykresluje ... to je fakt v háji :D

Nahlásit jako SPAM
IP: 147.251.212.–
Siggi0
Návštěvník
19. 10. 2015   #36
-
0
-

#35 Siggi
Cvičící mi napsal, že stačí napsat dva řádky do konstruktoru v třídě Triangle a bude mi to fungovat, ale teď už jsem dosti unavenej, abych to vymýšlel. Nic mě nenapadá zatím.

Nahlásit jako SPAM
IP: 147.251.212.–
Řešení
Siggi0
Návštěvník
21. 10. 2015   #37
-
+1
-
Zajímavé
Kit +
Vyřešeno Nejlepší odpověď

Takže, jediné co jsem měl špatně bylo, že jsem zapomněl volat divide(depth) v přetíženém konstruktoru. Nicméně děkuji za pomoc a máš u mě kladné body Kit.

Uzavírám toto vlákno.

Nahlásit jako SPAM
IP: 147.251.212.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 37 hostů

Podobná vlákna

Trojuhelnik — založil Malirka

Java - trojuhelnik — založil keet

Pascaluv trojuhelnik — založil karel

Moderátoři diskuze

 

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