Comunidad de diseño web y desarrollo en internet online

Matematicas: punto intermedio entre coordenadas.

Citar            
MensajeEscrito el 22 Oct 2008 04:01 am
Hola, se que quizas charla no sea el lugar adecuado para postear este tema pero como necesito un poco de ayuda matemática si lo considero.. paso a explicar el problema que tengo.

yo tengo puntos de coordenadas sobre un mapa, todos están a diferente distancia el uno del otro..
lo que básicamente necesito es poder ubicar puntos intermedios entre esos puntos ya ubicados..

a ver si me puedo explicar mejor, ejemplo:

tengo un punto A con coordenadas x=40, y=50
y otro punto B con coordenadas x=105, y=88
(las coordenadas las invente son un ejemplo ya que los puntos pueden estar en coordenadas random);


bien ahora yo saque el calculo en porcentajes para calcular los puntos intermedios através de porcentajes:
osea que si la distancia entre A y B es 75 , y quiero que C esté a por ejemplo 80% de A.
75 = 100% de la distancia entre A y B
C va a estar a 80% de A en dirección hacia B.
osea que el calculo seria= (75*80)/100
C va a estar a 60 de los 75. bien?

pero mi problema esta en que como le indico la ubicación sobre el plano??
eso creo que ya es con seno y coseno verdad?..
quiero que me quede algo asi:


porque hay que tener en cuenta que en el eje x e y pueden estar para cualquier lado. :cry:

sugerencias? :)

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 22 Oct 2008 05:10 am
d = sqrt((A.x-B.x)^2 + (A.y-B.y)^2); //distancia
ang = atan(A.x,A.y, B.x, B.y); //arcotangente, devuelve el ángulo entre dos puntos
p = 0.75; //porcentage

P.x = A.x+p*cos(ang);
P.y = A.y+p*sin(ang);

(sin y cos puede estar cambiados, los he puesto en el sistema cartesiano, pero en C o AS, el ángulo puede estar rotado 90 grados (al menos en C, lo que me dió más de un problema de cabeza), prueba a intercambiar sin por cos y viceversa ( o a poner uno de los dos con signo negativo, todo depende de si el ángulo está girado +90º o -90º))

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 22 Oct 2008 12:45 pm
Gracias _CONEJO me has orientado para sacar este calculo pero en algo debo estar errando porque a veses pareciera funcionar y a veces no. yo lo hice asi a ver que onda.

Código :

var dis:int=Math.sqrt(Math.pow((A.y-B.y),2)+ Math.pow((A.x-B.x),2)); //distancia entre los dos puntos
var por:int=50; //porcentaje (lo que tambien probe fue 0.5 pero tampoco funciona)
var ang:Number = Math.atan2((A.y-B.y),(A.x-B.x)); // arco tangente (yo creo que aca estoy fallando)

var px:Number=A.x+por*Math.cos(Math.tan(ang)); //saco el ángulo coseno de la tangente del angulo en radianes
var py:Number=A.y+por*Math.sin(Math.tan(ang)); //saco el ángulo seno de la tangente del angulo en radianes


