package planeta; import java.awt.*; public class MiCanvas extends Canvas { PlanetaApplet parent; //anchura y altura del canvas int wAncho, wAlto; //anchura y altura de un carácter int cAlto, cAncho; //orígenes int orgX, orgY; //Estado double x, y, Vx, Vy, t, dt=0.03; //escalas double escala; //posición en la pantalla int x1, y1; //objeto Planeta Planeta planeta; int nOrbita=-1; //colores de las órbitas static final Color color[]={new Color(255,0,0), new Color(0, 255,0), new Color(0, 0, 255), new Color(0, 255, 255), new Color(255, 0, 255), new Color(255, 255, 0), new Color(128, 0, 0), new Color(255, 128, 0), new Color(0, 64, 64), new Color(128, 128, 255), new Color(128, 0, 64), new Color(255, 0, 128), new Color(192, 192, 192), new Color(128, 128, 0)}; public MiCanvas(PlanetaApplet p) { parent=p; setBackground(Color.white); } public Dimension getPreferredSize(){ return new Dimension(320, 300); } void origenEscalas(Graphics g){ wAncho=getSize().width; wAlto=getSize().height; //dimensiones de los caracteres cAlto=g.getFontMetrics().getHeight(); cAncho=g.getFontMetrics().stringWidth("0"); //escalas: horizontal y vertical (12 divisiones del eje horizontal) escala=(double)(wAncho-4*cAncho)/12; //orígenes orgX=2*cAncho+(int)(10*escala); orgY=wAlto/2; } void dibujaEjes(Graphics g){ int x1, y1; g.setColor(Color.black); g.drawLine(0, orgY, wAncho, orgY); g.drawLine(orgX, 0, orgX, wAlto); g.drawString("X", wAncho-cAncho, orgY); g.drawString("Y", orgX+cAncho, cAlto); for(int i=-9; i<3; i++){ if(i==0) continue; x1=orgX+(int)(i*escala); g.drawLine(x1, orgY-2, x1, orgY+2); g.drawString(String.valueOf(Math.abs(i)), x1-cAncho/2, orgY+cAlto); } for(int i=-3; i<4; i++){ if(i==0) continue; y1=orgY+(int)(i*escala); g.drawLine(orgX-2, y1, orgX+2, y1); g.drawString(String.valueOf(Math.abs(i)), orgX+cAncho, y1+cAlto/2); } g.setColor(Color.yellow); g.fillOval(orgX-cAncho, orgY-cAncho, 2*cAncho, 2*cAncho); } void nuevo(double x, double Vy){ this.x=x; this.Vy=Vy; t=0.0; Vx=0.0; y=0.0; planeta=new Planeta(x, y, Vx, Vy, t, dt); x1=orgX+(int)(x*escala); y1=orgY; nOrbita++; if(nOrbita>13){ nOrbita=0; } double mAngular=x*Vy; double energia=Vy*Vy/2-2/x; parent.estado.setConstantes(energia, mAngular); } void mover(){ int x2, y2; Graphics g=getGraphics(); //calcula la nueva posición del planeta planeta.resolver(); //muestra los valores de las variables parent.estado.setEstado(planeta.x, planeta.y, planeta.Vx, planeta.Vy, planeta.t); g.setColor(color[nOrbita]); //situa al planeta en la nueva posición x2=orgX+(int)(escala*planeta.x); y2=orgY-(int)(escala*planeta.y); g.drawLine(x1, y1, x2, y2); x1=x2; y1=y2; g.dispose(); } public void paint(Graphics g){ origenEscalas(g); dibujaEjes(g); } }