|
#1 -
25/02/2010 0:52:18
|
Reporta abuso
|
Link Permanente
|
|
camino entre dos puntos
|
|
|
|
|
|
Hola,
estoy desarrollando una aplicación que necesita calcular el camino que debería de recorrerse entre dos puntos y saber los puntos por los que voy pasando. Por ejemplo, imaginar que me encuentro en la posicion x=2 e Y=3 y mi objetivo es x=10 e y=6. Yo sé calcular la distancia entre estos dos puntos que sería de 8,54 unidades. Pues bien, mi problema viene al calcular el camino a seguir puesto que yo sólo puedo moverme 2 metros de mi posición cada vez. Por lo tanto, se que necesito 5 movimientos para llegar pero no sé como calcular los puntos intermedios por los que paso de la recta que une ambos puntos, que es el camino más corto. ¿Alguna idea o sugerencia para calcular dicho camino en coordenadas que se debe seguir para llegar al destino?
Gracias y un saludo.
|
|
|
|
|
|
#2 -
10/03/2010 16:50:01
|
Reporta abuso
|
Link Permanente
|
|
RE: camino entre dos puntos
|
|
|
Habia un error. Esta es la buena
private void btnCalcular_Click(object sender, EventArgs e) { //Obtenemos el valor de los puntos int origenX = Convert.ToInt32(this.txtOrigenX.Text); //2 int origenY = Convert.ToInt32(this.txtOrigenY.Text); //3 int finalX = Convert.ToInt32(this.txtFinalX.Text); //10 int finalY = Convert.ToInt32(this.txtFinalY.Text); //6
//Calculamos los catetos e hipotenusa del triangulo formado por los puntos anteriormente obtenidos double catetoX = Math.Abs(origenX - finalX); double catetoY = Math.Abs(origenY - finalY); double hipotenusa = Math.Sqrt(Math.Pow(catetoX, 2) + Math.Pow(catetoY, 2));
//Calculamos la relación que existe entre la hipotenusa y uno de los catetos -> sen ? = cateto opuesto / hipotenusa double razon = ((finalY - origenY) > 0) ? catetoY/hipotenusa : catetoX/hipotenusa; //Cada tramo son 2 unidades double tramo = 2; //Calculamos el número de tramos es decir, el número de veces que necesitas saber el valor de 'x' e 'y' int numTramos = Convert.ToInt32(hipotenusa/tramo); //Array donde se guardan los par valores double[,] array = new double[numTramos,2]; double puntoX, puntoY; int tramoNumero = 0; //Por cada tramo while (tramo <= hipotenusa) { if ((finalY - origenY) > 0) { /*Anterior incorrecto puntoX = Math.Sqrt(Math.Pow(tramo, 2) - Math.Pow(puntoY, 2)); puntoY = razon * tramo; Fin anterior*/ //Correcto puntoY = razon * tramo; puntoX = Math.Sqrt(Math.Pow(tramo, 2) - Math.Pow(puntoY, 2)); } else { puntoX = razon * tramo; puntoY = Math.Sqrt(Math.Pow(tramo, 2) - Math.Pow(puntoX, 2)); } array[tramoNumero,0] = puntoX; array[tramoNumero,1] = puntoY; tramo += 2; tramoNumero++; } //En el array están los valores de 'x' e 'y' para hacer lo que quieras con ellos }
|
|
|
|
|
|
|
#3 -
10/03/2010 16:39:05
|
Reporta abuso
|
Link Permanente
|
|
RE: camino entre dos puntos
|
|
|
Espero que te sirva con este pequeño ejemplo
private void btnCalcular_Click(object sender, EventArgs e) { //Obtenemos el valor de los puntos int origenX = Convert.ToInt32(this.txtOrigenX.Text); //2 int origenY = Convert.ToInt32(this.txtOrigenY.Text); //3 int finalX = Convert.ToInt32(this.txtFinalX.Text); //10 int finalY = Convert.ToInt32(this.txtFinalY.Text); //6
//Calculamos los catetos e hipotenusa del triangulo formado por los puntos anteriormente obtenidos double catetoX = Math.Abs(origenX - finalX); double catetoY = Math.Abs(origenY - finalY); double hipotenusa = Math.Sqrt(Math.Pow(catetoX, 2) + Math.Pow(catetoY, 2));
//Calculamos la relación que existe entre la hipotenusa y uno de los catetos -> sen a = cateto opuesto / hipotenusa double razon = ((finalY - origenY) > 0) ? catetoY/hipotenusa : catetoX/hipotenusa; //Cada tramo son 2 unidades double tramo = 2; //Calculamos el número de tramos es decir, el número de veces que necesitas saber el valor de 'x' e 'y' int numTramos = Convert.ToInt32(hipotenusa/tramo); //Array donde se guardan los par valores double[,] array = new double[numTramos,2]; double puntoX, puntoY; int tramoNumero = 0; //Por cada tramo while (tramo <= hipotenusa) { if ((finalY - origenY) > 0) { puntoX = Math.Sqrt(Math.Pow(tramo, 2) - Math.Pow(puntoY, 2)); puntoY = razon * tramo; } else { puntoX = razon * tramo; puntoY = Math.Sqrt(Math.Pow(tramo, 2) - Math.Pow(puntoX, 2)); } array[tramoNumero,0] = puntoX; array[tramoNumero,1] = puntoY; tramo += 2; tramoNumero++; } //En el array están los valores de 'x' e 'y' para hacer lo que quieras con ellos }
|
|
|
|
|