/** Program: Pascal5 Purpose: Generator's figure @author: Sanae.Masasi @version: 1.00; 20.June.96 */ import java.awt.*; import java.applet.*; public class Pascal5 extends Applet{ Control5 controls; public void init(){ setLayout(new BorderLayout()); Canvas5 c = new Canvas5(); add("Center",c); add("South",controls = new Control5(c)); c.setBackground(Color.white); } public void start(){ controls.enable(); } public void stop(){ controls.disable(); } public boolean handleEvent(Event e){ if(e.id == Event.WINDOW_DESTROY){ System.exit(0); } return false; } } class Canvas5 extends Canvas{ public static final double PI = 3.1415927d; double LPX, LPY, ANGLE; int N = 1; double sx,sy; double leng0,ang0; public double gene[][] = new double[3][2]; double a,b,c,s,t; int n_gene = 3; boolean drawflag = true; Rectangle rect; Font font = new Font("TimesRoman",Font.ITALIC,16); public void paint(Graphics g) { gene[0][0] = 60d; gene[0][1] = -1d; gene[1][0] = -60d; gene[1][1] = 1d; gene[2][0] = -60d; gene[2][1] = -1d; } public void update(Graphics g) { rect = bounds(); sx = rect.width * 0.1; sy = rect.height * 0.9; LPX = 0d;LPY = 0d;ANGLE = 0d; ang0 = 0d;leng0 = rect.width * 0.8d; a = 0.0d;b = 0;c = 0.0d; for(int i = 0;i < n_gene;i++){ turn(gene[i][0]); a = a + Math.abs(gene[i][1]) * Math.cos(ANGLE * PI / 180d); c = c + Math.abs(gene[i][1]) * Math.sin(ANGLE * PI / 180d); } s = ANGLE; t = Math.atan(c / a); a = a / Math.cos(t); g.setColor(Color.white); g.fillRect(0,0,rect.width,rect.height); g.setColor(Color.black); setlp(sx,sy); setangle(ang0); fractal(g,leng0,0); g.setColor(Color.red); g.setFont(font); } public void redraw(int N){ this.N = N; repaint(); } private void fractal(Graphics g,double leng,int n){ if(n >= N){ move(g,leng); }else{ turn(-180.0d * t /PI); for(int i=0;i < n_gene;i++){ turn(gene[i][0]); if(gene[i][0] != -180.0d){ if(gene[i][1] < 0){ warp(Math.abs(gene[i][1] * leng /a)); turn(180.0d); fractal(g,Math.abs(gene[i][1]) * leng / a, n + 1); turn(180.0d); warp(Math.abs(gene[i][1] * leng /a)); }else{ fractal(g,Math.abs(gene[i][1]) * leng / a, n + 1); } }else{ warp(Math.abs(gene[i][1]) * leng / a); } } turn(-s + 180d * t / PI); } } public void setlp(double lpx,double lpy){ LPX = lpx; LPY = lpy; } public void setangle(double ang){ ANGLE = ang; } public void turn(double ang){ ANGLE = ANGLE + ang; ANGLE = ANGLE - (int)ANGLE + (int)ANGLE%360; } public void warp(double leng){ LPX = LPX + leng * Math.cos(ANGLE * PI /180d); LPY = LPY - leng * Math.sin(ANGLE * PI /180d); } public void move(Graphics g,double leng){ double x,y; x = LPX + leng * Math.cos(ANGLE * PI /180d); y = LPY - leng * Math.sin(ANGLE * PI /180d); g.drawLine((int)LPX,(int)LPY,(int)x,(int)y); LPX = x; LPY = y; } } class Control5 extends Panel{ Canvas5 canvas; Font font = new Font("TimesRoman",Font.ITALIC,12); Choice Num; Label labelN; public Control5(Canvas5 canvas){ this.canvas = canvas; setLayout(new FlowLayout()); labelN = new Label("count ",Label.LEFT); labelN.setFont(font); add(labelN); Num = new Choice(); for(int a = 1;a <=15;a ++){ Num.addItem(""+a); } Num.select(String.valueOf(canvas.N)); add(Num); add(new Button("DRAW")); } public boolean action(Event ev, Object arg) { if (ev.target instanceof Button) { canvas.redraw(Integer.parseInt(Num.getSelectedItem())); } return false; } }