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