Intersection between line and circle when line ends inside circle (using geom2d)

I have a circle and a line drawn like so...
Image 1.png
Using the createLine function in the geom2d collection, the line is treated like this (i.e. continuous)...
Image 2.png
Therefore, when finding the intersection points between the line and the circle, two points are returned instead of one.
How can I solve this problem of showing an extra incorrect point, and is there a workaround you could suggest, either using geom2d or otherwise?
Many thanks.

8 件のコメント

darova
darova 2019 年 11 月 20 日
Use polyxpoly or intersections
John D
John D 2019 年 11 月 20 日
Would these be suitable?
polyxpoly is used for mapping and intersections is used for curves.
darova
darova 2019 年 11 月 20 日
Yes it will
John D
John D 2019 年 11 月 21 日
Looking at polyxpoly, would you be able to tell me how to input a circle into the function, as the example provided in the documentation uses longitude and latitude?
Many thanks for your help.
darova
darova 2019 年 11 月 21 日
Provide experimental data
John D
John D 2019 年 11 月 21 日
Position of line:
0.1947 0.4388
0.5173 0.5933
Center point of circle:
0.4850 0.6239
Radius of circle:
0.2035
darova
darova 2019 年 11 月 21 日
編集済み: darova 2019 年 11 月 21 日
% Position of line:
x1 = [0.1947
0.5173];
y1 = [0.4388
0.5933];
% Center point of circle:
x0 = 0.4850;
y0 = 0.6239;
% Radius of circle:
r = 0.2035;
t = linspace(0,2*pi,30);
x2 = r*cos(t) + x0;
y2 = r*sin(t) + y0;
[xc,yc] = polyxpoly(x1,y1,x2,y2)
Adam Danz
Adam Danz 2019 年 11 月 21 日
To demonstrate both methods,
% Define circle
ang=0:0.1:2*pi;
xyr = [5 2 4]; %(xCenter,yCenter,radius)
xp=xyr(:,3)*cos(ang) + repmat(xyr(:,1),1,numel(ang)); %changed 190901 to work with r2016a
yp=xyr(:,3)*sin(ang) + repmat(xyr(:,2),1,numel(ang));
% Define line endpoints
xln = [1 6];
yln = [-1 1];
% plot it
clf()
plot(xp,yp,'k-') %circle
axis equal; grid on; hold on
plot(xln,yln,'b-') %line
% Method 1 uses this FEX:
% https://www.mathworks.com/matlabcentral/fileexchange/11837-fast-and-robust-curve-intersections
[x0,y0] = intersections(xp,yp,xln,yln);
plot(x0,y0,'r*','MarkerSize',9,'LineWidth',2) %intersection point(s)
% Method 2
[xi,yi] = polyxpoly(xp,yp,xln,yln);
plot(xi,yi,'gh','MarkerSize',15,'LineWidth',2) %intersection point(s)
191121 093624-Figure 1.png
Someone should copy their comment to the answers section so it can be accepted.

サインインしてコメントする。

 採用された回答

darova
darova 2019 年 11 月 21 日
  • Someone should copy their comment to the answers section so it can be accepted.
It should be me
% Position of line:
x1 = [0.1947
0.5173];
y1 = [0.4388
0.5933];
% Center point of circle:
x0 = 0.4850;
y0 = 0.6239;
% Radius of circle:
r = 0.2035;
t = linspace(0,2*pi,30);
x2 = r*cos(t) + x0;
y2 = r*sin(t) + y0;
[xc,yc] = polyxpoly(x1,y1,x2,y2)

3 件のコメント

John D
John D 2019 年 11 月 21 日
編集済み: John D 2019 年 11 月 21 日
Thanks for demonstrating it.
Adam Danz
Adam Danz 2019 年 11 月 21 日
編集済み: Adam Danz 2019 年 11 月 21 日
2 Changes you need to make.
1) you're not extracting the x and y coordinates of the line correctly.
% x1 = [h.Position(1) h.Position(3)]; wrong
% y1 = [h.Position(2) h.Position(4)]; wrong
x1 = h.Position(:,1);
y1 = h.Position(:,2);
2) This one is minor. As long as your ROI line and circle objects are still on the plot, new lines will be plotted under them. If you mark the intersection with a small marker, you won't see it.
% solution one: make the marker large
plot(xc, yc, 'ro','markersize',12)
% solution two: remove the cirlce ROI object and replace it with your
% computed circle
delete(c)
hold on
plot(x2,y2,'b-', 'LineWidth',4)
% Plot intersection point on top
plot(xc, yc, 'ro')
John D
John D 2019 年 11 月 21 日
Thanks, I realised this after I posted it!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeGeographic Plots についてさらに検索

製品

リリース

R2019a

質問済み:

2019 年 11 月 20 日

コメント済み:

2019 年 11 月 21 日

Community Treasure Hunt

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

Start Hunting!

Translated by