I am generating two arrays similar to this:
我正在生成两个类似于此的数组:
[x,y,z] = sphere;
A=[x,y,z]
B=[x+0.5,y+0.5,z+0.5]
The second array is at an offset to the first.
第二个数组与第一个数组偏移。
I would like to find the intersection space of both of these arrays A and B.
我想找到这两个阵列A和B的交叉空间。
I have used the sphere function in this case but can this be done for any two data arrays not necessarily spherical. Is there a way to do this?
在这种情况下我使用了球体函数,但是对于任何两个不一定是球形的数据阵列都可以这样做。有没有办法做到这一点?
I am including an image for what I am looking for. I want to find the intersection between these two areas. But the values are not necessarily going to be the same as you can see.
我正在寻找我正在寻找的图像。我想找到这两个区域之间的交集。但是这些数值不一定与您所看到的相同。
If I have an equation for the limits of each of the spaces, would that make the problem easier?
如果我有一个关于每个空间限制的等式,那会使问题更容易吗?
1 个解决方案
#1
9
I stated in the comments that one could use convhull
and inpolygon
to solve this problem, only inpolygon
doesn't seem to apply to 3D polygons. We'll use delaunayTriangulation
and pointLocation
in order to get to the result
我在评论中说过,可以使用convhull和inpolygon来解决这个问题,只有多边形似乎不适用于3D多边形。我们将使用delaunayTriangulation和pointLocation来获得结果
Full code :
[x,y,z] = sphere;
A=[x(:),y(:),z(:)];
B=[x(:)+0.5,y(:)+0.5,z(:)+0.5];
tess1=delaunayTriangulation(A); % delaunay Triangulation of points set A
tess2=delaunayTriangulation(B); % delaunay Triangulation of points set B
Tmp=[A;B];
% Point location searches for the triangles in the given delaunay
% triangulation that contain the points specified in Tmp, here Tmp is
% the reunion of sets A and B and we check for both triangulations
ids1=~isnan(pointLocation(tess1,Tmp));
ids2=~isnan(pointLocation(tess2,Tmp));
% ids1&ids2 is a logical array indicating which points
% in Tmp are in the intersection
IntersectPoints=Tmp(ids1&ids2,:);
plot3(A(:,1),A(:,2),A(:,3),'+b'); hold on
plot3(B(:,1),B(:,2),B(:,3),'+g');
plot3(IntersectPoints(:,1),IntersectPoints(:,2),IntersectPoints(:,3),'*r')
Output :
EDIT - A 2D example :
[x,y,z] = sphere;
A=[x(:),y(:)];
B=[x(:)+0.5,y(:)+0.5];
tess1=delaunayTriangulation(A); % delaunay Triangulation of points set A
tess2=delaunayTriangulation(B); % delaunay Triangulation of points set B
Tmp=[A;B];
% Point location searches for the triangles in the given delaunay
% triangulation that contain the points specified in Tmp, here Tmp is
% the reunion of sets A and B and we check for both triangulations
ids1=~isnan(pointLocation(tess1,Tmp));
ids2=~isnan(pointLocation(tess2,Tmp));
% ids1&ids2 is a logical array indicating which points
% in Tmp are in the intersection
IntersectPoints=Tmp(ids1&ids2,:);
plot(A(:,1),A(:,2),'+b'); hold on
plot(B(:,1),B(:,2),'+g');
plot(IntersectPoints(:,1),IntersectPoints(:,2),'*r');
Output :
Edit 2 :
If you want your code to adapt to either 2D or 3D arrays automatically, you just really need to modify the plot calls. Just write an if
statement that will check the number of columns in A and B
如果您希望代码自动适应2D或3D数组,您只需要修改绘图调用。只需编写一个if语句来检查A和B中的列数
#1
9
I stated in the comments that one could use convhull
and inpolygon
to solve this problem, only inpolygon
doesn't seem to apply to 3D polygons. We'll use delaunayTriangulation
and pointLocation
in order to get to the result
我在评论中说过,可以使用convhull和inpolygon来解决这个问题,只有多边形似乎不适用于3D多边形。我们将使用delaunayTriangulation和pointLocation来获得结果
Full code :
[x,y,z] = sphere;
A=[x(:),y(:),z(:)];
B=[x(:)+0.5,y(:)+0.5,z(:)+0.5];
tess1=delaunayTriangulation(A); % delaunay Triangulation of points set A
tess2=delaunayTriangulation(B); % delaunay Triangulation of points set B
Tmp=[A;B];
% Point location searches for the triangles in the given delaunay
% triangulation that contain the points specified in Tmp, here Tmp is
% the reunion of sets A and B and we check for both triangulations
ids1=~isnan(pointLocation(tess1,Tmp));
ids2=~isnan(pointLocation(tess2,Tmp));
% ids1&ids2 is a logical array indicating which points
% in Tmp are in the intersection
IntersectPoints=Tmp(ids1&ids2,:);
plot3(A(:,1),A(:,2),A(:,3),'+b'); hold on
plot3(B(:,1),B(:,2),B(:,3),'+g');
plot3(IntersectPoints(:,1),IntersectPoints(:,2),IntersectPoints(:,3),'*r')
Output :
EDIT - A 2D example :
[x,y,z] = sphere;
A=[x(:),y(:)];
B=[x(:)+0.5,y(:)+0.5];
tess1=delaunayTriangulation(A); % delaunay Triangulation of points set A
tess2=delaunayTriangulation(B); % delaunay Triangulation of points set B
Tmp=[A;B];
% Point location searches for the triangles in the given delaunay
% triangulation that contain the points specified in Tmp, here Tmp is
% the reunion of sets A and B and we check for both triangulations
ids1=~isnan(pointLocation(tess1,Tmp));
ids2=~isnan(pointLocation(tess2,Tmp));
% ids1&ids2 is a logical array indicating which points
% in Tmp are in the intersection
IntersectPoints=Tmp(ids1&ids2,:);
plot(A(:,1),A(:,2),'+b'); hold on
plot(B(:,1),B(:,2),'+g');
plot(IntersectPoints(:,1),IntersectPoints(:,2),'*r');
Output :
Edit 2 :
If you want your code to adapt to either 2D or 3D arrays automatically, you just really need to modify the plot calls. Just write an if
statement that will check the number of columns in A and B
如果您希望代码自动适应2D或3D数组,您只需要修改绘图调用。只需编写一个if语句来检查A和B中的列数