pero por alguna razon a veces pareciera dar correcto y a veces no.. :(

lo que no te entendí bien fue lo del ángulo negativo, pero bueno seguiré probando a ver que es lo que esta fallando. :cry:

_CONEJO escribió:

(sin y cos puede estar cambiados, los he puesto en el sistema cartesiano, pero en C o AS, el ángulo puede estar rotado 90 grados (al menos en C, lo que me dió más de un problema de cabeza), prueba a intercambiar sin por cos y viceversa ( o a poner uno de los dos con signo negativo, todo depende de si el ángulo está girado +90º o -90º))

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 22 Oct 2008 01:55 pm
Math.cos(Math.tan(ang)) y Math.sin(Math.tan(ang)) NO tiene sentido. La tangente no pinta nada ahí, quítala. La tangente necesita un ángulo y devuelve un real. Las funciones seno y coseno necesitan un ángulo y devuelven un real entre -1 y 1. pero ahora mismo están reciendo un ángulo.

¿por qué pusiste la tangente?



En matemáticas si dibujamos una circunferencia y la marcamos con 360 grados (NUNCA, no se usan grados, sino radianes, pero no viene al caso), el cero (y el 360º) caerían en la parte derecha de la circunferencia, lo que sería el este. En el norte tendríamos 90º, en el oeste 180º y en el sur 270º.

Ahora mismo no recuerdo en qué lenguaje, pero el cero lo ponían en el norte, con lo que había que hacer un cambio sin-cos o similar.

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 22 Oct 2008 03:34 pm

_CONEJO escribió:

Math.cos(Math.tan(ang)) y Math.sin(Math.tan(ang)) NO tiene sentido. La tangente no pinta nada ahí, quítala. La tangente necesita un ángulo y devuelve un real. Las funciones seno y coseno necesitan un ángulo y devuelven un real entre -1 y 1. pero ahora mismo están reciendo un ángulo.

¿por qué pusiste la tangente?


Si fue un error mio al interpretar los angulos..

_CONEJO escribió:


En matemáticas si dibujamos una circunferencia y la marcamos con 360 grados (NUNCA, no se usan grados, sino radianes, pero no viene al caso), el cero (y el 360º) caerían en la parte derecha de la circunferencia, lo que sería el este. En el norte tendríamos 90º, en el oeste 180º y en el sur 270º.

Ahora mismo no recuerdo en qué lenguaje, pero el cero lo ponían en el norte, con lo que había que hacer un cambio sin-cos o similar.


yo estoy dejando el 0 y el 360 en lo que seria el positivo de la coordenada x , al este. pero creo que aqui es donde tengo el problema..
ahora al sacarle el Math.tan() lo que me esta haciendo es poniéndolo a la inversa onda algo asi :


asea que esta respetando el angulo pero lo esta colocando para el otro lado
Gracias sinceramente _CONEJO. estoy viendo de solucionar esa parte, tambien detecto que por ejemplo el 50% del total de la distancia me lo toma como el 30% mas o menos osea que ahi tambien hay un error de calculos.

Código :

var dis:int=Math.sqrt(Math.pow((A.y-B.y),2)+ Math.pow((A.x-B.x),2)); //distancia entre los dos puntos
var por:int=50; //porcentaje (lo que tambien probe fue 0.5 pero tampoco funciona)
var ang:Number = Math.atan2((A.y-B.y),(A.x-B.x)); // arco tangente (yo creo que aca estoy fallando)

var px:Number=A.x+por*Math.cos(ang); //saco el ángulo coseno 
var py:Number=A.y+por*Math.sin(ang); //saco el ángulo seno


también probé el echo de cambiar el cos por el sin pero se va para cualquier lado.

seguire intentando. :) gracias.

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 22 Oct 2008 03:36 pm

Código ActionScript :

import flash.geom.Point;
function interpolar( x1, y1, x2, y2, porcentaje){
 A = new Point(x1, y1);
 B = new Point(x2, y2);
 return Point.interpolate(A, B, porcentaje);
}
trace( interpolar(2, -6, -8, 5, .8));

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 22 Oct 2008 03:45 pm

Teseo escribió:

Código ActionScript :

import flash.geom.Point;
function interpolar( x1, y1, x2, y2, porcentaje){
 A = new Point(x1, y1);
 B = new Point(x2, y2);
 return Point.interpolate(A, B, porcentaje);
}
trace( interpolar(2, -6, -8, 5, .8));


Antes de ir a comprar una 45 y volarme el poco cerebro que me queda por haber estado toda la madrugada de ayer y la mañana de hoy tratando de sacar esto.. GRACIASSSS Teseo!!!!!!!!! a vos también _CONEJO gracias :)

funciona perfecto..

:cry: :cry: :cry: :twisted: :twisted: :twisted: :cry: :cry: :lol: :lol: :cry: :cry: :twisted: :twisted:
*se tira del balcón disfrutando la crisis emocional que siente.

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 22 Oct 2008 03:49 pm

