Как получить данные среза на пересечении двух поверхностей в MatLab - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть данные потока в массиве NxMxP, и я хотел бы найти значения данных на пересечении двух поверхностей.Сейчас я работаю с плоскостью и цилиндром, но в будущем я хотел бы использовать другие формы и найти данные о пересекающейся дуге, если это возможно.

Ниже приведено изображение плоскостии цилиндр, вместе с моим кодом, чтобы сделать их.Красная линия - это пересечение, на котором я хотел бы получить данные.

AR = 5;    R = 2.5;
Ny = 200;
% generate plane
[x, y] = meshgrid(-(AR+1):(AR+1)/Ny:0, ...
        -0.7344:(0.7031- -0.7344)/Ny:0.7031); % Generate x and y data
z = zeros(size(x, 1)); % Generate z data
% I needed to rotate the plane by an angle about y-axis for my purposes
V1 = [reshape(x,1,(Ny+1)^2);
    reshape(y,1,(Ny+1)^2);
    reshape(z,1,(Ny+1)^2)];
dphi = 7.5;    % angle to rotate in degrees
MR = [cosd(dphi) 0 -sind(dphi);...
    0 1 0;...
    sind(dphi) 0 cosd(dphi)];
% slice going through the center of the wing
VR1 = MR*V1;
xP = reshape(VR1(1,:),Ny+1,Ny+1);
yP = reshape(VR1(2,:),Ny+1,Ny+1);
zP = reshape(VR1(3,:),Ny+1,Ny+1);

% generate cylinder
Nt = floor(2.1*Ny*R);   % specify the number of nodes along the tangential axis
[Xc,Zc,Yc] = cylinder(R*ones(1,Ny),Nt);
% matrix for correcting the height of cylindrical slice
ty = -0.7344;
sy = 0.7031 - -0.7344;
Mt = [1 0 0 0;
    0 1 0 ty;   % vertical translation
    0 0 1 0;
    0 0 0 1];
Ms = [1 0 0 0;
    0 sy 0 0;   % vertical stretching
    0 0 1 0;
    0 0 0 1];
H = Mt*Ms*[ones(1,Ny);Yc(:,1)';ones(1,Ny);ones(1,Ny)];
Yc = repmat(H(2,1:Ny)',1,Nt+1);

% draw figure
figure
hold on
h1 = slice(Xw,Yw,Zw,ur,xP,yP,zP,'linear');
plane_sli = h1.CData;
set(plane_sli,'edgecolor','none')
h2 = slice(Xw,Yw,Zw,ur,Xc,Yc,Zc,'linear');
cyl_sli = h2.CData;
set(cyl_sli,'edgecolor','none')
axis equal

Дополнительная работа: Попытка inShape Следуя инструкциям на веб-сайте MathWorks для inShapeкак предложено ниже.

shp = alphaShape(xP(:),yP(:),zP(:));
tf = inShape(shp,xC(:),yC(:),zC(:));

Переменная tf - это просто пустой (Nt*Ny) x 1 массив.Может быть, я делаю что-то не так, но это, похоже, не работает.

Two surfaces

1 Ответ

0 голосов
/ 23 февраля 2019

Вот начало: вы можете выполнить итерацию на плоскости (Xa, Ya, Za) и посмотреть, где она пересекается с цилиндром (Xb, Yb, Zb), используя inShape;см. https://www.mathworks.com/matlabcentral/answers/392798-finding-intersecting-points-of-two-3d-bodies.

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

...