Dividing the point cloud in 10x10 ways

Hello, my problem is that I am working on a 3-dimensional point cloud like in the title and I want to split it into 10x10 pieces over x and y. As I am new to Matlab, I didn't know how to do this for now.

Answers (2)

Load built-in pointcloud data and look at the pointcloud object pc
load('xyzPoints');
pc = pointCloud(xyzPoints)
pc =
pointCloud with properties: Location: [5184×3 single] Count: 5184 XLimits: [-3 3.4338] YLimits: [-2 2] ZLimits: [0.0016 3.1437] Color: [] Normal: [] Intensity: []
X/Y/ZLimits are the range of x,y,z points. Create a 10x10 grid within the x and y ranges. The bounds are defined in xyBounds (nx2).
[x,y] = meshgrid(linspace(pc.XLimits(1), pc.XLimits(2), 10), ...
linspace(pc.YLimits(1), pc.YLimits(2), 10));
xyBounds = [x(:),y(:)]
xyBounds = 100×2
-3.0000 -2.0000 -3.0000 -1.5556 -3.0000 -1.1111 -3.0000 -0.6667 -3.0000 -0.2222 -3.0000 0.2222 -3.0000 0.6667 -3.0000 1.1111 -3.0000 1.5556 -3.0000 2.0000
Use indexing to access a particular section of points.
Get all points within the bin #n
  • pc.Location are all [x,y,z] coordinates.
  • idx is a logical vector identifying points in pc.Location that are in the bin
  • section are the [x,y,z] coordinates within the bin.
n = 50; % 50th bin xyBounds(n,:)
xIdx = pc.Location(:,1) >= xyBounds(n,1) & pc.Location(:,1) < xyBounds(n+1,1);
yIdx = pc.Location(:,2) >= xyBounds(n+1,2) & pc.Location(:,2) < xyBounds(n,2);
idx = xIdx & yIdx;
section = pc.Location(idx,:)
section = 1150×3
0 -1.5000 2.4000 0 -1.4537 2.4694 0 -1.4099 2.4977 0 -1.3830 2.4849 0 -1.3874 2.4309 0.0705 -1.4758 2.4399 0.0682 -1.4290 2.4887 0.0665 -1.3919 2.4964 0.0658 -1.3789 2.4630 0.1421 -1.4936 2.4000
Some bins will not have any points and will return a 0x3 empty matrix.

11 Comments

Thank you very much for the code, it worked very well until the last part. Do not take a look at my fault, I am an entry-level user in matlab, but I am getting such an error. What could be the reason?
Good news: it's not your fault! :)
Minutes after I submitted my answer I edited it to fix that error but it looks like you copied the code quickly after I submitted the original answer and before I fixed it. - Sorry about that.
Please see the updated version of the answer.
The final image turned out like this, do you think it's normal? The photo on the right is in its original form
Adam Danz
Adam Danz on 29 Mar 2021
Edited: Adam Danz on 29 Mar 2021
Since there are no axis labels and since I do not know the viewing angle, I can only assume that the vertical axis is Z and the longer of the two other axes is y. In that case, it looks like you have a slice along the x-axis but not along the y-axis. Was that your goal? I interpreted your questions as forming a 2D grid along the xy plane which would result in a column of points but in your image I see a slice of points.
Actually I want this
1. The first image represents my point cloud
2. The second visual represents the point cloud in the first visual divided into 100 equal parts from the x and y axes.
3. The third image shows that the points on the Z axis are multiplied in their own squares on the x and y axis with a command like "rand" and there is random height data. (I did not tell you how to do this, I thought I could do it myself because I have a code to do this)
Most of my answer still applies to that goal. Some changes:
pc = pointCloud(. . .);
xEdges= linspace(pc.XLimits(1), pc.XLimits(2), 11);
yEdges = linspace(pc.YLimits(1), pc.YLimits(2), 11);
xGroup = discretize(pc.Location(:,1),xEdges); %puts all x coordinates into groups
yGroup = discretize(pc.Location(:,2),yEdges); %puts all y coordinates into groups
[xyGroups, ~, groupID] = unique([xGroup, yGroup], 'row');
xyGroups are all unique (x,y) groups. size(xyGroups,1) is the number of groups.
groupID is the group ID for each point. groupID(i) is the grid group for point pc.Location(i,:) and blongs to group groupID(i,:) which has x and y edges defined by xEdges(groupID(i,1)+[0,1]) and yEdges(groupID(i,2)+[0,1]).
Note: this was written on the fly and not tested. If you run into errors with this try to troubleshoot it before reporting the error.
@Ahmet Selim Arslan please take a few seconds to accept answers to your questions by pressing the blue [accept this answer] button. Here are links to you questions - none of which you've accepted answers to
Sorry for not letting you know if the code is working or not. During this time I was trying to improve myself in coding.
You fit the x and y coordinates into the group in the code you have given, but I could not understand how to show it.
That's great to hear (I was trying to improve myself in coding).
All of your questions have reasonable answers but you've never accepted any of them. That makes it unclear whether those solutions worked for you or not.
About plotting the groups of points, that's a different question than what's asked here. Wouldn't they be plotted the same way you plotted the original pointcloud?
When I say show with plot, it shows such a result.
Okay, let's take it over again, I apologize for not being able to explain it in a nice and understandable language.As you can see, I want to divide the point cloud into 100 equal parts and distribute the height randomly and see this in the graph. I'm sorry if I haven't been revealing before

Sign in to comment.

see this example
clc,clear
x = rand(10,10,10);
y = rand(10,10,10);
z = rand(10,10,10);
ix = round(5*x);
iy = round(5*y);
plot3(x(:),y(:),z(:),'.b');
hold on
h = plot3(0,0,0,'or');
hold off
view(15,60)
for i = 1:5
for j = 1:5
ind = (i==ix) & (j==iy);
set(h,'xdata',x(ind))
set(h,'ydata',y(ind))
set(h,'zdata',z(ind))
pause(0.2)
end
end

4 Comments

This did not work the way I wanted, I am trying to divide the point cloud into 100 equal parts by dividing exactly 10x10 inside the boundaries of the point cloud.
I'm trying to divide it into 100 equal parts and show all the parts in the same graph.
Can you explain how exactly you want to divide the region?
In the point cloud, I want to divide the x and y axes into 10 equal parts and create 100 equal parts in this way.

Sign in to comment.

Products

Release

R2020a

Asked:

on 23 Mar 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!