Código ActionScript :

A = new Object();
B = new Object();
A.x = A.y = 100;
B.x = 150;
B.y = 200;


var dist=Math.sqrt(Math.pow((A.y-B.y),2)+ Math.pow((A.x-B.x),2)); //distancia entre los dos puntos
var por= 0.75;//0.50; //porcentaje (lo que tambien probe fue 0.5 pero tampoco funciona)
var ang:Number = Math.atan2((B.y-A.y),(B.x-A.x)); // arco tangente (yo creo que aca estoy fallando)

trace("Distancia : "+dist);
trace("Angulo : "+ang);
trace((A.y-B.y)+"--"+(A.x-B.x));

P = new Object();
P.x = A.x+por*dist*Math.cos(ang); //saco el ángulo coseno 
P.y = A.y+por*dist*Math.sin(ang); //saco el ángulo seno

tmp = _root.attachMovie("punto", "pA", 1);
tmp._x = A.x;
tmp._y = A.y;
tmp = _root.attachMovie("punto", "pB", 2);
tmp._x = B.x;
tmp._y = B.y;
tmp = _root.attachMovie("puntoMedio", "pP", 3);
tmp._x = P.x;
tmp._y = P.y;

trace("A.x "+A.x+" A.y "+A.y);
trace("B.x "+B.x+" B.y "+B.y);
trace("P.x "+P.x+" P.y "+P.y);




Para flash 8 y "a mano"

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 



Ultima edición por _CONEJO el 22 Oct 2008 04:03 pm, editado 1 vez

firefox
Citar            
MensajeEscrito el 22 Oct 2008 03:54 pm
Graciass _CONEJO ya iva igualmente a preguntar donde estaba el error de el código que estábamos viendo.. porque esta bueno que ya este hecho el método pero me quedo la duda vite? jaja

_CONEJO escribió:

...
P = new Object();
P.x = A.x+por*dist*Math.cos(ang); //saco el ángulo coseno
P.y = A.y+por*dist*Math.sin(ang); //saco el ángulo sen0
...
[/code]
Para flash 8 y "a mano"


el error por lo que veo es que no le multiplicaba la distancia!!

Código :

P.x = A.x+por*Math.cos(ang);


Gracias ^^

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 22 Oct 2008 04:00 pm
También estaba aquí :

Código ActionScript :

var ang:Number = Math.atan2((B.y-A.y),(B.x-A.x));


Hacías A-B, y luego tomabas A como el origen, lo que daba que fuera equivocado.

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 



Ultima edición por _CONEJO el 22 Oct 2008 04:02 pm, editado 1 vez

firefox
Citar            
MensajeEscrito el 22 Oct 2008 04:01 pm
Conejo, recuerda que puedes usar [as] en vez de [code]

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

firefox
Citar            
MensajeEscrito el 22 Oct 2008 05:13 pm
Realmente con aplicar el porcentaje, a la distancia entre los puntos es suficiente, en código algo así:

Código ActionScript :

P = new Object(); 
P.x = (B.x-A.x)*por + A.x;
P.y = (B.y-A.y)*por + A.y;



Y para probar:

Código ActionScript :

A = new Object(); 
B = new Object(); 
A.x = A.y = 100; 
B.x = 150; 
B.y = 200; 
 
 
var por= 0.8;//0.50; //porcentaje (lo que tambien probe fue 0.5 pero tampoco funciona) 

//BUALA, es todo: 
P = new Object(); 
P.x = (B.x-A.x)*por + A.x;
P.y = (B.y-A.y)*por + A.y;
//
tmp = _root.attachMovie("punto", "pA", 1); 
tmp._x = A.x; 
tmp._y = A.y; 
tmp = _root.attachMovie("punto", "pB", 2); 
tmp._x = B.x; 
tmp._y = B.y; 
tmp = _root.attachMovie("puntoMedio", "pP", 3); 
tmp._x = P.x; 
tmp._y = P.y; 
 
