/* * gd1.java - revised 15 Apr 05 - width 205, height 191 * @author jackord@kw.igs.net * solution of Laplace's equation: * 128 iterations at 4 pixel steps * 16 iterations at 2 pixel steps * 6 iterations at 1 pixel steps */ import java.applet.Applet; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class gd1 extends Applet implements ActionListener { int kk=0; // Declarations String bs="Plot"; Button b = new Button(bs); TextField tx=new TextField(7); Color col[]={ Color.blue, Color.cyan, Color.red, Color.yellow, Color.magenta, Color.green }; public void init() { // Layout add(b); add(tx); b.addActionListener(this); setBackground(new Color(211, 211, 211)); tx.setBackground(getBackground()); } public void paint(Graphics g) { // Main Program int d, test; long r2; int [] p=new int[4]; int [] q=new int[4]; double [][] v=new double[205][169]; b.setBounds(30, 170, 65, 20); tx.setBounds(110, 170, 65, 20); tx.setText("Pass/150"); p[1]=60; q[1]=108; p[2]=102; q[2]=36; p[3]=144; q[3]=108; g.setColor(Color.blue); // Boundary (0 V) g.drawRect(0, 0, 204, 168); g.setColor(Color.red); // Cylinders (100 V) for (int i=1; i<=3; i=i+1) { g.fillArc(p[i]-6, q[i]-6, 12, 12, 0, 360); } if (kk>0) { for (int k=1; k<=167; k=k+1) { // Set initial v(i, j) for (int j=1; j<=203; j=j+1) { test=1; for (int i=1; i<=3; i=i+1) { r2=(p[i]-j)*(p[i]-j)+(q[i]-k)*(q[i]-k); if (r2<=36) { test=0; } } if (test>0) { v[j][k]=50; } else { v[j][k]=100; } } } d=4; for (int i=1; i<=150; i=i+1) { // Iteration loop tx.setText(Integer.toString(i)+"/150"); for (int k=d; k<=168-d; k=k+d) { for (int j=d; j<=204-d; j=j+d) { if (v[j][k]<100) { v[j][k]=(v[j][k-d]+v[j][k+d]+v[j+d][k]+v[j-d][k])/4; } g.setColor(col[(int)(v[j][k]/7)%6]); if (d<2) { g.drawLine(j, k, j, k); } else { g.fillRect(j-d/2, k-d/2, d, d); } } } if ((i==128)||(i==144)) { // Reduce interval... d=d/2; for (int k=d; k<=168-d; k=k+2*d) { // ...and... for (int j=2*d; j<=204-2*d; j=j+2*d) { if (v[j][k]<100) { v[j][k]=(v[j][k-d]+v[j][k+d])/2; } } } for (int k=d; k<=168-d; k=k+d) { // ...interpolate for (int j=d; j<=204-d; j=j+2*d) { if (v[j][k]<100) { v[j][k]=(v[j-d][k]+v[j+d][k])/2; } } } } } tx.setText("Finished"); kk=0; } } public void actionPerformed(ActionEvent e) { // Buttons String tst; tst=e.getActionCommand(); if (bs.equals(tst)) { kk=1; } repaint(); } }