Se diseña el applet dividiendo las tareas entre la clase que deriva de Applet (el interfaz de usuario) y la clase que deriva de Canvas (la representación gráfica).
En modo diseño (pestaña Design) situar en su parte inferior un panel denominado panelControl. Sobre este panel colocar dos paneles (véase la figura)
El primero, panelVelocidad contiene un Label cuyo título es “velocidad inicial <100 m/s” y un control TextField (textVelocidad) .
El panelBoton contiene un control Button (buttonTrayectorias) cuyo título es “Trayectorias”.
Cada vez que se introduzca un valor menor o igual que cero o mayor que 100 en el control de edición textVelocidad el control recupera el foco y se seleccionan todos los caracteres de dicho control.
En la función respuesta a la acción de pulsar el botón buttonTrayectorias, se ha de pasar el dato de la velocidad inicial al canvas llamando a la función miembro apropiada.
Datos sobre el tiro parabólico
Ecuación de la trayectoria
El alcance máximo se obtiene para el ángulo de 45º y es
La altura máxima se alcanza cuando el ángulo de disparo es de 90º
A continuación se da una plantilla que sugiere un posible procedimiento de crear la clase derivada de Canvas.
public class MyCanvas 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; //escalas double
escalaX, escalaY; //Velocidad
inicial double
vInicial; //ángulos
de tiro final int[] angulos={10, 20, 30, 40,
50, 60, 70, 80}; final int NPARTICULAS=angulos.length; //alcances double[]
alcance=new double[NPARTICULAS]; //para
guardar los puntos de la trayectoria Polygon[] pol=new Polygon[NPARTICULAS]; int divisionesX; //divisiones del eje X int divisionesY; //divisiones del eje Y
double dx; //paso boolean bNuevo=false; public MyCanvas() { //crear
el array de objetos Polygon //establecer
el color de fondo } void
origenEscalas(Graphics g){ //ancho
y alto de applet wAncho= wAlto= //dimensiones
de los caracteres cAncho= cAlto= //orígenes orgX= orgY= } void
setNuevo(double velocidad){ //inicializa
el miembro dato vInicial //calcula
el alcance para cada ángulo de tiro //calcula el alcance máximo a 45º
//divisiones cada 50 m, determinar escala horizontal escalaX //calcula la altura máxima a 90º
/divisiones cada 25 m, determinar
escala vertical escalaY //el
paso dx } void
dibujaEjes(Graphics g){ int
x1, y1; //dibuja
el eje Y, las divisiones cada 25 m //dibuja
el eje X las divisiones cada 50 m } double
posicion(int angulo, double x){ //ecuación
de la trayectoria para cada ángulo de tiro } public
void trayectorias(Graphics
g){ //determina las coordenadas de cada punto (pixel) de la trayectoria en el //canvas y las guarda en su
respectivo elemento del array de la clase Polygon
int x1,
y1; for(int i=0;
i<NPARTICULAS; i++){ for(double x=0.0;
x<alcance[i]; x+=dx){ x1=… y1=… pol[i].addPoint(x1, y1);
} } //dibuja
todas las trayectorias //muestra
el ángulo y el valor del alcance en forma de tabla } public
void paint(Graphics g){ origenEscalas(g); dibujaEjes(g); if(bNuevo) trayectorias(g); } } |