Logo

¡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: PogachaN.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.
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.