]> Creatis software - CreaPhase.git/blob - octave_packages/geometry-1.5.0/geom2d/intersectLineCircle.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / geometry-1.5.0 / geom2d / intersectLineCircle.m
1 %% Copyright (c) 2011, INRA
2 %% 2011, David Legland <david.legland@grignon.inra.fr>
3 %% 2011 Adapted to Octave by Juan Pablo Carbajal <carbajal@ifi.uzh.ch>
4 %%
5 %% All rights reserved.
6 %% (simplified BSD License)
7 %%
8 %% Redistribution and use in source and binary forms, with or without
9 %% modification, are permitted provided that the following conditions are met:
10 %%
11 %% 1. Redistributions of source code must retain the above copyright notice, this
12 %%    list of conditions and the following disclaimer.
13 %%     
14 %% 2. Redistributions in binary form must reproduce the above copyright notice, 
15 %%    this list of conditions and the following disclaimer in the documentation
16 %%    and/or other materials provided with the distribution.
17 %%
18 %% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 %% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 %% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 %% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 %% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
23 %% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 %% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
25 %% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 %% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 %% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 %% POSSIBILITY OF SUCH DAMAGE.
29 %%
30 %% The views and conclusions contained in the software and documentation are
31 %% those of the authors and should not be interpreted as representing official
32 %% policies, either expressed or implied, of copyright holder.
33
34 %% -*- texinfo -*-
35 %% @deftypefn {Function File} {@var{points} = } intersectLineCircle (@var{line}, @var{circle})
36 %% Intersection point(s) of a line and a circle
37 %%
38 %%   INTERS = intersectLineCircle(LINE, CIRCLE);
39 %%   Returns a 2-by-2 array, containing on each row the coordinates of an
40 %%   intersection point. If the line and circle do not intersect, the result
41 %%   is filled with NaN.
42 %%
43 %%   Example
44 %%   % base point
45 %%   center = [10 0];
46 %%   % create vertical line
47 %%   l1 = [center 0 1];
48 %%   % circle
49 %%   c1 = [center 5];
50 %%   pts = intersectLineCircle(l1, c1)
51 %%   pts = 
52 %%       10   -5
53 %%       10    5
54 %%   % draw the result
55 %%   figure; clf; hold on;
56 %%   axis([0 20 -10 10]);
57 %%   drawLine(l1);
58 %%   drawCircle(c1);
59 %%   drawPoint(pts, 'rx');
60 %%   axis equal;
61 %%
62 %%   @seealso{lines2d, circles2d, intersectLines, intersectCircles}
63 %% @end deftypefn
64
65 function points = intersectLineCircle(line, circle)
66
67   % local precision
68   eps = 1e-14;
69
70   % center parameters
71   center = circle(:, 1:2);
72   radius = circle(:, 3);
73
74   % line parameters
75   dp = line(:, 1:2) - center;
76   vl = line(:, 3:4);
77
78   % coefficient of second order equation
79   a = sum(line(:, 3:4).^2, 2);
80   b = 2*sum(dp .* vl, 2);
81   c =  sum(dp.^2, 2) - radius.^2;
82
83   % discriminant
84   delta = b .^ 2 - 4 * a .* c;
85
86   if delta > eps
87       % find two roots of second order equation
88       u1 = (-b - sqrt(delta)) / 2 ./ a;
89       u2 = (-b + sqrt(delta)) / 2 ./ a;
90       
91       % convert into 2D coordinate
92       points = [line(1:2) + u1 * line(3:4) ; line(1:2) + u2 * line(3:4)];
93
94   elseif abs(delta) < eps
95       % find unique root, and convert to 2D coord.
96       u = -b / 2 ./ a;    
97       points = line(1:2) + u*line(3:4);
98       
99   else
100       % fill with NaN
101       points = NaN * ones(2, 2);
102       return;
103   end
104
105 endfunction
106