Finding point of intersection between a line and a sphere

29 visualizaciones (últimos 30 días)
André C. D.
André C. D. el 6 de Jun. de 2019
Respondida: Jason Der el 30 de Jul. de 2021
Hello all,
I have a MATLAB code that plots a 3D sphere using:
[xs,ys,zs] = sphere(10);
surface = surf(350*zs+1000,350*ys,350*xs);
I also have a line that represents the normal between three points (labeled P0, P1, P2) on a plane, which is plotted from the middle-point between all three points:
P0 = [tz1,ty1,tx1]; P1 = [tz2,ty2,tx2]; P2 = [tz3,ty3,tx3]; %represent a triangle
Pm = mean([P0;P1;P2]); %represents the midpoint between P0, P1 and P2
normal = cross(P0-P1,P0-P2);
cn = normal + Pm;
normal_vector = plot3([Pm(1) cn(1)],[Pm(2) cn(2)],[Pm(3) cn(3)],'k--'); %normal
What I am trying to do is find the coordinates of the point of intersection between the line "normal_vector" and the sphere "surface".
This is what the plot looks like:
untitled.jpg
The points P0, P1 and P2 are shown as coloured circles and are always inside the sphere, so their normal is always showing 'outwards' through the surface of the sphere.
Thank you in advance!

Respuesta aceptada

Torsten
Torsten el 6 de Jun. de 2019
Editada: Torsten el 6 de Jun. de 2019
Sphere:
(x-xs)^2 + (y-ys)^2 + (z-zs)^2 = R^2
Line:
[x y z] = Pm + l*normal
Thus
(Pm(1)+l*normal(1)-xs)^2 + (Pm(2)+l*normal(2)-ys)^2 + (Pm(3)+l*normal(3)-zs)^2 = R^2
Solve for (the positive) l.
  7 comentarios
Torsten
Torsten el 7 de Jun. de 2019
Ah, I thought (xs,ys,zs) is the center of the sphere.
You have to solve
sol = solve((Pm1+(l*normal1) - xc)^2 + (Pm2+(l*normal2) - yc)^2 + (Pm3+(l*normal3) - zc)^2 == R^2,l)
where (xc,yc,zc) is the center of the sphere.
André C. D.
André C. D. el 7 de Jun. de 2019
Ahh thank you so much, now it works perfectly!

Iniciar sesión para comentar.

Más respuestas (2)

EVELYN ROSSANA PARRA LOPEZ
EVELYN ROSSANA PARRA LOPEZ el 14 de Oct. de 2019
The last line of code is summarized in replacing the terms x, y and z of the parametric equation of a line in space, in the equation that describes a sphere, and the variable to be found is the parameter, in this case l. I apply the same with a sphere and a known line, but the answer is as follows:
CODE LINES:
syms t
sol=solve((0.2118+t*0.8473-1).^2+(0.06883+t*0.2754-0.5).^2+(0.1135+t*0.4541-0.5).^2==((0.25).^2),t)
RESULT:
sol=
240523932/249992315 - (10^(1/2)*3160661400392057^(1/2))/999969260
(10^(1/2)*3160661400392057^(1/2))/999969260 + 240523932/249992315

Jason Der
Jason Der el 30 de Jul. de 2021
The accepted answer works, but I wasn't able to find a way to vectorize it for a large dataset.
However, I did read an elegant solution on eng-tips at the following url:
Hope this helps someone one day.

Categorías

Más información sobre Surface and Mesh Plots en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by