2016-04-30 7 views
4

Я пытаюсь сделать серф сюжет, который выглядит как:Matlab - Вычитание двух 3D фигуры с серфинга и минимальной функции

enter image description here

До сих пор у меня есть:

x = [-1:1/100:1]; 
y = [-1:1/100:1]; 

[X,Y] = meshgrid(x,y); 

Triangle1 = -abs(X) + 1.5; 
Triangle2 = -abs(Y) + 1.5; 

Z = min(Triangle1, Triangle2); 

surf(X,Y,Z); 
shading flat 
colormap winter; 
hold on; 

[X,Y,Z] = sphere(); 
Sphere = surf(X, Y, Z + 1.5);% sphere with radius 1 centred at (0,0,1.5) 
hold off; 

Этот код производит график, который выглядит следующим образом:

enter image description here

  • Пирамида с квадратным основанием ([-1,1] x [-1,1]) и вершина на высоте c = 1,5 над началом координат (0,0).

  • Вершина пирамиды выдолблена путем удаления ее части, которая попадает в сферу радиуса r = 1, центрированную в вершине.

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

Я буду использовать углы обзора 70 (азимут) и 35 (высота). И убедитесь, что оси правильно масштабированы (как показано). Я буду использовать опцию AXIS TIGHT, чтобы получить правильные размеры после удаления соответствующей поверхности сферы.

+0

Это действительно вызов, чтобы сделать в MATLAB, это не правильный инструмент для такого рода геометрии композиции. Не сказать, что это невозможно, но нет примитивов, чтобы помочь вам это сделать. Вы должны написать код, чтобы выполнить все вычисления, чтобы определить точки пересечения и соответствующим образом обработать их, чтобы получить поверхность. Не для слабонервных. – Cyb3rFly3r

+0

Может быть альтернативный способ создания сюжета, который вы показали, но я не уверен, подходит ли вам этот метод. Вы можете использовать уравнения для плоских поверхностей/сферы для определения значений явных точек в виде 'z = f (x, y)'. Затем вы можете использовать 'meshgrid' для генерации данных для сюжета' surf', который должен создать сюжет, который вы показали. Если решение подходит для вас, я могу создать код - сообщите мне. – user1391279

ответ

1

Вот мое скромное предложение:

N = 400; % resolution 
x = linspace(-1,1,N); 
y = linspace(-1,1,N); 
[X,Y] = meshgrid(x,y); 
Triangle1 = -abs(X)+1.5 ; 
Triangle2 = -abs(Y)+1.5 ; 
Z = min(Triangle1, Triangle2); 
Trig = alphaShape(X(:),Y(:),Z(:),2); 
[Xs,Ys,Zs] = sphere(N-1); 
Sphere = alphaShape(Xs(:),Ys(:),Zs(:)+2,2); 
% get all the points from the pyramid that are within the sphere: 
inSphere = inShape(Sphere,X(:),Y(:),Z(:)); 
Zt = Z; 
Zt(inSphere) = nan; % remove the points in the sphere 
surf(X,Y,Zt) 
shading interp 
view(70,35) 
axis tight 

Я использую alphaShape объект, чтобы удалить все нежелательные точки от пирамиды, а затем построить его без них:

enter image description here

Я знаю, это не отлично, поскольку вы не видите низу круга внутри пирамиды, но все мои попытки достичь этого потерпели неудачу. Моя основная идея построения их вместе, как это:

hold on; 
Zc = Zs; 
inTrig = inShape(Trig,Xs(:),Ys(:),Zs(:)+1.5); 
Zc(~inTrig) = nan; 
surf(Xs,Ys,Zc+1.5) 
hold off 

Но результат не так хорошо, как вы не можете действительно увидеть круг внутри пирамиды.

В любом случае, я размещаю это здесь, так как он может дать вам направление для работы.

1

Альтернатива методу EBH.

Общий алгоритм вычитания двух фигур в 3d затруднен в MATLAB. Если вместо того, чтобы вы помните, что уравнение для сферы с радиусом r с центром в (x0,y0,z0) является

r^2 = (x-x0)^2 + (y-y0)^2 + (z-z0)^2 

Тогда решение для z дает z = z0 +/- sqrt(r^2-(x-x0)^2-(y-y0)^2) где использование + перед квадратным корнем дает верхнюю часть сферы и - дает основание , В этом случае нас интересует только дно сферы. Чтобы получить конечную поверхность, мы просто берем минимум z между пирамидой и полусферой.

Обратите внимание, что область полусферы определяется заполненным кружком r^2-(x-x0)^2-(y-y0)^2 >= 0. Мы определяем любые члены вне области как бесконечность, чтобы их игнорировать при принятии минимума.

N = 400; % resolution 
z0 = 1.5; % sphere z offset 
r = 1;  % sphere radius 
x = linspace(-1,1,N); 
y = linspace(-1,1,N); 
[X,Y] = meshgrid(x,y); 
% pyramid 
Triangle1 = -abs(X)+1.5 ; 
Triangle2 = -abs(Y)+1.5 ; 
Pyramid = min(Triangle1, Triangle2);  
% half-sphere (hemisphere) 
sqrt_term = r^2 - X.^2 - Y.^2; 
HalfSphere = -sqrt(sqrt_term) + z0; 
HalfSphere(sqrt_term < 0) = inf; 
Z = min(HalfSphere, Pyramid); 
surf(X,Y,Z) 
shading interp 
view(70,35) 
axis tight 

enter image description here

+0

Ницца! Это определенно правильное направление для этой конкретной проблемы, с простыми геометрическими формами. – EBH

+0

@EBH Надеюсь, я не подорвал год напряженной работы над этим вопросом! – jodag

+0

А год ?! больше похоже на час ... и я знал о вашей идее, но действительно хотел решить это более «общим» способом, который может обрабатывать любое облако точек. – EBH