필터 지우기
필터 지우기

How to plot the best fitted ellipse or circle?

조회 수: 13 (최근 30일)
Ashfaq Ahmed
Ashfaq Ahmed 2023년 10월 24일
편집: Matt J 2023년 10월 25일
Hi all,
I have a data set (attached here) that has two arrays. I want to plot them in a polar graph and want to find out the best fitted a) ellipse, and b) circle.
x(:,1) is the x and x(:,2) is the y for the plot.
If anyone can help me out here, I will be very grateful.
xy = load("EllipseData.mat");
x = xy.x(:,1);
y = xy.x(:,2);
plot(x,y,'o')
axis equal
  댓글 수: 5
Ashfaq Ahmed
Ashfaq Ahmed 2023년 10월 25일
편집: Ashfaq Ahmed 2023년 10월 25일
Hi @Image Analyst, the secoond option. It would be if they are plotted in the polarplot first and then creating the ellipsoid.
Image Analyst
Image Analyst 2023년 10월 25일
I see you accepted @Matt J's answer. You can adjust/control the approximate number of points within the ellipse by changing the 0.95 in this line of code:
b=boundary(XY,0.95);

댓글을 달려면 로그인하십시오.

채택된 답변

Matt J
Matt J 2023년 10월 25일
편집: Matt J 2023년 10월 25일
The code below uses ellipsoidalFit() from this FEX download,
Is this the kind of thing you are looking for?
xy=load('EllipseData.mat').x;
p=prunecloud(xy);
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
I=all(~isnan(p.Vertices),2);
e=ellipticalFit(p.Vertices(I,:)');
%Display -- EDITED
XY=e.sample(linspace(0,360,1000));
[t,r]=cart2pol(xy(:,1),xy(:,2));
[T,R]=cart2pol(XY{:});
polarplot(t,r,'ob',T,R,'r-')
function [p,XY]=prunecloud(xy)
for i=1:3
D2=max(pdist2(xy,xy,'euclidean','Smallest', 10),[],1);
xy(D2>0.1,:)=[];
end
XY=xy;
b=boundary(XY,0.95);
p=polyshape(XY(b,:));
end
  댓글 수: 4
Ashfaq Ahmed
Ashfaq Ahmed 2023년 10월 25일
Hi @Matt J, thank you for the suggestion. I can see it is working now. I have a request. Can you please help me plot it on a polar plane?
Matt J
Matt J 2023년 10월 25일
편집: Matt J 2023년 10월 25일
See my edited answer.

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Image Analyst
Image Analyst 2023년 10월 24일

Torsten
Torsten 2023년 10월 24일
편집: Torsten 2023년 10월 24일
  1. Compute the center of gravity of the point cloud. Call it (x',y').
  2. Compute the point of your point cloud with the greatest distance to (x',y'). Call the distance R.
  3. Define the circle that encloses the point cloud by (x-x')^2 + (y-y')^2 = R^2.
  댓글 수: 6
Les Beckham
Les Beckham 2023년 10월 25일
Thanks
Image Analyst
Image Analyst 2023년 10월 25일
I moved @Les Beckham's comment to be an answer.

댓글을 달려면 로그인하십시오.


Les Beckham
Les Beckham 2023년 10월 25일
이동: Image Analyst 2023년 10월 25일
xy = load("EllipseData.mat");
x = xy.x(:,1);
y = xy.x(:,2);
rho = sqrt(x.^2 + y.^2);
theta = atan2(y,x); % <<< use 4 quadrant atan2
polarplot(theta, rho, '.', 'markersize', 3, 'Color', '#aa4488')

카테고리

Help CenterFile Exchange에서 2-D and 3-D Plots에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by