


//old definition of p and q grids in the odd/odd cases




    public static int[] easySort(int[] x) {
	int len=x.length;
	int[] y = new int[x.length];
	int min;
	int current=0;
	for(int j=0;j<len;++j) {
	   min=1000000;
	   for(int i=0;i<len;++i) {
	      if((x[i]>current)&&(x[i]<min)) min=x[i];
	   }
	   y[j]=min;
	   current=min;
	}
	return(y);
    }



    public static int[] pGrid(int p,int q,double d) {
	int[] x=new int[3];
	x[0]=pIndex(p,q);
	x[1]=jump(0,p,q,-1);
	x[2]=pLines(p,q,d);
	x[0]=(2*q+x[0])%q;

	if(x[2]==0) return(null);
	if(x[2]==1) {
	    int[] y={x[0]};
	    return(y);
	}

	if(x[2]==2) {
	    int[] y={x[0],(q+x[0]+x[1])%q};
	    return(y);
	}

	int[] y=new int[x[2]];
	y[0]=x[0];
	y[1]=(q+x[0]+x[1])%q;

	for(int i=2;i<x[2];++i) {
	    if(i%2==1) y[i]=(2*q+y[i-2]+x[1])%q;
	    if(i%2==0) y[i]=(2*q+y[i-2]-x[1])%q;
	}

	System.out.println("compare");
	printOut(y);
	int[] y2=pGrid2(p,q,d);
	printOut(y2);



	return(y);
    }


    public static void printOut(int[] yy) {
	int[] y=GridDynamics.easySort(yy);
	for(int i=0;i<y.length;++i) {
	    System.out.print(y[i]+" ");
	}
	System.out.println("");
    }



    public static int[] qGrid(int p,int q,double d) {
	int[] x=new int[3];
	x[0]=qIndex(p,q);
	x[1]=jump(1,p,q,1);
	x[2]=qLines(p,q,d);
	x[0]=(2*q+x[0])%q;

	if(x[2]==0) return(null);
	if(x[2]==1) {
	    int[] y={x[0]};
	    return(y);
	}

	if(x[2]==2) {
	    int[] y={x[0],(q+x[0]+x[1])%q};
	    return(y);
	}

	int[] y=new int[x[2]];
	y[0]=x[0];
	y[1]=(q+x[0]+x[1])%q;

	for(int i=2;i<x[2];++i) {
	    if(i%2==1) y[i]=(2*q+y[i-2]+x[1])%q;
	    if(i%2==0) y[i]=(2*q+y[i-2]-x[1])%q;
	}




	return(y);
    }




    public static int pIndex(int p,int q) {
	int t=(p%4)-2;
	int index=(q-MathRational.inverse(2,q)+t*MathRational.inverse(2*p,q))%q;
	return(index);
    }

    public static int qIndex(int p,int q) {
	int t=(q%4)-2;
	int index=(q+(q-t)*MathRational.inverse(2*p,q))%q;
	return(index);
    }

    public static int jump(int choice,int p,int q,int s) {
	int t=(p%4)-2;
	if(choice==1) t=(q%4)-2;
	int sign=s*t;
	int index=(2*q+2*sign*MathRational.inverse(p,q))%q;
	return(index);
    }




    public static int pLines(int p,int q,double x) {	
	double t1=p*x;
	double t2=Math.floor(p*x+.01);
	double t=t2;
	if(Math.abs(t1-t2)<.000001) {
	    int n=(int)(t2+.01);
	    n=n*p;
	    if(n%4==3) t=t-1;
	}
	int t0=(int)(t);
	t0=t0+1;
	t0=t0/2;
	return(t0);
    }

    public static int qLines(int p,int q,double x) {	
	double t1=q*x;
	double t2=Math.floor(q*x+.01);
	double t=t2;
	int n=0;
	if(Math.abs(t1-t2)<.000001) {
	    n=(int)(t2+.01);
	    n=n*q;
	    if(n%4==1) t=t-1;
	}
	int t0=(int)(t);
	t0=t0+1;
	t0=t0/2;
	return(t0);
    }












//tests pinwheel lemma 


    public void goTest() {
	Quad Q=M.P.Q[0];
	PolyWedge P=new PolyWedge(Q);

	Complex z=new Complex();
	Complex w1=new Complex();
	Complex w2=new Complex();
	Complex w3=new Complex();
	double d=0;
	int test=0;
	for(int i1=1;i1<10;++i1) {
	    for(int i2=1;i2<10;++i2) {
		for(int i3=1;i3<10;++i3) {
		    Q=new Quad(i1,i2,i3);
                    P=new PolyWedge(Q);
		    test=0;

	            for(int i=0;i<103;++i) {
	                for(int j=0;j<103;++j) {
		           z=new Complex(1.0*i/103,2.0*i/103);
		           if(Q.inside(z)==0) {
		             w1=Orbiter.returnMap(z,Q);
		             w2=Strips.returnMap(P,z);
		             w3=Complex.minus(w1,w2);
		             d=w3.norm();
		             if(d>.000001) {
			     System.out.print(d+"   ");
			     test=1;
			     }
			   }
			}
		    }
		    if(test==0) System.out.println("pass "+i1+" "+i2+" "+i3);
		    if(test==1) System.out.println("       fail "+i1+" "+i2+" "+i3);
		}
	    }
	}
    }



//for improved tile finding

    public static double[] returnProfile(PolyWedge P,Complex y) {
	double[] d=new double[8];
	Complex Y=new Complex(y);
	y.print();
	d[0]=relStrip(P,1,Y);
	Y=map0(P,0,Y);
	d[1]=relStrip(P,0,Y);
	Y=map0(P,2,Y);
	d[2]=relStrip(P,2,Y);
      	Y=map0(P,3,Y);
	d[3]=relStrip(P,3,Y);
	Y=map0(P,1,Y);
	d[4]=relStrip(P,1,Y);
	Y=map0(P,0,Y);
    	d[5]=relStrip(P,0,Y);
	Y=map0(P,2,Y);
	d[6]=relStrip(P,2,Y);
	Y=map0(P,3,Y);
	d[7]=relStrip(P,3,Y);
	return(d);
    }
