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.
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;
Si, como dices, conoces la distancia, sólo tienes que sustituir.
DistanciasAl menos usa google antes de ir con tus dudas a los demás.
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
CitarAl menos usa google antes de ir con tus dudas a los demás
Vaya, no crees que ha sonado un poco duro... :blink:
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?.
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
(ole) funciona.