import java.awt.*; import java.lang.*; public class Xraya extends java.applet.Applet { int MAXATOMS = 5; final int HRange=5,KRange=5; int x[] = new int[MAXATOMS+1]; int y[] = new int[MAXATOMS+1]; int current=1; final int nk=(2*HRange+1)*(2*KRange+1); double h[] = new double[nk+1]; double k[] = new double[nk+1]; double intensity[] = new double[nk+1]; TextField xpos,ypos,message; public void init() { for (int n = 1;n<=MAXATOMS;n++) { x[n] = 0; y[n] = 0; } for (int f=1;f<=nk;f++) { h[f] = (f-1)/(2*HRange+1) - HRange; k[f] = (f-1)%(2*KRange+1) - KRange; intensity[f] = 0; } setLayout(new FlowLayout() ); xpos = new TextField(String.valueOf(0),5); ypos = new TextField(String.valueOf(0),5); message = new TextField("",25); add(new Label("x:")); add(xpos); add(new Label("y:")); add(ypos); add(message); add(new Button("Xray")); add(new Button("Restart")); }//End init void restart(){ current = 1; for (int n = 1;n<=MAXATOMS;n++) { x[n] = 0; y[n] = 0; } for (int f=1;f<=nk;f++) { intensity[f] = 0; } repaint(); } public boolean action(Event e, Object arg) { if (e.target instanceof Button) { String command = (String)arg; if (command.equals("Xray")) { diffract(); } if (command.equals("Restart")) { restart(); } repaint(); } return true; }//End action public boolean mouseDown (Event e, int xin, int yin) { if (current<=MAXATOMS) { if (xin>=10&&xin<=450&&yin>=50&&yin<=350) { x[current] = -10+xin; xpos.setText(String.valueOf(x[current])); y[current] = 350-yin; ypos.setText(String.valueOf(y[current])); current++; message.setText(""); } else { message.setText("Click on the blue area"); } } else { message.setText("Five spots have been entered"); } repaint(); return true; }//End mouseDown void diffract() { double im,re,arg; double xmid[] = new double[nk+1]; double ymid[] = new double[nk+1]; int n,f; for(n=1;n<=MAXATOMS;n++) { xmid[n] = (double)(x[n])/450; ymid[n] = (double)(y[n])/300; } for(f=1;f<=nk;f++) { re = im = 0; for(n=1;n<=MAXATOMS;n++) { arg = (double)( 2*3.14159*( h[f]*xmid[n]+k[f]*ymid[n] ) ); re += (double)(Math.cos(arg)); im += (double)(Math.sin(arg)); } intensity[f] = re*re+im*im; } }//End diffract public void paint(Graphics g) { int xdraw,ydraw; int kxdraw[] = new int[nk+1]; int kydraw[] = new int[nk+1]; //Set up Atomic box and Frequency domain g.setColor(Color.blue); g.fillRect(10,50,450,300); g.setColor(Color.cyan); g.fillRect(10,400,450,50); //Add coordinate axes g.setColor(Color.black); g.drawLine(10,50,10,350); g.drawLine(10,350,460,350); g.drawLine(10,400,10,450); g.drawLine(10,450,460,450); //Add atoms to the field g.setColor(Color.red); for (int n=1;n<=MAXATOMS;n++) { if(x[n]!=0&&y[n]!=0) { xdraw = 10+x[n]; ydraw = 350-y[n]; g.fillOval(xdraw-5,ydraw-5,10,10); } } //Add the frequency components for (int f=1;f<=nk;f++) { kxdraw[f] = (int)(10+3.75*f); kydraw[f] = (int)((450-2.5*intensity[f])); } for (int f=1;f<=nk-1;f++) { g.drawLine(kxdraw[f],kydraw[f],kxdraw[f+1],kydraw[f+1]); } }//End paint }