MATLAB: Optimizing this script without using symbolic toolbox

script optimize sym symbolic toolbox intersection circle line

Hi guys, this is the script which takes up all the time
function [t_sol,xi,yi] = solveIntersection(px,py,rx,ry,r)
syms t
x = px + t*rx;
y = py + t*ry;
c = x^2+y^2-r^2;
t_sol = max(double(solve(c)));
xi = double(subs(x,'t',t_sol));
yi = double(subs(y,'t',t_sol));
This script calculates the intersection of a circle and a given vektor. How do i calculate the intersection without using the symbolic toolbox? Or just how can I optimize this function?
The vector starts in (px,py) and has a direction (rx,ry). r is the radius of the circle.

Best Answer

If you run this code
syms t px py rx ry r
x = px + t*rx;
y = py + t*ry;
c = expand(x^2+y^2-r^2);
c = collect(c,t)
solve(c,t)
you'll get explicit equations for the two solutions for t. These can be put in the function:
function [t,xi,yi] = solveIntersectionNum(px,py,rx,ry,r)
t = [-(px*rx + py*ry + (- px^2*ry^2 + 2*px*py*rx*ry - py^2*rx^2 + r^2*rx^2 + r^2*ry^2)^(1/2))/(rx^2 + ry^2)
-(px*rx + py*ry - (- px^2*ry^2 + 2*px*py*rx*ry - py^2*rx^2 + r^2*rx^2 + r^2*ry^2)^(1/2))/(rx^2 + ry^2)];
xi = px + t*rx;
yi = py + t*ry;
It's about 100 times faster.