Select next discrete cell by vector direction

2 views (last 30 days)
The situation is: I have my space discretized on cells (dimension doesn't matter) so that I'm at any cell and I know the wind flow 3 dimensional vector in that point.
What I would like to do is move to the most convenient cell next, depending on the wind vector direction.
Clarifications:
  • From each center cell, I can move in the 26 directions (taking into account diagonals) (I have painted some of them in the picture below).
  • I have cells classified by numbers (like in the image)
So, for example, if my wind vector is (400,0,0) I would have to move in the x axis positive direction to the '22' cell. But if my wind vector is (100,100,100) I would have to move in the positive diagonal (x,y,z) to the '26' cell (see image).
It gets more complicated when the vector is not so evident, for example (100,10,0). In this case the most convenient cell is number 22 too, because it is the closest.

Accepted Answer

Daniel M
Daniel M on 3 Oct 2019
Edited: Daniel M on 3 Oct 2019
You have the distance to each cell as the following:
[x,y,z] = ndgrid(-1:1);
R = [z(:),y(:),x(:)];
R(14,:) = []; % since you do not consider the center cell (0,0,0)
C = 1:26; % this coordinates with the (x,y,z) position in R
Now you need to get a normalized wind vector:
wind = [100,10,0];
nwind = normalize(wind,'norm');
Then finally, find the minimum euclidean distance between nwind and R. There are several ways to do this, here is one:
edist = sqrt(sum((nwind-R).^2,2));
[~,ind] = min(edist);
nextCell = C(ind); % the next cell to move to
And the output is:
nextCell =
22
  3 Comments
Daniel M
Daniel M on 3 Oct 2019
Edited: Daniel M on 3 Oct 2019
Replace nwind with repmat(nwind, length( R ),1), or try replacing nwind-R with bsxfun(@minus,nwind,R)

Sign in to comment.

More Answers (0)

Categories

Find more on Inertias and Loads in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!