trace("A.x "+A.x+" A.y "+A.y); 
trace("B.x "+B.x+" B.y "+B.y); 
trace("P.x "+P.x+" P.y "+P.y); 

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 22 Oct 2008 06:11 pm
Realmente muchas gracias a todos :)

Por phoxer

Claber

827 de clabLevel

4 tutoriales

Genero:Masculino  

Ing en Sistemas

firefox
Citar            
MensajeEscrito el 22 Oct 2008 06:55 pm

Dano escribió:

Realmente con aplicar el porcentaje, a la distancia entre los puntos es suficiente, en código algo así:

Código ActionScript :

P = new Object(); 
P.x = (B.x-A.x)*por + A.x;
P.y = (B.y-A.y)*por + A.y;




Touché, la verdad es que lo hice pensando en un algoritmo (perfect-pixel collisions) que tuve que hacer hace poco, en el que debía aplicar una rotación de 90º y de ahí que sacase el ángulo, pero sin duda tu solución es mucho más elegante y sencilla. ^^

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 22 Oct 2008 08:03 pm
Dios mio, el _CONEJO es todo un Crack U_U

Mis respetos.

Por Ozmonk

563 de clabLevel

3 tutoriales

Genero:Masculino   Premio_Secretos

Chef En Entrenamiento

firefox
Citar            
MensajeEscrito el 22 Oct 2008 08:30 pm
Así es Dano, esa la forma de siempre. Usando las ecuaciones paramétricas de una recta.
La forma que yo expresé es la más rápida de proceso en AS:

Código ActionScript :

P = Point.Interpolate(new Point(x1, y1), new Point(x2, y2), por);

Valga decir que por (porcentaje) definirá un punto entre A y B para valores entre 0 y 1 y exterior para los intervalos restantes.
Los puntos de espejo se calculan en porcentajes -1 y 2.
Para cálculos de 3D en AS hay que seguir con la paramétrica de siempre. :twisted:

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 22 Oct 2008 09:09 pm

Ozmonk escribió:

Dios mio, el _CONEJO es todo un Crack U_U

Mis respetos.


¿Por qué? Las respuestas de Teseo y Dano fueron más acertadas y elegantes.

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 25 Oct 2008 10:24 pm
Creo que el error de _CONEJO es no considerar que el 0 del eje de las ordenadas esta en el extremo superior de la pantalla y los 0 grados al norte.

Entonces hay que intercambiar seno y coseno, agregar un menos antes del Math.atan2 y cuando seteemos la posicion en el eje "y" restar en lugar de sumar.

Es complicado, mas que nada cuando estudias fisica en la facultad y vivis confundiendo la manera correcta y la manera AS de hacer las cosas.

Por HernanRivas

Claber

3416 de clabLevel

26 tutoriales

 

Argentina

firefox
Citar            
MensajeEscrito el 25 Oct 2008 10:42 pm

HernanRivas escribió:

Creo que el error de _CONEJO es no considerar que el 0 del eje de las ordenadas esta en el extremo superior de la pantalla y los 0 grados al norte.

Entonces hay que intercambiar seno y coseno, agregar un menos antes del Math.atan2 y cuando seteemos la posicion en el eje "y" restar en lugar de sumar.

Es complicado, mas que nada cuando estudias fisica en la facultad y vivis confundiendo la manera correcta y la manera AS de hacer las cosas.


No, ya que el ángulo "debería" ser el mismo, por aquello del signo, debería mantenerse una concordancia... pero si, imagino que estoy acostumbrado a la forma "matemática" y cuando me cambian el eje de coordenadas la lio un poco (aún así, recuerdo un caso en el que el 0 estaba en el norte, no recuerdo si era C, PALib, AS, ... pero una vez eso me hizo perder muuuuucho tiempo)

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 25 Oct 2008 11:34 pm
Si, es cierto, el angulo deberia ser el mismo. Si es asi, el menos esta ahi solo porque el eje Y esta invertido...

Por HernanRivas

Claber

3416 de clabLevel

26 tutoriales

 

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.