import java.util.*;
class Kolmnurk{
// autor: J.Kiho. 04.03.98
// HOIATUS! Autor ei vo~ta endale vastutust ei selles klassis
// leiduvate vigade, ebakohtade ega nendest kasutajatele
// po~hjustatud ebamugavuste ning kahjude eest.
// isendi andmed: ----------------------------
/** Nurk.*/
private float alpha, beta, gamma;
/** Külg. Nurga alfa vastaskülg. */
private double a;
/** Külg. Nurga beeta vastaskülg.*/
private double b;
/** Külg. Nurga gamma vastaskülg.*/
private double c;
// konstruktorid: --------------------------
/**
* Kolme küje järgi.
*
*@param x külg
*@param y külg
*@param z külg
*/
Kolmnurk(double x, double y, double z){
a = x; b = y; c = z;
nurgad();
}
/**
* Kaatetite järgi.
*
* @param kt1 kaatet
* @param kt2 kaatet
*/
Kolmnurk(double kt1, double kt2){
a = kt1; b = kt2;
c = Math.sqrt(kt1*kt1 + kt2*kt2);
nurgad();
}
/**
* Kahe külje ja nendevahelise nurga järgi.
*
* @param a külg
* @param b külg
* @param gamma nurk antud külgede vahel.
*/
Kolmnurk(double a, double b, float gamma){
this.a = a; this.b = b;
c = Math.sqrt(a*a + b*b - 2*a*b*Math.cos(gamma));
nurgad();
}
// klassimeetod ------------------------------------
/**
* Kontroll, kas antud kaks kolmnurka on sarnansed.
*
*@param k1 kolmnurk
*@param k2 kolmnurk
*@return true, kui sarnased,
* false - vastasel korral.
*/
static boolean onSarnased(Kolmnurk k1, Kolmnurk k2){
//ujupunktarvude vordlemiseks:
final float eps = 1f/(10000);
float x1, y1, z1;
x1 = Math.min(k1.alpha,Math.min(k1.beta, k1.gamma));
z1 = Math.max(k1.alpha,Math.max(k1.beta, k1.gamma));
y1 = k1.alpha + k1.beta + k1.gamma - x1 - z1;
//k1 nurgad, x1<=y1<=z1
float x2, y2, z2;
x2 = Math.min(k2.alpha,Math.min(k2.beta, k1.gamma));
z2 = Math.max(k2.alpha,Math.max(k2.beta, k1.gamma));
y2 = k2.alpha + k2.beta + k2.gamma - x2 - z2;
//k2 nurgad, x2<=y2<=z2
return (Math.abs(x1-x2)true, kui sarnased,
* false - vastasel korral.
*/
boolean onPyth(){
return onSarnased(this, new Kolmnurk(3,4,5.0));
}
/**
* Kolmnurk sõnena (küljed ja nurgad).
* Kolmnurga andmete trükikuju.
*/
public String toString(){
return "a="+round(a)+
"; b="+round(b)+
"; c="+round(c)+
"\n alfa="+kr(alpha)+
"; beeta="+kr(beta)+
"; gamma="+kr(gamma);
}
// abimeetodid: ---------------------------------
/**
* Nurgad külgede jägi.
*/
private void nurgad(){// kylgede jargi
double s = pindala();
alpha = (float)Math.asin(2*s/b/c);
beta = (float)Math.asin(2*s/a/c);
gamma = (float)Math.asin(2*s/a/b);
// voimalik nyrinurk uuesti:
double pikim = Math.max(a, Math.max(b, c));
if (a == pikim) alpha = (float)(Math.PI - gamma - beta);
else
if (b == pikim) beta = (float)(Math.PI - gamma - alpha);
else
gamma = (float)(Math.PI - alpha - beta);
}
/**
* Pool ümbermõõtu.
*/
private double p(){
return (a + b + c)/2;
}
/**
* Lühendada murdosa.
*
* @param x antud arv
* @return lühendatud murdosaga.
*/
private double round(double x){
double arv = 1000.0; //10 astmes (murdaosa kohtade arv)
return Math.round(x*arv)/arv;
}
/**
* Radiaanid kraadideks.
*
* @param x nurk radiaanides
* @return nurk täiskraadides
*/
private int kr(float x){
return (int)Math.round(x*180/Math.PI);
}
// kylgede loendi organiseerimine: -----------------
/**
* Loendi, mis annab kolmnurga kyljed
* mittekahanevas järjekorras
*/
final class Loendi implements Enumeration{
private int mitmes; // suuruselt mitmendat tahetakse
private double[] x = new double[3]; // kyljed mittekahanevalt
// konstruktor, teeb loendi antud kolmnurga jaoks
Loendi(Kolmnurk k){
mitmes = 0;
x[0] = Math.min(k.a, Math.min(k.b, k.c));
x[2] = Math.max(k.a, Math.max(k.b, k.c));
x[1] = k.a + k.b + k.c - x[0] - x[2];
}//konstruktor
public boolean hasMoreElements(){
return mitmes < 3;
}
public Object nextElement(){
return new Double(x[mitmes++]);
}
}//Loendi
/**
* Teeb selle kolmnurga külgede loendi.
*/
Enumeration kyljed123(){
return new Loendi(this);
}
}//Kolmnurk