//
/* Distancia entre ciudades */
/* Hecho por Dario Alejandro Alpern en agosto de 1998 */
import java.applet.*;
import java.awt.*;
public final class Dist extends Applet {
private final float Rad = (float)Math.PI/(float)(180 * 60); /* Minutos a radianes */
private Checkbox cb1, cb2, cb3, cb4, cb5, cb6;
private Button btnMenuPrincipal;
private List Localidad1, Localidad2, Localidad3;
private Button btnAveriguarDistancia;
private Button btnVerCiudades;
private Button btnSiguientePregunta;
private boolean ConPaises;
private boolean EnMenuPrincipal = false;
private int Pregunta = 0;
private int Ciud1, Ciud2;
private GridBagLayout gridbag;
private GridBagConstraints c = new GridBagConstraints();
private TextField textField;
private int KmJugador, test, Puntos;
private int[] Ciud = new int[6];
private final String[] Rumbos = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSO","SO","OSO","O","ONO","NO","NNO","N"};
private final String[] Ordinal = {"Primera", "Segunda", "Tercera", "Cuarta", "Quinta", "Sexta", "Séptima", "Octava", "Novena", "Última"};
private final String[] datosCiud = {
"Acapulco,México:1651;-9954",
"Alejandría,Egipto:3112;2957",
"Amman,Jordania:3157;3557",
"Amsterdam,Holanda:5223;454",
"Anchorage,Alaska:6113;-14954",
"Ankara,Turquía:3956;3252",
"Asunción,Paraguay:-2518;-5737",
"Atenas,Grecia:3759;2344",
"Auckland,Nueva Zelanda:-3652;17444",
"Bagdad,Irak:3318;4424",
"Bangkok,Thailandia:1345;10031",
"Barcelona,España:4123;211",
"Beijing,China:3955;11623",
"Beirut,Líbano:3352;3532",
"Berlín,Alemania:5232;1326",
"Bogotá,Colombia:437;-7405",
"Bombay,India:1856;7249",
"Brasilia,Brasil:-1547;-4754",
"Bruselas,Bélgica:5051;421",
"Bucarest,Rumania:4427;2606",
"Buenos Aires,Argentina:-3437;-5823",
"Calcuta,India:2230;8818",
"Canberra,Australia:-3519;14904",
"Caracas,Venezuela:1030;-6654",
"Chicago,EEUU:4152;-8737",
"Ciudad del Cabo,Sudáfrica:-3354;1825",
"Copenhague,Dinamarca:5540;1234",
"Córdoba,Argentina:-3124;-6411",
"Dakar,Senegal:1442;-1727",
"Damasco,Siria:3332;3620",
"Dublín,Irlanda:5321;-616",
"El Cairo,Egipto:3004;3114",
"Estambul,Turquía:4100;2858",
"Estocolmo,Suecia:5919;1804",
"Godthaab,Groenlandia:6411;-5144",
"Guadalajara,México:2042;-10319",
"Guatemala,Guatemala:1437;-9031",
"Helsinki,Finlandia:6010;2456",
"Hong Kong,China:2216;11412",
"Honolulú,Hawaii:2119;-15750",
"Jerusalén,Israel:3148;3512",
"Karachi,Pakistán:2451;6701",
"Katmandú,Nepal:2743;8519",
"Khartoum,Sudán:1538;3232",
"Kiev,Ucrania:5025;3034",
"La Habana,Cuba:2306;-8222",
"La Meca,Arabia Saudí:2126;3949",
"La Paz,Bolivia:-1629;-6808",
"Lagos,Nigeria:627;326",
"Lima,Perú:-1205;-7703",
"Lisboa,Portugal:3844;-908",
"Londres,Reino Unido:5129;-8",
"Los Ángeles,EEUU:3403;-11814",
"Luxemburgo,Luxemburgo:4937;608",
"Madrid,España:4025;-341",
"Managua,Nicaragua:1208;-8616",
"Mar del Plata,Argentina:-3800;-5733",
"Mendoza,Argentina:-3254;-6850",
"México,México:1922;-9911",
"Miami,EEUU:2546;-8012",
"Milán,Italia:4529;911",
"Monrovia,Liberia:618;-1047",
"Montecarlo,Mónaco:4344;726",
"Montevideo,Uruguay:-3454;-5609",
"Montreal,Canadá:4530;-7336",
"Moscú,Rusia:5545;3738",
"Nicosia,Chipre:3510;3322",
"Nueva York,EEUU:4043;-7401",
"Oslo,Noruega:5955;1046",
"Ottawa,Canadá:4525;-7543",
"Panamá,Panamá:901;-7930",
"París,Francia:4852;221",
"Polo Norte,Sin país:9000;0",
"Polo Sur,Sin país:-9000;0",
"Praga,República Checa:5005;1425",
"Puebla,México:1903;-9812",
"Quito,Ecuador:-13;-7831",
"Reykjavik,Islandia:6408;-2154",
"Río de Janeiro,Brasil:-2253;-4314",
"Roma,Italia:4154;1230",
"Rosario,Argentina:-3258;-6039",
"San Francisco,EEUU:3746;-12225",
"San José,Costa Rica:956;-8405",
"San Pablo,Brasil:-2331;-4638",
"San Petersburgo,Rusia:5956;3019",
"San Salvador,El Salvador:1342;-8912",
"Santiago,Chile:-3327;-7039",
"Seúl,Corea del Sur:3732;12659",
"Shanghai,China:3114;12129",
"Sofía,Bulgaria:4241;2320",
"Sydney,Australia:-3353;15112",
"Taipei,Taiwán:2503;12131",
"Tegucigalpa,Honduras:1406;-8712",
"Tokio,Japón:3542;13946",
"Toronto,Canadá:4339;-7922",
"Trípoli,Libia:3253;1317",
"Ulan Bator,Mongolia:4755;10656",
"Ushuaia,Argentina:-5448;-6818",
"Vancouver,Canadá:4915;-12307",
"Varsovia,Polonia:5214;2100",
"Viena,Austria:4812;1623",
"Vladivostok,Rusia:4308;13154",
"Washington,EEUU:3854;-7702",
"Yaoundé,Camerún:352;1131",
"Zurich,Suiza:4723;832"
};
private final String[] Ciudad = new String[datosCiud.length];
private final String[] Pais = new String[datosCiud.length];
private final int[] Latitud = new int[datosCiud.length];
private final int[] Longitud = new int[datosCiud.length];
private void MostrarMenuPrincipal() {
setLayout(new GridLayout(0,1));
setFont(new Font("Helvetica", Font.PLAIN, 20));
add(new Label("MENÚ PRINCIPAL",Label.CENTER));
add(cb1);
add(cb2);
add(cb3);
add(cb4);
add(cb5);
add(cb6);
add(btnMenuPrincipal);
validate();
EnMenuPrincipal = true;
Pregunta = 0;
} /* fin método MostrarMenuPrincipal */
private void LimpiarApplet() {
removeAll();
EnMenuPrincipal = false;
} /* fin método LimpiarApplet */
public boolean handleEvent(Event e) {
if (e.id == Event.ACTION_EVENT && e.target == btnMenuPrincipal ||
e.key == Event.ENTER && EnMenuPrincipal) {
if (cb1.getState()) { /* Comenzar con test tipo 1 (con países) */
ConPaises = true;
IniciarTestTipo1();
}
if (cb2.getState()) { /* Comenzar con test tipo 1 (sin países) */
ConPaises = false;
IniciarTestTipo1();
}
if (cb3.getState()) { /* Comenzar con test tipo 2 (con países) */
LimpiarApplet();
ConPaises = true;
IniciarTestTipo2();
}
if (cb4.getState()) { /* Comenzar con test tipo 2 (sin países) */
LimpiarApplet();
ConPaises = false;
IniciarTestTipo2();
}
if (cb5.getState()) { /* Ver listado de ciudades */
LimpiarApplet();
VerCiudades();
}
if (cb6.getState()) { /* Averiguar distancia entre ciudades */
LimpiarApplet();
AveriguarDistancia();
}
}
if (e.id == Event.ACTION_EVENT && e.target == btnVerCiudades ||
(e.key == Event.ESCAPE && EnMenuPrincipal == false)) {
LimpiarApplet();
MostrarMenuPrincipal();
}
if (e.id == Event.ACTION_EVENT && e.target == btnAveriguarDistancia &&
Localidad1.getSelectedIndex() >= 0 &&
Localidad2.getSelectedIndex() >= 0) {
Test1(true);
}
if (e.id == Event.ACTION_EVENT && e.target == btnSiguientePregunta) {
if (Pregunta > 0 && Pregunta < 11) {
if (test == 1) {
Test1(false);
}
else {
Test2();
}
}
else {
LimpiarApplet();
MostrarMenuPrincipal();
}
}
if (e.target == textField && e.id == Event.KEY_PRESS) {
if (e.key == Event.ENTER) {
if (test == 1) {
if (textField.getText().length() != 0) {
KmJugador = Integer.parseInt(textField.getText());
Test1(true);
}
}
else { /* test 2 */
if (textField.getText().length() == 4) {
MostrarTablaTest2(textField.getText());
}
}
}
if (e.key >= 48 && e.key <= 57) {
if (test == 1) {
if (textField.getText().length() == 6) {
return true;
}
}
else { /* test 2 */
if (e.key > 52 || e.key == 48 ||
textField.getText().indexOf(e.key-48+"") != -1) {
return true;
}
}
}
else if (e.key >= 32) {
return true;
}
}
return super.handleEvent(e);
} /* Fin método handleEvent */
public void init() {
String s;
CheckboxGroup cbg;
int i,j,GraLat,MinLat,GraLon,MinLon;
Localidad1 = new List();
Localidad2 = new List();
Localidad3 = new List();
for(i=0; i= 1) return 0;
if (q < -1) return 20012;
return (int)(Math.round(6370*Math.acos(q)));
} /* fin método Distancia */
private String ObtenerRumbo(int Lat1, int Lon1, int Lat2, int Lon2) {
int Angulo;
int AngAux;
float Diferencia;
if (Lon1 == Lon2) Angulo = (Lat1>Lat2)?180:0;
else {
if (Lat1 == 90*60 || Lat2 == (float)(-90*60)) Angulo = 180;
else {
if (Lat1 == -90*60 || Lat2 == 90*60) Angulo = 0;
else {
Diferencia = Lon2 - Lon1;
Angulo = 90 - (int)(Math.round(180/Math.PI*Math.atan((Math.tan(Lat2*Rad)*Math.cos(Lat1*Rad)-Math.sin(Lat1*Rad)*Math.cos(Diferencia*Rad))/Math.sin(Diferencia*Rad))));
Diferencia = (Diferencia + 360*60) % (360*60);
if (Diferencia > 180*60) {
Angulo = (Angulo + 180) % 360;
}
}
}
}
AngAux = (Angulo + 348) % 360;
return Angulo + " grado" + (Angulo==1?"":"s") + " (" + Rumbos[(int)Math.floor((float)AngAux/22.5)] + ")";
} /* fin método ObtenerRumbo */
private String HorasSol(int Lat, int Lon) {
double q;
int MinutosSol;
if (Math.abs(Lat) == 90*60) q = Lat;
else q = .4338 * Math.tan(Lat*Rad);
if (q >= 1) MinutosSol = 0;
else if (q <= -1) MinutosSol = 1440;
else MinutosSol = (int)Math.round(458.3662*Math.acos(q));
return (int)(MinutosSol/60) + "h " + (MinutosSol%60) + "m";
} /* fin método HorasSol */
private void Test1(boolean Completo) {
int Distcia;
int PuntajeParcial;
String Interpretacion;
String Ci1, Ci2;
int Lat1, Lat2, Lon1, Lon2;
LimpiarApplet();
setFont(new Font("Helvetica", Font.PLAIN, 12));
gridbag = new GridBagLayout();
c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER; /* Ultimo en la fila */
c.weightx = 1.0;
c.fill = GridBagConstraints.BOTH;
setLayout(gridbag);
if (Pregunta != 0) { /* En test tipo 1 */
if (Completo == false) { /* Generar las ciudades */
Ciud1 = (int)Math.floor(Math.random()*datosCiud.length);
do {
Ciud2 = (int)Math.floor(Math.random()*datosCiud.length);
} while (Ciud1 == Ciud2);
setFont(new Font("Helvetica", Font.BOLD, 14));
makeLabel("Su puntaje actual es: "+Puntos+" punto"+(Puntos==1?"":"s"),Color.red);
}
}
else { /* Distancia entre dos ciudades */
Ciud1 = Localidad1.getSelectedIndex();
Ciud2 = Localidad2.getSelectedIndex();
}
Ci1 = ObtenerCiudad(Ciud1, ConPaises || Pregunta == 0);
Ci2 = ObtenerCiudad(Ciud2, ConPaises || Pregunta == 0);
Lat1 = Latitud[Ciud1];
Lon1 = Longitud[Ciud1];
Lat2 = Latitud[Ciud2];
Lon2 = Longitud[Ciud2];
if (Pregunta != 0) {
makeLabel(Ordinal[Pregunta - 1]+" pregunta: ¿Cuál es la distancia entre las siguientes ciudades?", Color.black);
}
else {
makeLabel("Las ciudades son:", Color.black);
}
makeLabel(Ci1+" y "+Ci2, Color.black);
makeLabel(" ", Color.black);
if (Completo == false) {
c.weightx = 0.0;
c.gridwidth = GridBagConstraints.RELATIVE;
makeLabel("Distancia en kilómetros:", Color.black);
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = GridBagConstraints.REMAINDER;
textField = new TextField(6);
c.weightx = 1.0;
c.fill = GridBagConstraints.NONE;
gridbag.setConstraints(textField, c);
add(textField);
c.fill = GridBagConstraints.BOTH;
}
else {
Distcia = Distancia(Lat1, Lon1, Lat2, Lon2);
if (Pregunta != 0) {
makeLabel("Según ud. la distancia es de "+KmJugador+" kilómetro"+(KmJugador==1?"":"s")+", pero en realidad es de "+Distcia+" kilómetro"+(Distcia==1?"":"s")+".", Color.red);
}
else {
makeLabel("La distancia entre ambos lugares es de "+Distcia+" kilómetro"+(Distcia==1?"":"s")+".", Color.red);
}
makeLabel("Además le informo que:", Color.black);
makeLabel("Para ir de "+ObtenerCiudad(Ciud1,false)+" a "+ObtenerCiudad(Ciud2,false)+": "+ObtenerRumbo(Lat1, Lon1, Lat2, Lon2), Color.black);
makeLabel("Para ir de "+ObtenerCiudad(Ciud2,false)+" a "+ObtenerCiudad(Ciud1,false)+": "+ObtenerRumbo(Lat2, Lon2, Lat1, Lon1), Color.black);
makeLabel("donde: 0º = norte; 90º = este; 180º = sur; 270º = oeste.", Color.black);
c.gridwidth = GridBagConstraints.RELATIVE;
makeLabel("Sol sobre el horizonte de " + Ci1 + ":", Color.black);
c.gridwidth = GridBagConstraints.REMAINDER;
makeLabel("Sol sobre el horizonte de " + Ci2 + ":", Color.black);
c.gridwidth = GridBagConstraints.RELATIVE;
makeLabel("El 21 de junio: "+HorasSol(-Lat1, Lon1), Color.black);
c.gridwidth = GridBagConstraints.REMAINDER;
makeLabel("El 21 de junio: "+HorasSol(-Lat2, Lon2), Color.black);
c.gridwidth = GridBagConstraints.RELATIVE;
makeLabel("El 21 de diciembre: "+HorasSol(Lat1, Lon1), Color.black);
c.gridwidth = GridBagConstraints.REMAINDER;
makeLabel("El 21 de diciembre: "+HorasSol(Lat2, Lon2), Color.black);
if (Pregunta != 0) {
PuntajeParcial = (int)Math.round(100 - 100 * Math.abs(Math.log((double)Distcia/(double)KmJugador)));
if (PuntajeParcial < 0) PuntajeParcial = 0;
if (PuntajeParcial == 100) Interpretacion = "¡impresionante!";
else if (PuntajeParcial > 94) Interpretacion = "¡excelente!";
else if (PuntajeParcial > 89) Interpretacion = "¡muy bien!";
else if (PuntajeParcial > 79) Interpretacion = "bien, che.";
else if (PuntajeParcial > 69) Interpretacion = "No está mal: regular, bah";
else if (PuntajeParcial > 59) Interpretacion = "mmmm...";
else if (PuntajeParcial > 39) Interpretacion = "ay, ay, ay, ¡qué mediocre!";
else if (PuntajeParcial > 19) Interpretacion = "¡¡Yeeech!!";
else Interpretacion = "¡¡Puajjj!!";
Puntos += PuntajeParcial;
makeLabel("Su puntaje en esta ronda es "+PuntajeParcial+" ("+Interpretacion+"), por lo tanto su puntaje "+(Pregunta==10?"final":"actual")+" es "+Puntos+".", Color.red);
if (Pregunta == 10) {
if (Puntos > 949) Interpretacion = "Aunque vaya en contra de mis principios, lo felicito.";
else if (Puntos > 899) Interpretacion = "Casi perfecto. CASI. La próxima vez no le irá tan bien.";
else if (Puntos > 799) Interpretacion = "Se podría decir que sabe del tema. Pero todavía le falta.";
else if (Puntos > 699) Interpretacion = "Siga jugando, va por el buen camino.";
else if (Puntos > 599) Interpretacion = "Evidentemente, le falta práctica (varios meses de práctica).";
else if (Puntos > 399) Interpretacion = "Parece que su fuerte no es la geografía.";
else Interpretacion = "Me parece que ud. tendría que jugar al 'Doom'.";
c.gridwidth = GridBagConstraints.RELATIVE;
makeLabel(Interpretacion, Color.red);
}
Pregunta++;
}
BotonSiguientePregunta();
}
validate();
if (Completo == false) {
textField.requestFocus();
}
else {
btnSiguientePregunta.requestFocus();
}
} /* fin método Test1 */
private void BotonSiguientePregunta() {
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.NONE;
btnSiguientePregunta = new Button((Pregunta>10 || Pregunta==0)?"Menú principal":"Siguiente pregunta");
gridbag.setConstraints(btnSiguientePregunta, c);
add(btnSiguientePregunta);
} /* fin método BotonSiguientePregunta */
private void Test2() {
int j, k, azar;
LimpiarApplet();
setFont(new Font("Helvetica", Font.PLAIN, 12));
gridbag = new GridBagLayout();
c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER; /* Ultimo en la fila */
c.weightx = 1.0;
c.fill = GridBagConstraints.BOTH;
setLayout(gridbag);
for (j=0; j<6; j++) {
do {
azar = (int)Math.floor(Math.random()*datosCiud.length);
for (k=0; k0; k--) {
if (arrayDistComb[k] > arrayDistComb[k-1]) break;
i = arrayDistComb[k];
arrayDistComb[k] = arrayDistComb[k-1];
arrayDistComb[k-1] = i;
temp = arrayComb[k];
arrayComb[k] = arrayComb[k-1];
arrayComb[k-1] = temp;
}
}
distancias = new List();
lugar = -1;
setFont(new Font("Courier", Font.PLAIN, 12));
for (j=0; j<24; j++) {
combinacion = arrayComb[j];
if (combinacion.compareTo(orden) == 0) {
lugar = j;
}
distancias.addItem((lugar==j?"-> ":" ")+(j+1)+") "+ObtenerCiudad(Ciud[0], ConPaises)+" -> "+ ObtenerCiudad(Ciud[Integer.parseInt(combinacion.substring(0,1))], ConPaises)+" -> " + ObtenerCiudad(Ciud[Integer.parseInt(combinacion.substring(1,2))], ConPaises) + " -> ");
distancias.addItem(" " + ObtenerCiudad(Ciud[Integer.parseInt(combinacion.substring(2,3))], ConPaises)+" -> "+ ObtenerCiudad(Ciud[Integer.parseInt(combinacion.substring(3,4))], ConPaises)+" -> "+ ObtenerCiudad(Ciud[5], ConPaises)+": "+ arrayDistComb[j] + " km (" + Math.round(100-100*j/23) + " puntos)");
if (j<23) distancias.addItem(" ");
}
gridbag.setConstraints(distancias, c);
add(distancias);
c.weighty = 0.0;
i = Math.round(100-100*lugar/23);
Puntos += i;
makeLabel("Ud. eligió la opción " + (lugar+1) + " por lo que le corresponden " + i + " puntos.", Color.red);
c.gridwidth = GridBagConstraints.RELATIVE;
makeLabel("Su puntaje "+(Pregunta==10?"final":"actual")+" es "+Puntos+".", Color.red);
Pregunta++;
BotonSiguientePregunta();
validate();
distancias.makeVisible(lugar*3);
} /* fin método MostrarTablaTest2 */
} /* fin clase Dist */
//