package armonico1; import java.awt.*; public class MiCanvas extends Canvas { //anchura y altura del canvas int wAncho, wAlto; //anchura y altura de un carácter int cAlto, cAncho; //orígenes int orgX, orgY; //escala double escalaY, escalaX; //estado int n=0; Polygon pol=new Polygon(); public MiCanvas() { setBackground(Color.white); } void origenEscalas(Graphics g){ wAncho=getSize().width; wAlto=getSize().height; //dimensiones de los caracteres cAlto=g.getFontMetrics().getHeight(); cAncho=g.getFontMetrics().stringWidth("0"); //escalas escalaY=(double)(wAlto-3*cAlto)/7.0; escalaX=(double)(wAncho-cAlto)/7.0; //orígenes orgX=wAncho/2; orgY=wAlto-2*cAlto; } void setNuevo(int nEstado){ this.n=nEstado; repaint(); } //calcula la función de onda double funcion(double x){ double y=(1.0/Math.sqrt(potencia2(n)*Math.sqrt(Math.PI)*factorial(n)))*hermite(x, n)*Math.exp(-x*x/2); return y; } //función recursiva polinomio de Hermite private double hermite(double x, int n){ if(n==0) return 1.0; if(n==1) return 2*x; return (2*x*hermite(x, n-1)-2*(n-1)*hermite(x, n-2)); } private long potencia2(int n){ long result=1; for(int i=1; i<=n; i++){ result*=2; } return result; } private long factorial(int n){ if(n==0) return 1; long result=1; for(int i=1; i<=n; i++){ result*=i; } return result; } void graficaPotencial(Graphics g){ g.setColor(Color.black); String texto; int x1, y1; //escala g.drawLine(0, orgY, wAncho, orgY); g.drawString("x", wAncho-2*cAncho, orgY-2); for(int i=-4; i<=4; i++){ x1=orgX+(int)(escalaX*i); g.drawLine(x1, orgY, x1, orgY+cAncho); texto=String.valueOf(i); g.drawString(texto, x1-g.getFontMetrics().stringWidth(texto)/2, orgY+cAncho+cAlto); if(i==4) break; for(int j=1; j<5; j++){ x1=orgX+(int)(escalaX*(i+(double)j/5)); g.drawLine(x1, orgY, x1, orgY+cAncho/2); } } g.drawLine(orgX, orgY, orgX, 0); g.drawString("Energía", orgX+cAncho, cAlto); for(int i=0; i<=7; i++){ y1=orgY-(int)(escalaY*i); g.drawLine(orgX, y1, orgX-cAncho, y1); texto=String.valueOf(i); g.drawString(texto, orgX-4*cAncho, y1+cAlto/2); } //energía potencial pol.npoints=0; double x=0.0; do{ x1=orgX+(int)(x*escalaX); y1=orgY-(int)(x*x*escalaY/2); pol.addPoint(x1, y1); x+=0.05; }while(y1>0); pol.addPoint(wAncho, 0); pol.addPoint(wAncho, orgY); g.setColor(Color.gray); g.fillPolygon(pol); for(int i=0; i