import java.applet.*;
import java.awt.*;
import java.awt.event.*;

/*
  <applet code="affine" width=800 height=600>
  </applet>
*/


public class affine extends Applet {
	Dimension d;
	int centerX = 400;
	int centerY = 300;
	int posX[] = {399, 399, 370, 399, 400, 401, 430, 401, 401};
	int posY[] = {350, 310, 270, 309, 250, 290, 250, 291, 350};
	int nPosX[] = new int[9];
	int nPosY[] = new int[9];


	public void paint(Graphics g) {
		d = getSize();

		for(int i = 0; i < 9; i++) {
			nPosX[i] = posX[i];
			nPosY[i] = posY[i];
		}

		write_image(g);
	}

	public void write_image(Graphics g) {
		g.setColor(Color.black);
		g.fillRect(0, 0, d.width, d.height);
		g.setColor(Color.white);
		for(int r1 = -4; r1 < 5; r1++) {
			for(int r2 = -4; r2 < 5; r2++) {
				rotation(r1, r2);
				changeSize(r1, r2);
				move(r1, r2);

				for(int i = 0; i < 8; i++) {
					int j = i + 1;
					g.drawLine(nPosX[i], nPosY[i], nPosX[j], nPosY[j]);
				}

				for(int i = 0; i < 9; i++) {
					nPosX[i] = posX[i];
					nPosY[i] = posY[i];
				}
			}
		}
	}

	public void rotation(int rX, int rY) {			// 回転変換
		double nX, nY;
		for(int i = 0; i < 9; i++) {
			nPosX[i] -= centerX;			// 原点へ移動
			nPosY[i] -= centerY;

		    nX = Math.cos(Math.PI / 4 * (rX + rY)) * nPosX[i] -
		    						Math.sin(Math.PI / 4 * (rX + rY)) * nPosY[i];
		    nY = Math.sin(Math.PI / 4 * (rX + rY)) * nPosX[i] +
									Math.cos(Math.PI / 4 * (rX + rY)) * nPosY[i];
		    nPosX[i] = Math.round((float)nX) + centerX;
		    nPosY[i] = Math.round((float)nY) + centerY;
		}
	}

	public void changeSize(int sX, int sY) {		// 拡大縮小変換
		double nX, nY;
		for(int i = 0; i < 9; i++) {
			nPosX[i] -= centerX;			//原点へ移動
			nPosY[i] -= centerY;

		    nX = nPosX[i] * (sX * sY / 4);
		    nY = nPosY[i] * (sX * sY / 4);
		    nPosX[i] += Math.round((float)nX) + centerX;
		    nPosY[i] += Math.round((float)nY) + centerY;
		}
	}

	public void move(int mX, int mY) {				// 平行移動変換
	double nX, nY;
		for(int i = 0; i < 9; i++) {
			nPosX[i] += mX * centerX / 4;
			nPosY[i] += mY * centerY / 4;
		}
	}
}