Как нарисовать кривую линию с точками между ней на затененной области, расположенной на поверхности полушария, используя Matlab? - PullRequest
0 голосов
/ 06 марта 2019

Полусфера с заштрихованной областью уже сформирована. Затем планируют сформировать путь или изогнутую линию на затененной области, расположенной на поверхности полушария с точками на ней. Даже не может знать, какова их широта или долгота, чтобы нарисовать дугу, поэтому есть идеи о том, как получить широту и долготу для начальной и конечной точки или сформировать изогнутую линию, как показано на рисунке ниже?

enter image description here

[x,y,z] = sphere;      % Makes a 21-by-21 point sphere
x = x(11:end,:);       % Keep top 11 x points
y = y(11:end,:);       % Keep top 11 y points
z = z(11:end,:);       % Keep top 11 z points
radius = 0.13;
c = [0.36 0 0];
hs = surf(radius.*x + c(1),radius.*y,radius.*z,'FaceColor','yellow','FaceAlpha',.3);  
axis equal
xlabel('X');ylabel('Y');zlabel('Z');

% Putting the ranges for the elevation and azimuth
minAzimuth = 0;
maxAzimuth = 180;
minElevation = 0;
maxElevation = 80;

% Compute angles 
phi = atan2d(y,x);
theta = acosd (z);

% Highlighting logic (Shading the subset of the hemisphere)
ind = (phi >= minAzimuth & phi <= maxAzimuth) & (theta >= minElevation & theta <= maxElevation); % Find those indices
x2 = x; y2 = y; z2 = z;                                                                          % Make a copy of the hemisphere coordinates
x2(~ind) = NaN; y2(~ind) = NaN; z2(~ind)=NaN;                                                    % Set those out of boundary to NaN

hold on;
surf(radius.*x2+c(1),radius.*y2,radius.*z2,'FaceColor','red');     

1 Ответ

0 голосов
/ 07 марта 2019

Используйте сферические координаты:

Как и в случае с вашим сферным сегментом, легче сначала определить вашу линию в сферических координатах, а затем преобразовать в декартову, когда пришло время отображать.Если вы добавите это после своего собственного кода:

% set line parameters
np = 10 ;                % number of points
LineAziStart  =  17 ;    % Starting azimuth
LineAziStop   = 122 ;    % Ending azimuth
LineElevation =  49 ;    % Elevation

% generate spherical coordinates
azp = linspace(deg2rad(LineAziStart),deg2rad(LineAziStop),np).' ;
elp = zeros(np,1) + deg2rad(LineElevation) ;
rp  = zeros(np,1) + radius ;

% convert to cartesian
[xp,yp,zp]=sph2cart(azp,elp,rp) ;

% adjust coordinates for center of the sphere
xp = xp + c(1) ;
yp = yp + c(2) ;
zp = zp + c(3) ;

% display
hp = plot3(xp,yp,zp,'g','LineWidth',2,'Marker','x') ;

Вы получите линию, параллельную заданной широте: enter image description here

Вы можете указать, гделиния начинается, останавливается и поднимается, настраивая первые параметры в верхней части кода (чтобы они соответствовали вашим собственным значениям).


Редактирование: Для объяснения сферической координатыпоколение: чтобы получить линию в 3D, вам нужен набор из 3 координат, они могут быть x/y/z ( декартовой референцией ) или radius/azimuth/elevation ( сферической референцией ).

Ограничения для вашей линии:

  • Азимут: (называемый azp) Должен варьироваться от одного значения к другому.Для этого я использовал утверждение azp = linspace(deg2rad(LineAziStart),deg2rad(LineAziStop),np).' ;.Я рекомендую вам прочитать документацию по функции linspace.Он сгенерирует набор np линейно расположенных точек между LineAziStart и LineAziStop.Я также должен был использовать deg2rad, потому что для сферических координат вы хотите, чтобы ваши углы выражались в радиан .

  • Радиус: (называемый rp) Это легко.Ваша линия должна находиться на поверхности сферы, поэтому все точки линии будут иметь одинаковое значение radius ( радиус исходной сферы. Мы просто генерируем вектор npвсе точки равны радиусу. Это делается с помощью rp = zeros(np,1) + radius;.

  • Высота: (называемый elp) Ваша линия должна быть параллельна широте,поэтому высота также постоянна для всех точек линии.Как и с радиусом, мы генерируем множество постоянных точек одинаково: elp = zeros(np,1) + deg2rad(LineElevation) ;.

К тому времени у вас есть набор из 3 векторов (rp/azp/elp), которые имеют одинаковое количество значений и вместе определяют набор точек в трехмерном пространстве в сферических координатах. Для функции построения графиков Matlab требуются декартовы координаты, поэтому последнийшаг - просто преобразовать этот набор координат. Это делается с помощью функции sph2cart, которая преобразует rp/azp/elp в xp/yp/zp. Сферические координаты, которые мы сгенерировали, были центрированы в начале координат (точка 0,0,0,), поэтому конвекЗдесь также есть координаты декартовых координат.Последний шаг - просто перевести эти координаты, чтобы они были центрированы в той же точке / центре, что и сфера.После этого ваши координаты готовы к построению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...