import java.applet.Applet; import java.awt.event.*; import java.awt.*; import java.awt.geom.*; public class Conic { public static double[] dualConic(double[] X) { Matrix M=new Matrix(); M.a[0][0]=X[0]; M.a[1][1]=X[2]; M.a[2][2]=X[5]; M.a[1][0]=.5*X[1]; M.a[0][1]=.5*X[1]; M.a[0][2]=.5*X[3]; M.a[2][0]=.5*X[3]; M.a[1][2]=.5*X[4]; M.a[2][1]=.5*X[4]; M=M.inverse(); double[] Y={M.a[0][0],2*M.a[1][0],M.a[1][1],2*M.a[0][2],2*M.a[1][2],M.a[2][2]}; return(Y); } public static double[] conicCenter(double[] X) { double x=2*X[3]*X[2]-X[4]*X[1]; double y=2*X[0]*X[4]-X[3]*X[1]; double d=X[1]*X[1]-4*X[0]*X[2]; x=x/d; y=y/d; double[] Y={x,y}; return(Y); } public static Complex conicCenter2(double[] X) { double[] x=conicCenter(X); return(new Complex(x[0],x[1])); } public static double evaluate(double[] Y,Complex z) { double u=z.x; double v=z.y; double test=Y[0]*u*u+Y[1]*u*v+Y[2]*v*v+Y[3]*u+Y[4]*v+Y[5]; return(test); } /*This is set up so that the evaluation on Z[0] is pos and on Z[1] is neg*/ public static Complex[] narrow(double[] Y,Complex[] Z) { Complex z=Complex.average(Z[0],Z[1]); double test=evaluate(Y,z); Complex[] W=new Complex[2]; if(test<0) { W[0]=new Complex(Z[0]); W[1]=new Complex(z); return(W); } W[0]=new Complex(z); W[1]=new Complex(Z[1]); return(W); } public static Complex narrow(double[] Y,double t,int n) { Complex z1=conicCenter2(Y); double Pi=Math.PI; double c=Math.cos(2*Pi*t); double s=Math.sin(2*Pi*t); Complex z2=new Complex(c,s); Complex z3=new Complex(10000*z2.x-9999*z1.x,10000*z2.y-9999*z1.y); Complex[] Z={z1,z3}; for(int i=0;i