2016-11-10 2 views
3

Кажется, этот вопрос задан в нескольких местах (including on SO). Я недавно столкнулся с необходимостью этого при визуализации результатов проблемы trilateration.Как визуализировать пересечение сфер в MATLAB?

Практически в каждом случае ответ направляет запрос, чтобы посмотреть Wolfram for the math, но исключает любой код. Математика действительно отличная рекомендация, но если я задаю вопрос о программировании, некоторый код также может помочь. (Разумеется, также оценивается, когда ответы на вопрос кода избегают содержательных комментариев, таких как «писать код тривиально»).

Как можно визуализировать пересечение сфер в MATLAB? У меня есть простое решение ниже.

ответ

4

Я написал небольшой сценарий, чтобы сделать именно это. Не стесняйтесь делать предложения и изменения. Это работает, проверяя, покрывает ли поверхность каждой сферы объем всех других сфер.

Для пересечения сферы лучше (но медленнее) использовать большее число лиц в вызове функции sphere(). Это должно привести к более плотным результатам визуализации. Для визуализации сферы в отдельности должно быть достаточно меньшее число (~ 50). См. Комментарии о том, как визуализировать каждый.

close all 
clear 
clc 

% centers : 3 x N matrix of [X;Y;Z] coordinates 
% dist  : 1 x N vector of sphere radii 

%% Plot spheres (fewer faces) 
figure, hold on % One figure to rule them all 
[x,y,z] = sphere(50); % 50x50-face sphere 
for i = 1 : size(centers,2) 
    h = surfl(dist(i) * x + centers(1,i), dist(i) * y + centers(2,i), dist(i) * z + centers(3,i)); 
    set(h, 'FaceAlpha', 0.15) 
    shading interp 
end 

%% Plot intersection (more faces) 
% Create a 1000x1000-face sphere (bigger number = better visualization) 
[x,y,z] = sphere(1000); 

% Allocate space 
xt = zeros([size(x), size(centers,2)]); 
yt = zeros([size(y), size(centers,2)]); 
zt = zeros([size(z), size(centers,2)]); 
xm = zeros([size(x), size(centers,2), size(centers,2)]); 
ym = zeros([size(y), size(centers,2), size(centers,2)]); 
zm = zeros([size(z), size(centers,2), size(centers,2)]); 

% Calculate each sphere 
for i = 1 : size(centers, 2) 
    xt(:,:,i) = dist(i) * x + centers(1,i); 
    yt(:,:,i) = dist(i) * y + centers(2,i); 
    zt(:,:,i) = dist(i) * z + centers(3,i); 
end 

% Determine whether the points of each sphere fall within another sphere 
% Returns booleans 
for i = 1 : size(centers, 2) 
    [xm(:,:,:,i), ym(:,:,:,i), zm(:,:,:,i)] = insphere(xt, yt, zt, centers(1,i), centers(2,i), centers(3,i), dist(i)+0.001); 
end 

% Exclude values of x,y,z that don't fall in every sphere 
xmsum = sum(xm,4); 
ymsum = sum(ym,4); 
zmsum = sum(zm,4); 
xt(xmsum < size(centers,2)) = 0; 
yt(ymsum < size(centers,2)) = 0; 
zt(zmsum < size(centers,2)) = 0; 

% Plot intersection 
for i = 1 : size(centers,2) 
    xp = xt(:,:,i); 
    yp = yt(:,:,i); 
    zp = zt(:,:,i); 
    zp(~(xp & yp & zp)) = NaN; 
    surf(xt(:,:,i), yt(:,:,i), zp, 'EdgeColor', 'none'); 
end 

и вот insphere функция

function [x_new,y_new,z_new] = insphere(x,y,z, x0, y0, z0, r) 
    x_new = (x - x0).^2 + (y - y0).^2 + (z - z0).^2 <= r^2; 
    y_new = (x - x0).^2 + (y - y0).^2 + (z - z0).^2 <= r^2; 
    z_new = (x - x0).^2 + (y - y0).^2 + (z - z0).^2 <= r^2; 
end 

Примеры визуализации

Для 6 сфер, используемых в этих примерах, потребовалось в среднем на 1,934 секунды, чтобы запустить комбинированная визуализация на моем ноутбуке.

Пересечение 6 сфер: Intersection of 6 spheres

Фактические 6 сфер: not intersection

Ниже, я объединил два, так что вы можете увидеть пересечение с точки зрения сфер. both

Для этих примеров:

centers = 

    -0.0065 -0.3383 -0.1738 -0.2513 -0.2268 -0.3115 
    1.6521 -5.7721 -1.7783 -3.5578 -2.9894 -5.1412 
    1.2947 -0.2749 0.6781 0.2438 0.4235 -0.1483 

dist = 

    5.8871 2.5280 2.7109 1.6833 1.9164 2.1231 

Я надеюсь, что это помогает кому-либо еще, кто может желание визуализировать этот эффект.

+0

Очень круто. Спасибо, что поделился. – rayryeng

+0

Я бы сказал, что ваша визуализация нарушена из-за «удаления» точек слишком строга, и вы не учитываете небольшие числовые ошибки. Остальное поразительно. –

+0

@AnderBiguri: Что вы имеете в виду, если удаление слишком строгих точек? Не могли бы вы объяснить дальше? Разумеется, этот код требует плотно отобранных сфер, чтобы получить хорошую визуализацию. В противном случае вы правы, очки могут быть опущены. – marcman

 Смежные вопросы

  • Нет связанных вопросов^_^