
import java.applet.*;
import java.awt.*;

public class kadai01_1_m0104287 extends Applet {
  public void paint (Graphics g){
	  double vsize =480, dGap = 0.02;
	  int R, G, B, RGBhaba = 220;
	  double dXpat[] = new double [8], dYpat[] = new double [8];
	  double x = 0, y = 0, cirSize, dPoint = 0, dCount = 0;
	  double dXtop = 0.00, dYtop = 0.00, dXsize, dYsize;

		for(int i = 0; i < 8; i++){
			//Xpat, Ypat分けて代入
			if(i == 0 || i == 2 || i == 5 || i == 7){
				dXpat[i] = 0.5 - dGap;
			}else{
				dXpat[i] = 0.5 + dGap;
			}

			if(i == 0 || i == 3 || i == 5 || i == 6){
				dYpat[i] = 0.5 - dGap;
			}else{
				dYpat[i] = 0.5 + dGap;
			}
		}
		for(double circle = 0.2; circle < 1.50; circle *= 1.12){
			dCount++;
		}

		for(double circle = 0.2; circle < 1.50; circle *= 1.12){
			dXpat[(int)dPoint % 8] += (dXpat[(int)dPoint % 8]-0.5)*(1+0.03/(dPoint+1));
			dYpat[(int)dPoint % 8] += (dYpat[(int)dPoint % 8]-0.5)*(1+0.03/(dPoint+1));

			dXtop = (vsize*dXpat[(int)dPoint % 8]);
			dYtop = (vsize*dYpat[(int)dPoint % 8]);
			cirSize = (vsize/2) * circle*(1+0.2/(dPoint+1))*(vsize/2) * circle*(1+0.2/(dPoint+1));

			for(x = 0; x < vsize; x++) {
				for(y = 0; y < vsize; y++) {
					dXsize = (x - dXtop)*(x - dXtop);
					dYsize = (y - dYtop)*(y - dYtop);
					if(dXsize + dYsize >= cirSize){

						R = (int)(RGBhaba*Math.abs((y/vsize) - (x/vsize)*(dPoint/dCount))*(dPoint/dCount));
						G = (int)(RGBhaba*Math.abs((y*x)/(vsize*vsize)*(dPoint/dCount))*(dPoint/dCount));
						B = (int)(RGBhaba*Math.abs((x/vsize) - (y/vsize)*(dPoint/dCount))*(dPoint/dCount));

						R = (int)((255 - RGBhaba + RGBhaba *Math.abs((dYsize - dXsize)/(vsize*vsize)))*(dPoint/dCount));
						G = (int)((255 - RGBhaba + RGBhaba *Math.abs((dXsize+dYsize)/(vsize*vsize)))*(dPoint/dCount));
						B = (int)((255 - RGBhaba + RGBhaba *Math.abs((dXsize - dXsize)/(vsize*vsize)))*(dPoint/dCount));
					// *** *** //
						switch((int)dPoint%6){
						case 0:
							g.setColor(new Color(R,G,B));
							break;
						case 1:
							g.setColor(new Color(G,B,R));
							break;
						case 2:
							g.setColor(new Color(B,R,G));
							break;
						case 3:
							g.setColor(new Color(R,B,G));
							break;
						case 4:
							g.setColor(new Color(G,R,B));
							break;
						case 5:
							g.setColor(new Color(B,G,R));
							break;
						default:
							break;
						}
						g.fillRect((int)x,(int)y,1,1);
					}else if(5 <= dPoint && dPoint< 6){
						dXsize = (x - vsize/2)*(x - vsize/2);
						dYsize = (y - vsize/2)*(y - vsize/2);

						R = (int)(255 - 255 * (dXsize + dYsize)/cirSize*Math.abs((dYsize - dXsize)/cirSize));
						G = (int)(255 - 255 * (dXsize + dYsize)/cirSize*Math.abs((dXsize+dYsize)/cirSize));
						B = (int)(255 - 255 * (dYsize + dYsize)/cirSize*Math.abs((dXsize - dYsize)/cirSize));

						R %= 120;
						if(R > 255){ R = 255;}else if(R < 0){ R = 0;}
						G %= 120;
						if(G > 255){ G = 255;}else if(G < 0){ G = 0;}
						B %= 120;
						if(B > 255){ B = 255;}else if(B < 0){ B = 0;}

						g.setColor(new Color(R,G,B));
						g.fillRect((int)x, (int)y, 1, 1);
					}
				}
			}
			dPoint++;
		}
    }
}