2016-04-19 9 views
0

Es gibt bestimmte Punkte auf einer Einheitskugel und ich möchte sie glatt entlang der Kugel glatt verbinden, wie kann ich es in MATLAB tun, denn wenn ich es mit 3Dplot-Funktion in Matlab mache, verbindet es einfach den Punkt mit geraden Linien.Wie erstellt man in MATLAB eine nahtlos zusammenhängende Zeichnung auf einer Kugel?

zum Beispiel gibt es einen Punkt im ersten Quadranten und den zweiten Punkt im 8. Quadranten, dann verbinden sie sich mit einer geraden Linie. ohne einem gekrümmten Pfad zu folgen.

Dies sind die Werte von theta:

theta = [ 80.0000 73.2995 65.7601 95.5007 100.4861 97.8834 94.0849  52.5174 74.4710 104.6674 52.7177 97.0538 75.7018 83.2817 97.5423 85.1797 84.2677 126.2296 81.1814 66.1376 91.6953 167.7085 46.5980 87.8220 113.4588 180.0000 80.7624 95.8623 115.0538 76.5773 61.9858 141.0402 109.9872 76.1273 84.4166 75.2734 110.4489 82.2434 96.8303 100.0815 73.2454 82.0755 64.6457 76.3510 87.7863 133.2706 86.1305 76.8670 86.3225 96.8016 49.2653 107.2900 145.9905 59.2158 107.7546 180.0000 93.9687 87.5474 103.1400 180.0000 136.8251 180.0000 106.2629 109.0069 ]; 

und die Werte von phi sind:

phi = [ -90.0000 -78.5230 -51.6764 84.6854 58.1182 -75.9705 78.0541 -60.0560 88.8935 -84.6539 -44.1415 -86.7643 61.7764 -87.4767 -86.9440 -80.2459 -76.8752 88.9510 64.7297 -51.1245 -83.1606 -88.7280 -32.7110 81.0951 86.8393 -0.0000 52.6243 -88.7833 -75.4600 84.1374 79.8300 -86.7258 -65.8055 80.9829 -89.3172 57.1802 -80.6346 72.5277 -87.4452 74.2778 -86.1069 76.6124 -80.4604 89.2202 85.0649 89.2164 -79.0290 84.9961 -88.2301 -87.5064 50.4016 83.0830 82.4863 -50.8481 87.0335 -0.0000 88.4613 79.7583 -80.6474 -0.0000 80.0771 -0.0000 89.2428 -82.769 ]; 

diese leicht

+1

