2017-01-31 3 views
0

Je me demande s'il y a un moyen de trouver le point d'intersection entre une ligne et un cercle écrit en coordonnées polaires.Matlab: Point d'intersection entre le cercle et la ligne (coordonnées polaires)

% Line 
x_line = 10 + r * cos(th); 
y_line = 10 + r * sin(th); 
%Circle 
circle_x = circle_r * cos(alpha); 
circle_y = circle_r * sin(alpha); 

Jusqu'à présent, j'ai essayé d'utiliser la fonction intersect(y_line, circle_y) sans succès. Je suis relativement nouveau à MATLAB si nue avec moi.

Répondre

1

Je généralisé le ci-dessous afin que d'autres valeurs que a=10 peuvent ...

a = 10; % constant line offset 
th = 0; % constant angle of line 
% rl = ?? - variable to find 

% Coordinates of line: 
% [xl, yl] = [ a + rl * cos(th), a + rl * sin(th) ]; 

rc = 1; % constant radius of circle 
% alpha = ?? - variable to find 

% Coordinates of circle: 
% [xc, yc] = [ rc * cos(alpha), rc * sin(alpha) ]; 

Nous voulons que l'intersection, donc xl = xc, yl = yc

% a + rl * cos(th) = rc * cos(alpha) 
% a + rl * sin(th) = rc * sin(alpha) 

place des deux côtés des deux équations et les somme. Simplification sin(a)^2 + cos(a)^2 = 1. L'expansion supports et de simplifier donne plus

% rl^2 + 2 * a * rl * (cos(th) + sin(th)) + 2 * a - rc^2 = 0 

Maintenant, vous pouvez utiliser la formule quadratique pour obtenir la valeur de rl.

discriminante Test:

dsc = (2 * a * (cos(th) + sin(th)))^2 - 4 * (2 * a - rc^2); 
rl = []; 
if dsc < 0 
    % no intersection 
elseif dsc == 0 
    % one intersection at 
    rl = - cos(th) - sin(th); 
else 
    % two intersection points 
    rl = -cos(th) - sin(th) + [ sqrt(dsc)/2, -sqrt(dsc)/2]; 
end 

% Get alpha from an earlier equation 
alpha = acos((a + rl .* cos(th)) ./ rc); 

Maintenant vous avez 0, 1 ou 2 points d'intersection de la ligne avec le cercle, de certaines valeurs connues et inconnues sur chaque ligne. Essentiellement ce ne sont que des équations simultanées, voir le début de cet article pour une base de maths https://en.wikipedia.org/wiki/System_of_linear_equations

0

Avez-vous besoin de le faire numériquement? Ce problème aurait une solution analytique simple: Le point (10 + r*cos(th),10 + r*sin(th)) est sur un cercle de rayon R ssi

(10+r*cos(th))^2 + (10+r*sin(th))^2 == R^2

< =>200+r^2 + 2*r*(cos(th)+sin(th)) == R^2

< =>r^2 + 2*r*sqrt(2)*sin(th+pi/4) + 200 - R^2 = 0

qui est une équation quadratique en r. Si le discriminant est positif, il y a deux solutions (correspondant à deux points d'intersection), sinon, il n'y en a pas.

Si vous calculez les maths, la condition pour l'intersection est 100*(sin(2*th)-1)+circle_r^2 >= 0 et les racines sont -10*sqrt(2)*sin(th+pi/4)*[1,1] + sqrt(100*(sin(2*th)-1)+circle_r^2)*[1,-1].

ici est un graphique Matlab, par exemple pour e = pi/3 et circle_r = 15. Les marqueurs de magenta sont calculés en forme fermée en utilisant l'équation ci-dessus.

Matlab plot for circle_r = 15, th = pi/3

+0

me tabassaient les mathématiques! – Wolfie