Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: marcode en 23 de Marzo de 2006, 12:00:23 PM

Título: Hallar El Punto Más Cercano
Publicado por: marcode en 23 de Marzo de 2006, 12:00:23 PM
 Hola chicos

Tengo un punto P y un segmendo de A a B, y quiero conocer el punto C del segmento más cercano a P.

Citar

        A
        |
        C-------P             
        |
        |
        B
                    P
                  /
                 /
               A  <--- aquí el punto C es igual a A
               |
               |
               |
               B

Se como hallar la distancia a ese punto pero no se como hallar sus coordenadas, a ser posible en 3D.
Título: Hallar El Punto Más Cercano
Publicado por: Pogacha en 23 de Marzo de 2006, 12:31:09 PM
 N.x  = B.x - A.x
N.y =  B.y - A.y

float l=sqrt(N.x *N.X + N.y*N.y);
if(l>0.0f)
{
N.x/=l;
N.y/=l;
}

float a = N.x*A.x + N.y*A.y;
float b = N.x*B.x + N.y*B.y;
float c = N.x*P.x + N.y*P.y;

if(c<a) return A;
if(c>b) return B;

C.x = A.x + N.x *c;
C.y = A.y + N.y *c;

return C;
Título: Hallar El Punto Más Cercano
Publicado por: Repoker en 23 de Marzo de 2006, 12:32:41 PM
 Si, como dices, conoces la distancia, sólo tienes que sustituir.

Distancias

Al menos usa google antes de ir con tus dudas a los demás.
Título: Hallar El Punto Más Cercano
Publicado por: Pogacha en 23 de Marzo de 2006, 01:09:43 PM
Cita de: "Pogacha"N.x  = B.x - A.x
N.y =  B.y - A.y

float l=sqrt(N.x *N.X + N.y*N.y);
if(l>0.0f)
{
N.x/=l;
N.y/=l;
}

float a = N.x*A.x + N.y*A.y;
float b = N.x*B.x + N.y*B.y;
float c = N.x*P.x + N.y*P.y;

if(c<a) return A;
if(c>b) return B;

C.x = A.x + N.x *c;
C.y = A.y + N.y *c;

return C;
Error, me equivoque

C.x = A.x + N.x *(c-a);
C.y = A.y + N.y *(c-a);

Saludos
Título: Hallar El Punto Más Cercano
Publicado por: MrSickman en 23 de Marzo de 2006, 01:42:09 PM
 
CitarAl menos usa google antes de ir con tus dudas a los demás
Vaya, no crees que ha sonado un poco duro...  :blink:  
Título: Hallar El Punto Más Cercano
Publicado por: marcode en 23 de Marzo de 2006, 02:32:14 PM
 Se responde por si mismo  ;)

Pogacha gracias, aunque esa raíz cuadrada me va a fastidiar un poco la velocidad. ¿Para hacerlo en 3D sabes como sería?.


Título: Hallar El Punto Más Cercano
Publicado por: Pogacha en 23 de Marzo de 2006, 02:55:00 PM
 En 3d y sin raiz:

N.x  = B.x - A.x
N.y =  B.y - A.y
N.z = B.z - A.z

float a = N.x*A.x + N.y*A.y + N.z*A.z;
float b = N.x*B.x + N.y*B.y + N.z*B.z;
float c = N.x*P.x + N.y*P.y + N.z*P.z;

if(c<a) return A;
if(c>b) return B;

float ac = (c-a) / (b-a);

C.x = A.x + N.x *ac;
C.y = A.y + N.y *ac;
C.z = A.z + N.z *ac;

return C;


Vectorialmente

N = B - A;

float a = N.Punto(A);
float b = N.Punto(B);
float c = N.Punto(C);

if(c<a) return A;
if(c>b) return B;

float ac = (c-a) / (b-a);

C = A + N * ac;

return C;



Saludos
Título: Hallar El Punto Más Cercano
Publicado por: marcode en 23 de Marzo de 2006, 03:43:08 PM
  (ole) funciona.