2016-03-22 2 views
2

Ich habe einen Kreis und partitionieren Sie diesen Kreis in 3 Sektor (120 Winkel jeweils). Im Kreisbereich gibt es einige bekannte Punkte (Koordinaten des Punktes sind bekannt) .Ich möchte wissen, welcher Punkt zu welchem ​​Sektor gehört. Als Output möchte ich den Punkt eines einzelnen Sektors erhalten.Identifizieren Sie die Punkte der verschiedenen Sektor des Kreises mit MATLAB

Ich zeichne den Kreis, teile in Sektor und zeichne einige Punkte. Aber ich konnte nicht feststellen, welcher Punkt zu welchem ​​Sektor gehört. Wie kann ich das bekommen? Wenn jemand Quellcode für diesen Prozess mit MATLAB hat, hilft es mir sehr.

Hier habe ich meine Quellcode

x0 = 2;  % origin x-coordinate 
y0 = 1;  % origin y-coordinate 
r = 1;  % radius of circle 
n = 3;  % number of pieces 

% predefined points -> [x1,x2,xn;y1,y2,yn] 

p = [ 1.5, 2.0, 1.50, 2.4, 1.8, 1.5, 1.7, 2.0, 1.8, 2.5, 2.7, 2.0, 1.3, 1.2, 1.4, 2.2, 1.7, 1.2; 
    0.2, 0.8, 1.20, 1.0, 1.3, 0.8, 1.1, 1.4, 0.7, 0.6, 0.5, 0.4, 1.1, 1.3, 1.5, 1.8, 1.5, 1.1]; 

% calculate circle 

theta = -pi:0.01:pi; 

cirx = r*cos(theta) + x0; 

ciry = r*sin(theta) + y0; 

% initial plot 

figure; 
hold on; 

axis square; 

plot(x0,y0,'or');   % origin 

plot(cirx,ciry);   % circle 

plot(p(1,:),p(2,:),'go'); % predefined points 

% calculate and plot separations 

ciro = linspace(-pi,pi,n+1); 

for k = 1:(numel(ciro)) 

ph(k) = plot([x0,x0+r*cos(ciro(k))],[y0,y0+r*sin(ciro(k))]); 

end 

Antwort

1

Der allgemeine Ansatz enthalten, die Sie sollten nehmen, ist jede kartesischer (x, y) Punkt zu konvertieren in das polare äquivalent ist (rho, theta) mit dem Ursprung (x0, y0) als das Zentrum. Sie können dann den Wert theta verwenden, um zu ermitteln, welchem ​​Sektor er angehört.

% Compute polar coordinates 
[theta, rho] = cart2pol(p(1,:) - x0, p(2,:) - y0); 

% Sector theta values with an extra one at the end for periodicity 
sector_thetas = linspace(-pi,pi,n+1); 

% Identify which sector it falls into by checking theta against one 
% sector and then the next. Should be greater than one and less than the other 
membership = bsxfun(@le, sector_thetas(1:end-1).', theta) & ... 
      bsxfun(@gt, sector_thetas(2:end).', theta); 

% The result is [nRows x nPoints] and each column will contain a 1 in the row 
% corresponding to the sector it belongs to. 

% Get the index of which sector it belongs to 
% This uses the trick here: http://stackoverflow.com/questions/35950922/finding-the-column-index-for-the-1-in-each-row-of-a-matrix/35951036#35951036 
sector = (1:n) * membership; 

Dann, wenn wir die verschiedenen Sektoren zeichnen, können wir sicherstellen, dass sich die Dinge in geeigneter Weise

colors = 'grb'; 

for k = 1:n 
    toplot = sector == k; 
    p(k) = plot(p(1, toplot), p(2, toplot), ... 
       'Color', colors(k), ... 
       'Marker', 'o', ... 
       'DisplayName', sprintf('Sector %d', k)); 
end 

legend(p); 
gruppiert wurden

enter image description here

Wenn Sie die Punkt-Indizes wissen wollen, die innerhalb jeder Gruppe gehören, können Sie könnte folgendes tun.

members = arrayfun(@(x)find(sector == x), 1:n, 'uniform', 0); 
celldisp(members) 

    members{1} = 

     1  2  6  9 12 

    members{2} = 

     4 10 11 

    members{3} = 

     3  5  7  8 13 14 15 16 17 18 
+0

Vielen Dank ... es ist genau das gleiche, das ich will. – Tina

+0

@ Suever, ich habe eine Frage. Wenn ich den Punkt nummerieren möchte. Stellen Sie 1,2, ... 18 vor und wollen Sie als Ausgabesektor 1 = {Punkt 1,2,6,9,12} und Sektor 2 = {Punkt 4,10,11 } und Sektor 3 = {Punkt 3,5, ...}. Welchen Teil des Codes muss ich ändern? Eigentlich möchte ich die Ausgabe so anzeigen. – Tina

+0

@Tina Ich habe meinen Beitrag mit einem Beispiel aktualisiert, wie man das am unteren Rand macht – Suever

Verwandte Themen