class tiese{


public static double tiksl=1/Math.sqrt(1001);
// testavimui
static public final void main(String[] Arg){
 double[] xy=kirtim(new int[]{0,3},new int[]{0,2},new int[]{0,2},new int[]{4,0});
	my.print(xy,"xy(1.5,1) ");
// double[] d=fit(new int[]{0,0,3,3,0,3},new int[]{0,2,2,4,1,3});
// double[] d=fit(new int[]{0,3},new int[]{1,3});
 int n=1001; int[] x=new int[n], y=new int[n];
 double c=-2.0/Math.sqrt(4.0+9.0),s=Math.sqrt(1-c*c), x_=(n-1)/2, y_=2.0;
 for (int i=0; i<n; i++)
	{x[i]=i; y[i]=(int)Math.round(y_-c/s*(x[i]-x_)+(4*Math.random()-2));}
 double[] d=fit(x,y);
 my.print(d,"d("+c+","+s+","+x_+","+y_+",err)");
}
//

// taskus (x_i,y_i) aproksimuojame cos(alfa)(x-x_)+sin(alfa)(y-y_)=0 tiese
// grazina {cos(alfa),sin(alfa),x_,y_)}
// x_,y_ - x_i ir y_i vidurkiai
static public double[] fit(int[] x, int[] y){
 int n=x.length;
 if (n!=y.length) my.error("x.length!=y.length: "+x.length+" "+y.length);
 double x_=0.0,y_=0.0,xy_=0.0,xx_=0.0,yy_=0.0;
 for (int i=0; i<n; i++)
	{x_+=x[i];y_+=y[i];xy_+=x[i]*y[i];xx_+=x[i]*x[i];yy_+=y[i]*y[i];}
 x_/=n;y_/=n;xy_/=n;xx_/=n;yy_/=n;
 double A=(xx_-x_*x_-yy_+y_*y_)/2, B=(xy_-x_*y_),
	p=A/(2*Math.max(my.eps,Math.sqrt(A*A+B*B)));
 int sgnB=0; if (B<0) sgnB=-1; else sgnB=1;
 return new double[]{-sgnB*Math.sqrt(0.5-p),Math.sqrt(0.5+p),x_,y_,(xx_+yy_-x_*x_-y_*y_)/2-Math.sqrt(A*A+B*B)};
}// fit

// dvieju tiesiu einanciu per taskus (x1[0],y1[0]) (x1[1],y1[1])
//	ir (x2[0],y2[0]) (x2[1],y2[1]) susikirtimo taska
static public double[] kirtim(int[] x1, int[] y1, int[] x2, int[] y2){
 double p;
 int n = x1.length;
 if ((n!=2)|(y1.length!=2)|(x2.length!=2)|(y2.length!=2))
	my.error("x1,y1,x2 ar y2 ilgis!=2: "+n+" "+y1.length+" "+x2.length+" "+y2.length);
 return kirtim(new double[]{(double)x1[0],(double)x1[1]},new double[]{(double)y1[0],(double)y1[1]},
	new double[]{(double)x2[0],(double)x2[1]},new double[]{(double)y2[0],(double)y2[1]});
}// kirtim

// grazina {ox,oy} arba null
static public double[] kirtim(double[] x1, double[] y1, double[] x2, double[] y2){
 double p;
 int n = x1.length;
 if ((n!=2)|(y1.length!=2)|(x2.length!=2)|(y2.length!=2))
	my.error("x1,y1,x2 ar y2 ilgis!=2: "+n+" "+y1.length+" "+x2.length+" "+y2.length);
 double a1=y1[1]-y1[0], b1=-(x1[1]-x1[0]), a2=y2[1]-y2[0], b2=-(x2[1]-x2[0]);
 double D=a1*b2-a2*b1;
 if (Math.abs(D)<=my.eps) {
	//my.warning("kirtim: D=0?, "+x1[0]+" "+y1[0]+" "+x1[1]+" "+y1[1]+" "+x2[0]+" "+y2[0]+" "+x2[1]+" "+y2[1]);
	return null;}
 double c1=x1[0]*a1+y1[0]*b1, c2=x2[0]*a2+y2[0]*b2;
 double[] xy=new double[]{(c1*b2-c2*b1)/D, (a1*c2-a2*c1)/D};
 p=Math.max(Math.abs(a1*xy[0]+b1*xy[1]-c1),Math.abs(a2*xy[0]+b2*xy[1]-c2));
 if (p>tiksl) my.warning("kirtim: p>tiksl "+p);
 return xy;
}// kirtim

// grazina tasko iki tieses atstuma su zenklu
static public double atstumas2t(double[] x, double[] y, double Ax, double Ay){
 double dx=x[1]-x[0],dy=y[1]-y[0];
 return (dy*(Ax-x[0])-dx*(Ay-y[0]))/Math.sqrt(dx*dx+dy*dy);
}

}