Wie dies von unterscheidet [Ihre letzte Frage] (http://stackoverflow.com/questions/36461846/how-to-plot-this-data)? – excaza

+0

die Antworten waren nicht angemessen – Boris

+0

@Boris Wenn sie nicht angemessen waren, dann aktualisieren Sie möglicherweise die Frage, um es zu verbessern oder auf eine bessere Antwort zu warten. Wenn Sie es aktualisieren, wird es wieder oben in der Warteschlange angezeigt und mehr Personen sehen es. Sie müssen keine doppelte Frage erstellen. – Suever

Antwort

3

poltted werden kann Wenn Sie MATLAB entlang der Einheit darstellen möchten In diesem Fall müssen Sie alle dazwischen liegenden Punkte angeben, da MATLAB nur Punkte mit einer geraden Linie verbindet.

Dazu können wir Roger Stafford's great solution auf MATLAB central anpassen, um den kürzesten Großkreis zwischen zwei aufeinanderfolgenden Punkten zu zeichnen.

Mit der folgenden Funktion können wir genau das tun. Wir werden den kürzesten Großkreisweg zwischen zwei aufeinanderfolgenden Punkten bestimmen und dann interpolieren zwischen ihnen die Linie auf dem Einheitskreis

function plotOnSphere(x,y,z,varargin) 

    %// Vectors representing each point 
    xyz = [x(:), y(:), z(:)].'; %' 

    %// One vector of the "first" points and one of the "next" points 
    v1 = xyz(:, 1:end-1); 
    v2 = xyz(:, 2:end); 

    %// Cross product between the vectors of one point and the next 
    cv1v2 = cross(v1, v2); 

    %// Compute unit vector in the plane defined by v1 and v2 
    v3 = normc(cross(cv1v2, v1)); 

    %// Figure out the range of the inner angle between v1 and v2 
    nc = sqrt(sum(cv1v2.^2, 1)); 
    t = atan2(nc, dot(v1, v2, 1)); 

    %// Number of points to sample between any two points on the sphere 
    nPoints = 100; 

    %// Compute the interpolant 
    V = zeros([nPoints, fliplr(size(v1))]); 
    for k = 1:numel(t) 
     T = linspace(0, t(k), 100); 
     V(:,k,:) = (v1(:,k) * cos(T) + v3(:,k) * sin(T)).'; %' 
    end 

    %// Break the result out into x,y,z parts 
    xx = V(:,:,1); 
    yy = V(:,:,2); 
    zz = V(:,:,3); 

    %// Plot the lines 
    h = plot3(xx(:), yy(:), zz(:), varargin{:}); 
    hold on 

    %// Plot the original data points 
    plot3(x,y,z, 'o', ... 
     'Color', get(h, 'Color'), ... 
     'Parent', get(h, 'Parent'), varargin{:}); 
end 

zu ziehen Wenn wir die Eingangsdaten anwenden, die Sie zur Verfügung gestellt haben.

theta = [ 80.0000 73.2995 65.7601 95.5007 100.4861 97.8834 94.0849  52.5174 74.4710 104.6674 52.7177 97.0538 75.7018 83.2817 97.5423 85.1797 84.2677 126.2296 81.1814 66.1376 91.6953 167.7085 46.5980 87.8220 113.4588 180.0000 80.7624 95.8623 115.0538 76.5773 61.9858 141.0402 109.9872 76.1273 84.4166 75.2734 110.4489 82.2434 96.8303 100.0815 73.2454 82.0755 64.6457 76.3510 87.7863 133.2706 86.1305 76.8670 86.3225 96.8016 49.2653 107.2900 145.9905 59.2158 107.7546 180.0000 93.9687 87.5474 103.1400 180.0000 136.8251 180.0000 106.2629 109.0069 ]; 
phi = [ -90.0000 -78.5230 -51.6764 84.6854 58.1182 -75.9705 78.0541 -60.0560 88.8935 -84.6539 -44.1415 -86.7643 61.7764 -87.4767 -86.9440 -80.2459 -76.8752 88.9510 64.7297 -51.1245 -83.1606 -88.7280 -32.7110 81.0951 86.8393 -0.0000 52.6243 -88.7833 -75.4600 84.1374 79.8300 -86.7258 -65.8055 80.9829 -89.3172 57.1802 -80.6346 72.5277 -87.4452 74.2778 -86.1069 76.6124 -80.4604 89.2202 85.0649 89.2164 -79.0290 84.9961 -88.2301 -87.5064 50.4016 83.0830 82.4863 -50.8481 87.0335 -0.0000 88.4613 79.7583 -80.6474 -0.0000 80.0771 -0.0000 89.2428 -82.769 ]; 

%// Convert to cartesian coordinates 
[x,y,z] = sph2cart(deg2rad(theta), deg2rad(phi), 1); 

figure; 
plotOnSurface(x,y,z); 

%// Plot a unit sphere for reference 
sphere() 
s = findall(gca, 'type', 'surf'); 
set(s, 'FaceColor', 'k', 'FaceAlpha', 0.01, 'EdgeAlpha', 0.1) 

enter image description here

+0

vielen Dank habe ich über die Werte von Theta und Phi gegeben – Boris

+0

@Boris Ich habe Ihnen eine Funktion und Beispiel gegeben, haben Sie versucht, sie selbst plotten? – Suever

+0

@Boris Die Antwort wird aktualisiert. – Suever

Verwandte Themen