Line and Cylinder intersection
    10 views (last 30 days)
  
       Show older comments
    
I have an expression for a "line- to sphere intersection" that works:
 a = 1 + Ax^2 + Ay^2
 b = 2*(-zs + Ax*(Bx-xs) + Ay*(By-ys))
 c = zs^2 + (Bx-xs)^2 + (By - ys)^2 - R^2
This is part of a code in Matlab, and works fine. It is derived from substituting
(x=Ax*z+Bx, y=Ay*z+By) into:
((x-xs)^2+(y-ys)^2+(z-zs)^2 = R
I am now trying to do the same for a cylinder, by substituting(x=Ax*z+Bx, y=Ay*z+By) into: (x-xs)^2+(y-ys)^2 = R
Ending up with:
 a = Ax^2+Ay^2;
 b = 2*Ax*Bx - 2*Ax*xs + 2*Ay*By - 2*Ay*ys;
 c = -2*Bx*xs - 2*By*ys + Bx^2 + By^2 + xs^2+ys^2 - R^2;
This doesn't seem to work. Can anyone tell me if something seems off with the math or logic?
This is the equations I used for the line:
x=Ax*z+Bx, y=Ay*z+By (I solved for z)
This is basically the .m-file that make up the intersection(sphere):
function [r1v,a2v] = lens_vec(s1,r1,a1v,r0v,v1,v2,direk,mirror_skew)
%Find intersection and refraction:
% s1 - sphere center (z-value)
% r1 - sphere radius
% a1v - unit vector defining direction of ray
% r0v - starting point of ray
% v1 - speed of sound, material 1
% v2 - speed of sound, material 2
% direk - choose croosing, direk==0 to the right of s1, direk==1, to the
% left of s1
xs = 0.0000; ys=mirror_skew; zs=s1; % center of sphere
R = r1; % radius of sphere
%.......Define parameters for x and y coordinate of straight line (Ax,Bx),
%.......(Ay, By)
 if a1v(1) ~= 0
   Ax = a1v(1)/a1v(3); 
 else 
   Ax = 0; 
 end
 if a1v(2) ~= 0
   Ay = a1v(2)/a1v(3);
 else
   Ay = 0; 
 end
Bx = r0v(1)- Ax*r0v(3);
By = r0v(2)- Ay*r0v(3);
% Intersection straight line and sphere:
a = 1 + Ax^2 + Ay^2;
b = 2*(-zs + Ax*(Bx-xs) + Ay*(By-ys));
c = zs^2 + (Bx-xs)^2 + (By - ys)^2 - R^2;
z1 = (-b + sqrt(b^2 - 4*a*c))/(2*a); x1 = Ax*z1+Bx; y1 = Ay*z1+By;
z2 = (-b - sqrt(b^2 - 4*a*c))/(2*a); x2 = Ax*z2+Bx; y2 = Ay*z2+By;
% (After this comes a section on Snell's law and refraction code)
So basically, I just need a set of expressions that does the job for a cylinder instead of a sphere. At least, this is what I'm thinking. I am not sure if this will work.
Any comments at all would be greatly appreciated!
0 Comments
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!