Orbita

Hola de nuevo:

Sigo en este largo proceso de aprender a programar, supuestamente ya se ciclos (solo whiles, el for me sigue costando un ojo) jajaja. Agradezco la ayuda de todos en mi post anterior y creanme que tomo muy en cuenta sus comentarios. Bueno, voy al grano del problema. Me piden hacer un Applet (ya estoy viendo applets por cierto :D) en el que haya un "sol" y un "planeta" que de vuetas alrededor.. el problema, eso precisamente.... ¿como hago que una bolita le de vueltas infinitamente a otra bolita estática? les dejo el código de lo que llevo... espero me puedan dar alguna sugerencia.. a lo mejor se puede hacer más fácil usando otro tipo de códigos, pero eso todo lo que yo se hasta el momento... ahí hay un for, que no se usar por supuesto, a lo mejor ahí esta el problema (NOTA: el maestro nos recomendo usar Math.sin o Math.cos)..... si queda rastro del planeta no importa, ese yo lo borro despues, con el mismo código pero diferente color.

import java.awt.*;
import javax.swing.JApplet;

public class orbita extends JApplet {
       
        public void init() {
        }

        public void paint(Graphics g) {
               
                g.drawString("Orbita", 225, 20 );
                g.drawString("SOL", 225, 120 );
                g.setColor(Color.blue);
                g.drawOval(225, 125, 20, 20);
                g.setColor(Color.black);
                       
                int k;
                k = 0;
               
                for(k=0; k <= Math.sin(360); k = k+5);
                g.drawOval(225, 40, 20, 20);
        }
}

Bueno, ese es uno. Tengo otro que ese si de plano ando bien perdido. No tengo ni la más remota idea de como hacerlo. Si no me quieren ayudar con este no hay problema, me urge más el primero. Le dejo textualmente lo que dice este segundo problema. Como nota quiero decirles que se hacer todo lo que me pide.. menos mostrar el calendario con el mes y año específico.

Problema: Calendario
Elaborar un programa que le pida al usuario el mes y el año en que nació y que presente en un Applet en pantalla en calendario correspondiente a dicho mes, por ejemplo para el mes 09 del año 1979 presentaría:
DO LU MA MI JU VI SA
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

(El 1 es sábado, la segunda hilera va uno por día obviamente... no se porque sale desfazado)
Para elaborar esta solución necesitarás un conjunto de fórmulas que permiten determinar el día de la semana que corresponde a una fecha específica. Dados los valores de las variables day, month y year las fórmulas se muestran en la figura. El valor de d revela el día de la semana que corresponde a la fecha day/month/year, si d es 0 significa domingo, si es 1 significa lunes y así sucesivamente.
Aclaro que el valor de d va de 0 a 6 y los valores de day, month y year empiezan desde 1.
Las fórmulas estan aqui:
http://img15.imageshack.us/img15/9295/monthn.jpg

Espero sus prontas respuestas, y les doy las gracias de antemano.

Saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Circulo

Si lo que quieres es que el planeta se quede dando vueltas de manera indefinida, o por ejemplo hasta que aprietes un boton o algo asi, entonces tienes que usar un ciclo con una sola condicion de salida, una variable boolean por ejemplo. Dibuja el sol primero, define la posicion inicial del planeta, y luego lo pones a girar. Me vas a tener que disculpar porque tiene siglos que no hago codigo grafico en Java pero lo importante es que obtengas las coordenadas del planeta, recordando un poco de geometrica analitica, podemos definir la coordenada X del planeta, irla moviendo de izquierda a derecha y de regreso, y solamente hay que calcular Y:

boolean condicion=true; //definela en el objeto para poder afectarla desde fuera
//dibuja el sol en una posicion, llamemosle sX y sY
//define un radio r que es la distancia entre el sol y el planeta
double r = 100;
double x = -r;
int incr = 1;
while (condicion) {
  //calcular Y
  double y = sY + Math.sqrt((r*r) - (x*x));
  //pintas el planeta pero recuerda sumarle sX a X antes de pintar

  //mueves X
  x += incr;
  if (x >= r) {
    incr = -incr;
  }
}

No usa senos y cosenos ni angulo, pero igual funciona (a menos que REQUIERAS usar senos, cosenos, y angulo, entonces cambia la cosa pero la neta no me acuerdo ahorita como hacerle).

Para el calendario, usa la clase java.util.GregorianCalendar; trae un metodo para darte el dia de la semana, a partir de ahi puedes ver todos los dias del mes que tienes que pintar y ver donde caen. Los puedes pintar usando algun Layout que te permita tener una cuadricula (se me ocurre GridLayout) pero tienes que poner espacios o algo en las celdas vacias, o si hay algo como un MatrixLayout pues mejor.

Hola ezamudio: Muchas

Hola ezamudio:

Muchas gracias por contestar, pero la verdad si requiero del uso de senos ó cosenos. Lo del calendario Gregoriano lo se medio usar, pero la cosa se complica con graficos porque tienes que declarar cosas antes y no se que más, y la verdad no me quiero meter en lios (porque no se como salir de ellos jaja). Aun así te lo agradezco sinceramente.

Saludos

Imagen de mathemathician

Sugerencia

Lo que puedes hacer es usar las coordenadas paramétricas de la circunferencia o las de la elipse. Las de la circunferencia son: x=r*cos (angulo) y=r*sen(angulo) donde r es el radio de la circunferencia y variando los valores de ángulo desde 0 hasta 2*PI obtendrás una circunferencia. Las coordenadas de la elipse son: x=a*cos(angulo) y=b*sen(angulo) donde a es el semieje mayor y b es el semieje menor de la elipse, variando el ángulo también desde 0 hasta 2*PI obtendrás la elipse. Según Kepler la órbita de un planeta de sistema solar es elíptica. Pero tú decides si usas la elipse o la circunferencia. Por otro lado, la velocidad no es constante y depende del radio de la órbita o de la distancia al sol. Espero que te ayude mi sugerencia. Saludos

Gracias mathemathician

Trate de hacerlo de la forma que me has propuesto, no corría aun así, pero se lo lleve a un amigo y solo afino algunos detalles y funciono!!. Tuvimos problemas con algunos Doubles e Integers (cosa rara esto de las gráficas), pero lo hicimos funcionar.. les dejo aqui el código del programa, recuerden que es un Applet, si lo tratan de correr como un Java class les va a decir que no está main.

import java.awt.*;
import javax.swing.JApplet;

public class orbita extends JApplet {
       
        public void init() {
        }

        public void paint(Graphics g) {
               
                g.drawString("Orbita", 225, 20 );
                g.drawString("SOL", 225, 120 );
                g.setColor(Color.blue);
                g.drawOval(225, 125, 20, 20);
                g.setColor(Color.black);
                       
                double k, a ,b, f, h;
                k = 0;
                a = 30;
               
                for(k=0; k < 1000; k = k + .05){
                       
                a = Math.sin(k);
                b = Math.cos(k);
                f = 100*a;
                h = 100*b;
                int c =(int)f;
                int d =(int)h;
                g.setColor(Color.black);
                g.drawOval (225+c, 125+d, 20, 20);
       
        try{
                                Thread.sleep(20);
                        }catch (Exception e){}
                        g.setColor(Color.white);
                        g.drawOval(225+c, 125+d, 20, 20);
                }
        }
}

¿Alguna sugerencia para el calendario?

Saludos