Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Hallar El Punto Más Cercano

Iniciado por marcode, 23 de Marzo de 2006, 12:00:23 PM

« anterior - próximo »

marcode

 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.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

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;

Repoker

 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.

Pogacha

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

MrSickman

 
CitarAl menos usa google antes de ir con tus dudas a los demás
Vaya, no crees que ha sonado un poco duro...  :blink:  
a href='http://gpufever.blogspot.com/' target='_blank'>GPUFever blog

marcode

 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?.


size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Pogacha

 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

marcode

size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.