Avatar
Tomáš Siggi Bednář:

Zdravím, mám javu poprvé a sekl jsem se u nás na škole v iteraci 02.

package cz*;

/**
 *
 * @author Tomas Bednar
 */
public class Vertex2D {

    private final double x;
    private final double y;

    /**
     * Setting point triangle
     * @param x point x
     * @param y point y
     */
    public Vertex2D(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double distance(Vertex2D point) {
        if(point == null){
            return -1;
        }

        double dist;
        dist = Math.sqrt((Math.pow(x, 2) - Math.pow(x, 2)) + (Math.pow(y, 2) - Math.pow(y, 2)));
        return dist;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

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

}

Přesněji problém v distance: Přidejte metodu distance, která vezme jiný 2D bod jako vstupní parametr a vrátí jeho euklidovskou vzdálenost. Vzdálenost bodů se vypočítá jako d = ( (x2 - x)^2 + (y2 - y)^2 )^1/2.
Pokud je vstupní argument null, pak metoda vrátí hodnotu -1.0 jako indikátor chyby (euklidovská vzdálenost je vždy >= 0).

Nevím, kde vzít x2, y2 z toho Vertex2D point. V testu to pořád píše: distance špatně počítá.

Test vypadá:

public class ProjectTest {

    @Test public void task01() {
        Vertex2D v1 = new Vertex2D(-1,0);
        assertTrue("Konstruktor Vertex2D", v1.getX() == -1.0 && v1.getY() == 0.0);

        BasicRulesTester.testRedundantMethod(Vertex2D.class, "setX", Double.TYPE);
        BasicRulesTester.testRedundantMethod(Vertex2D.class, "setY", Double.TYPE);

        double dist = new Vertex2D(-1.2, 1.2).distance(new Vertex2D(1.3, 1.3));
        assertTrue("distance() pocita spatne", dist > 2.5 && dist < 2.503);
        try {
            assertTrue("distance() nevraci -1 jako indikator chybneho argumentu", new Vertex2D(-1,0).distance(null) == -1.0);
        } catch (Exception ex) {
            fail("distance() neosetruje null argument");
        }
    }

Kdyžtak mohu dodat celý baliček.

 
Odpovědět 15.10.2015 14:13
Avatar
Atrament
Člen
Avatar
Odpovídá na Tomáš Siggi Bednář
Atrament:

Vždyť to počítáš jenom s jedním bodem :) Ten druhý bod je přece ten point co tam máš jako parametr té funkce, k jeho souřadnicím přistoupíš ve funkci distance pomocí

point.getX();
point.getY();

takže celý ten výpočet vzdálenosti by měl vypadat nějak takto:

dist = Math.sqrt((Math.pow(point.getX()-this.getX(),2) + (point.getY()-this.getY(),2))

(nezkoušel jsem to, tak je možné že tam mám chaos v závorkách, ale myslím, že pro pochopení to stačí)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 16.10.2015 10:16
Avatar
Atrament
Člen
Avatar
Atrament:

Vypadlo mi tam Math.pow u toho bodu Y

 
Nahoru Odpovědět 16.10.2015 10:24
Avatar
Tomáš Siggi Bednář:

Díky moc. Už mi to funguje. Ale sekl jsem se dál -.-

package cz*;

/**
 *
 * @author Tomas Bednar
 */
public class Triangle {

    private final Vertex2D a;
    private final Vertex2D b;
    private final Vertex2D c;
    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;
        }
    }

    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();
    }

}

// Test

    @Test public void task02() {
        Triangle tri = new Triangle(new Vertex2D(-1,0), new Vertex2D(1,0), new Vertex2D(0,1));
        assertTrue("Konstruktor Triangle", tri.getVertexA().getX() == -1.0 && tri.getVertexA().getY() == 0.0);

        BasicRulesTester.testRedundantMethod(Triangle.class, "setVertexA", Vertex2D.class);
        BasicRulesTester.testRedundantMethod(Triangle.class, "setVertexB", Vertex2D.class);
        BasicRulesTester.testRedundantMethod(Triangle.class, "setVertexC", Vertex2D.class);

        assertTrue("isEquilateral()", new Triangle(new Vertex2D(-1.2, 0), new Vertex2D(1.2, 0), new Vertex2D(0, 2.07846097)).isEquilateral());
        assertFalse("isEquilateral()", new Triangle(new Vertex2D(-1.2, 0), new Vertex2D(1.2, 0), new Vertex2D(0, 5.0)).isEquilateral());

        try {
            Triangle ntri = new Triangle(null, null, null);
            assertEquals("toString vraci spatny vystup pokud je nektery z vrcholu prazdny", "INVALID TRIANGLE", ntri.toString());
        } catch(NullPointerException ex) {
            fail("toString neosetruje situaci, kdy je nektery z vrcholu prazdny");
        }
    }

V testování, jestli je trojúhelník rovnostranný. Jelikož jsou čísla reálná nejde použit ==, ale přes math.abs .. jenže, když to zkompiluji tak mi to vypíše error, ale nenapíše, kde přesně.

Editováno 16.10.2015 18:34
 
Nahoru Odpovědět 16.10.2015 18:32
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 4 zpráv z 4.