import java.awt.*; import java.awt.image.*; import java.applet.*; import java.net.*; public class Direct extends java.applet.Applet { final int x_dim = 200; final int y_dim = 200; int scaled = 0; DirectCanvas graph; Image arrayImage[] = new Image[3]; Choice element_type; Label plot; Label element_label; Label d_number; Label d_scale; Label d_phase; Label v_number; Label v_scale; Label v_phase; Label x_axis[] = new Label[6]; Label y_axis[] = new Label[6]; Scrollbar sb_number; Scrollbar sb_scale; Scrollbar sb_phase; Scrollbar sb_range; public void init() { setLayout( null); graph = new DirectCanvas( this ); graph.reshape( 20, 20, x_dim+21, y_dim+21 ); add( graph ); arrayImage[0] = getImage(getCodeBase(),"images/iso.gif"); arrayImage[1] = getImage(getCodeBase(),"images/col.gif"); arrayImage[2] = getImage(getCodeBase(),"images/par.gif"); for(int i=0; i<6 ; i++){ y_axis[i] = new Label(String.valueOf(40*i)); y_axis[i].reshape(4,232-40*i,30,15); add(y_axis[i]); x_axis[i] = new Label(String.valueOf((40.0*i)/100.0)); x_axis[i].reshape(33+40*i,243,20,15); add(x_axis[i]); } plot = new Label(" Directivity (D) vs. d/wavelength ",Label.CENTER); plot.setForeground(Color.blue); plot.reshape(0,0,x_dim,30); add( plot ); d_number = new Label( "number of elements:" ); d_number.reshape( x_dim + 60, 0, 200, 14 ); add( d_number ); d_scale = new Label( "scale factor:" ); d_scale.reshape( x_dim + 60, 80, 200, 14 ); add( d_scale ); d_phase = new Label( "phase difference:" ); d_phase.reshape( x_dim + 60, 40, 200, 14 ); add( d_phase ); sb_number = new Scrollbar( Scrollbar.HORIZONTAL, 2, 1, 2, 10 ); sb_number.setPageIncrement( 2 ); sb_number.reshape( x_dim + 60, 15, 200, 14 ); add( sb_number ); sb_scale = new Scrollbar( Scrollbar.HORIZONTAL, 1, 1, 1, 100 ); sb_scale.setPageIncrement( 5 ); sb_scale.reshape( x_dim + 60, 95, 200, 14 ); add( sb_scale ); sb_phase = new Scrollbar( Scrollbar.HORIZONTAL, 0, 1, 0, 359 ); sb_phase.setPageIncrement( 20 ); sb_phase.reshape( x_dim + 60, 55, 200, 14 ); add( sb_phase ); element_label = new Label("Element Type"); element_label.reshape(x_dim+60,120,150,20); add(element_label); element_type = new Choice(); element_type.addItem("Isotropic Element"); element_type.addItem("Collinear short dipoles"); element_type.addItem("Parallel short dipoles"); element_type.reshape(x_dim + 60,145,200,30); add(element_type); v_number = new Label( String.valueOf( sb_number.getValue() ) ); v_number.reshape( x_dim + 260, 15, 35, 14 ); add( v_number ); v_scale = new Label( String.valueOf( sb_scale.getValue() ) ); v_scale.reshape( x_dim + 260, 95, 35, 14 ); add( v_scale ); v_phase = new Label( String.valueOf( sb_phase.getValue() ) ); v_phase.reshape( x_dim + 260, 55, 35, 14 ); add( v_phase ); repaint(); } public boolean handleEvent( Event event ) { if ( event.id == Event.SCROLL_LINE_DOWN || event.id == Event.SCROLL_LINE_UP || event.id == Event.SCROLL_PAGE_DOWN || event.id == Event.SCROLL_PAGE_UP || event.id == Event.MOUSE_UP){ v_number.setText(String.valueOf(sb_number.getValue())); v_phase.setText(String.valueOf(sb_phase.getValue())); if((v_scale.getText()).compareTo(String.valueOf(sb_scale.getValue()))!=0){ v_scale.setText(String.valueOf(sb_scale.getValue())); for(int i = 0; i<6 ; i++) y_axis[i].setText(String.valueOf(40.0*i/sb_scale.getValue())); scaled = 1; } else{ scaled = 0; } graph.repaint(); return true; } if(event.id == Event.SCROLL_ABSOLUTE){ v_number.setText(String.valueOf(sb_number.getValue())); v_phase.setText(String.valueOf(sb_phase.getValue())); if((v_scale.getText()).compareTo(String.valueOf(sb_scale.getValue()))!=0){ v_scale.setText(String.valueOf(sb_scale.getValue())); for(int i = 0; i<6 ; i++) y_axis[i].setText(String.valueOf(40.0*i/sb_scale.getValue())); scaled = 1; graph.repaint(); } else{ scaled = 0; } } if(event.id == Event.ACTION_EVENT){ repaint(); graph.repaint(); } return super.handleEvent( event ); } public void paint( Graphics g ) { graph.paint( g ); } } class DirectCanvas extends Canvas { Direct parent; double r[] = new double[ 201 ]; DirectCanvas( Direct applet ) { parent = applet; } private double arfac( double n, double x ) { double result,sinthing; try { sinthing = Math.abs(Math.sin(x/2)); if(sinthing<.000001){ result = 1.0; } else{ result = Math.abs(Math.sin(n*x/2)/(n*sinthing)); } } catch ( ArithmeticException ae ) { result = 0.0; } return result; } private double raxi(double bd,double a,double n) { int diff,n1,n2,nholder,nindex,i; double ArfacList[]; double result=0.0,ndouble; n1=(int)Math.ceil((a-bd)/(Math.PI/n)); n2=(int)Math.floor((a+bd)/(Math.PI/n)); diff = Math.abs(n2-n1); ArfacList= new double[diff+2]; for(nindex=n1,i=1;nindex<=n2;nindex++,i++){ ndouble = (double)nindex; ArfacList[i] = arfac(n,ndouble*(Math.PI/n)); } ArfacList[0] = arfac(n,(double)(a-bd)); ArfacList[diff+1] = arfac(n,(double)(a+bd)); for(i=0;i<=(diff+1);i++){ result = Math.max(result,ArfacList[i]); } parent.showStatus("raxi is: " + Double.toString(result)+"n1 is: "+ Integer.toString(n1)+"n2 is: "+Integer.toString(n2)); return result; } private double f( int distance ) { double result=0.0,sumtot=0.0,m=0.0; int i=0; double scale = (double) parent.sb_scale.getValue(); double bd = (distance/100.0)*Math.PI*2, a0=1.0; int pha = parent.sb_phase.getValue(); double a = (Math.PI*pha/180.0); double n = (double) parent.sb_number.getValue(); try { if(parent.element_type.getSelectedIndex()==0){ a0=1.0; for(i=1;i<(int)n;i++){ m=(double)i; sumtot += ((n-m)/(m*bd))*Math.sin(m*bd)*Math.cos(m*a); } } else if(parent.element_type.getSelectedIndex()==1){ a0=2.0/3.0; for(i=1;i<(int)n;i++){ m=(double)i; sumtot += ((n-m)/(m*bd))*( (2.0/(m*m*bd*bd))*Math.sin(m*bd)+ (-2.0/(m*bd))*Math.cos(m*bd))* Math.cos(m*a); } } else if(parent.element_type.getSelectedIndex()==2){ a0=2.0/3.0; for(i=1;i<(int)n;i++){ m=(double)i; sumtot += ((n-m)/(m*bd))*( (1.0-1.0/(m*m*bd*bd))*Math.sin(m*bd)+ (1.0/(m*bd))*Math.cos(m*bd))* Math.cos(m*a); } } if(pha<14){ result = 1/((a0/n)+(2/(n*n))*sumtot); } else{ result = (raxi(bd,a,n)*raxi(bd,a,n))/((a0/n)+(2/(n*n))*sumtot); } }//end of try catch ( ArithmeticException ae ) { result = 0.0; } return result; } public void paint( Graphics g) { int i,scale; scale = parent.sb_scale.getValue(); g.setColor( Color.white); g.drawImage(parent.arrayImage[parent.element_type.getSelectedIndex()], parent.x_dim+60,180,200,100,Color.white,parent); g.fillRect( 20, 20, parent.x_dim, parent.y_dim ); g.setColor( Color.gray ); for (i = 20; i <= parent.x_dim+40; i=i+(int)(parent.x_dim/10)) g.drawLine(20,i,parent.x_dim+20,i); for (i = 20; i <= parent.y_dim+40; i=i+(int)(parent.y_dim/10)) g.drawLine(i,20,i,parent.y_dim+20); g.setColor( Color.blue ); if(parent.scaled==1){ for ( i = 1; i < 200; i++){ if((220-scale*r[i-1])>19 && (220-scale*r[i])>19 && (220-scale*r[i-1])<221 && (220-scale*r[i])<221) g.drawLine(i+20,(int)(220-scale*r[i-1]),i+21,(int)(220-scale*r[i])); } } else{ r[0] = f(1); for ( i = 1; i < 200; i++){ r[i] = f(i); if((220-scale*r[i-1])>19 && (220-scale*r[i])>19 && (220-scale*r[i-1])<221 && (220-scale*r[i])<221) g.drawLine(i+20,(int)(220-scale*r[i-1]),i+21,(int)(220-scale*r[i])); } } } }