public class Punto {
private static final double EPSILON = 1e-9;
private double x;
private double y;
public Punto(double x, double y) {
this.x = x;
this.y = y;
}
public Punto(Punto p) {
this(p.x, p.y);
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double distanza(Punto p) {
double dx = this.x - p.x;
double dy = this.y - p.y;
return Math.sqrt(dx * dx + dy * dy);
}
public boolean equals(Punto p) {
if (p == null) {
return false;
}
return Math.abs(this.x - p.x) < EPSILON && Math.abs(this.y - p.y) < EPSILON;
}
@Override
public String toString() {
return "(" + x + ", " + y + ")";
}
}
public class Triangolo {
private Punto p1;
private Punto p2;
private Punto p3;
public Triangolo(Punto p1, Punto p2, Punto p3) {
points(p1, p2, p3);
}
public Triangolo(Triangolo t) {
this(t.p1, t.p2, t.p3);
}
public void setP1(Punto p1) {
points(p1, this.p2, this.p3);
}
public void setP2(Punto p2) {
points(this.p1, p2, this.p3);
}
public void setP3(Punto p3) {
points(this.p1, this.p2, p3);
}
public Punto getP1() {
return new Punto(this.p1);
}
public Punto getP2() {
return new Punto(this.p2);
}
public Punto getP3() {
return new Punto(this.p3);
}
public double perim() {
double lato1 = len(this.p1, this.p2);
double lato2 = len(this.p2, this.p3);
double lato3 = len(this.p3, this.p1);
return lato1 + lato2 + lato3;
}
public double area() {
double lato1 = len(this.p1, this.p2);
double lato2 = len(this.p2, this.p3);
double lato3 = len(this.p3, this.p1);
double semiP = (lato1 + lato2 + lato3) / 2.0;
double areaQuad = semiP
* (semiP - lato1)
* (semiP - lato2)
* (semiP - lato3);
return Math.sqrt(Math.max(areaQuad, 0.0));
}
public boolean equals(Triangolo t) {
if (t == null) {
return false;
}
return this.p1.equals(t.p1)
&& this.p2.equals(t.p2)
&& this.p3.equals(t.p3);
}
public boolean equivale(Triangolo t) {
if (t == null) {
return false;
}
double[] latiMiei = {len(this.p1, this.p2), len(this.p2, this.p3), len(this.p3, this.p1)};
double[] latiSuoi = {len(t.p1, t.p2), len(t.p2, t.p3), len(t.p3, t.p1)};
sort(latiMiei);
sort(latiSuoi);
for (int i = 0; i < latiMiei.length; i++) {
if (latiMiei[i] != latiSuoi[i]) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "Tri{" +
"p1=" + this.p1 +
", p2=" + this.p2 +
", p3=" + this.p3 +
'}';
}
private void points(Punto nuovoP1, Punto nuovoP2, Punto nuovoP3) {
this.p1 = new Punto(nuovoP1);
this.p2 = new Punto(nuovoP2);
this.p3 = new Punto(nuovoP3);
}
private boolean stannoInRiga(Punto pt1, Punto pt2, Punto pt3) {
double areaDoppia = pt1.getX() * (pt2.getY() - pt3.getY())
+ pt2.getX() * (pt3.getY() - pt1.getY())
+ pt3.getX() * (pt1.getY() - pt2.getY());
return areaDoppia == 0;
}
private double len(Punto pt1, Punto pt2) {
return pt1.distanza(pt2);
}
private void sort(double[] lati) {
for (int i = 0; i < lati.length - 1; i++) {
for (int j = i + 1; j < lati.length; j++) {
if (lati[i] > lati[j]) {
double tmp = lati[i];
lati[i] = lati[j];
lati[j] = tmp;
}
}
}
}
public static void main(String[] args) {
Punto p1 = new Punto(0, 0);
Punto p2 = new Punto(6, 0);
Punto p3 = new Punto(2, 5);
Triangolo tri = new Triangolo(p1, p2, p3);
System.out.println("Tri inizl: " + tri);
System.out.println("Perimetr: " + tri.perim());
System.out.println("Are: " + tri.area());
Triangolo copia = new Triangolo(tri);
System.out.println("\nCopi: " + copia);
System.out.println("equals(copi) -> " + tri.equals(copia));
Triangolo stessiPunti = new Triangolo(
new Punto(2, 5),
new Punto(0, 0),
new Punto(6, 0)
);
System.out.println("\nStessi pnti, ordin divers: " + stessiPunti);
System.out.println("equals(stessiPnti) -> " + tri.equals(stessiPunti));
System.out.println("equivale(stessiPnti) -> " + tri.equivale(stessiPunti));
Triangolo triSimile = new Triangolo(
new Punto(0, 0),
new Punto(3, 0),
new Punto(1, 2.5)
);
System.out.println("\nLati in rapprt: " + triSimile);
System.out.println("equivale(triSimile) -> " + tri.equivale(triSimile));
}
}