IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Sierpinski trojúhelník

Aktivity
Avatar
Tomáš Siggi Bednář:16.10.2015 21:53

Mám projekt do školy a cvičící po nás chce i úlohu co by měla být dobrovolná. Moc ji nerozumím.

Zadání: Upravte třídu Triangle tak, aby reprezentoval tzv. "Sierpinski triangle",
Konkrétně:
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í.
Vytvořte přetížený konstruktor, který (kromě tří vrcholů) bude jako čtvrtý argument brát požadovanou hloubku rekurzivního dělení. Konstruktor tedy rovnou vytvoří Sierpinského trojúhelník s požadovanou hloubkou. Vyhněte se zbytečnému opakování kódu tím, že nový konstruktor bude volat původní konstruktor (se třemi parametry).
Odkomentujte kód ve třídě DemoExtra02. Spuštěním této třídy zajistíte vykreslení Sierpinského trojúhelníka úrovně 5.

Kód je takový:

package cz*;

/**
 *
 * @author Tomas Bednar
 */
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;
    }

    /**
    * 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 tuple of sub triagle
     * @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;
        }
    }

        // tady je přetížená metoda, ale vůbec nevím jak s ní operovat
    public boolean divide(int depth) {
        if(depth > 0) {
            divide();
            divide(depth--);
        }
        return true;
    }

        // tady mám přetížený konstruktor a měl by být v pořádku
    public Triangle(Vertex2D a, Vertex2D b, Vertex2D c, int depth) {
        this(a,b,c);
        this.depth = depth;
    }

    public Vertex2D getVertexA() {
        return a;
    }

    public Vertex2D getVertexB() {
        return b;
    }

    public Vertex2D getVertexC() {
        return c;
    }

    /**
     * Check if triangle is equilateral
     * @return true if is equilateral or false
     */
    public boolean isEquilateral() {
        double pointA;
        double pointB;
        double pointC;
        pointA = a.getX() + a.getY();
        pointB = b.getX() + b.getY();
        pointC = c.getX() + c.getY();

        if(Math.abs(pointA - pointB) < 0.001 && Math.abs(pointA - pointC) < 0.001 && Math.abs(pointB - pointC) < 0.001) {
           return true;
        }
        return false;
    }

    @Override
    public String toString() {
        return "Triangle: vertices=" + getVertexA() + " " + getVertexB() + " " + getVertexC();
    }

}
Editováno 16.10.2015 21:53
 
Odpovědět
16.10.2015 21:53
Avatar
Hit
Člen
Avatar
Hit:16.10.2015 22:11

Čemu přesně nerozumíš? :)

Nahoru Odpovědět
16.10.2015 22:11
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
Tomáš Siggi Bednář:16.10.2015 22:17

Jak volat na tu metodu bez parametrů a říct, že tyto trojúhelníky se mají rozložit a pak ty další.

 
Nahoru Odpovědět
16.10.2015 22:17
Avatar
Tomáš Siggi Bednář:17.10.2015 14:22

Nikdo nemá žádnou radu? Patlám se v tom.

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;
}
 
Nahoru Odpovědět
17.10.2015 14:22
Avatar
Tomáš Siggi Bednář:17.10.2015 23:03

Solved, jelikož je toto řešení možné najít i jinými studenty, tak ho nezveřejním.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
17.10.2015 23:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.