How to determine which grid cells a line segment passes through?

35 Ansichten (letzte 30 Tage)
Darcy
Darcy am 16 Jul. 2015
Beantwortet: Kaushik Pradhan am 16 Mai 2019
Hi, I apologize if this question has been asked before but I have looked and cannot find the answer.
Similar to my previous question, lets say you have a grid with cells in the x-direction from [1:5] and in the y-direction from [1:5] (5 x 5 grid). Now lets say you have two points on the grid: (0.35, 2.65) and (4.2,4.73).
Is there a simple way to determine which grid cells the line connecting those two points passes through (and the distances of each line segment)?
It is very easily visually to see which cells the line passes through (see figure below). Clearly the line segment passes through cells B1, C1, C2, D2, D3, E3 and E4.
Determining the distances of each line segment through each cell would be more difficult by hand.
I have currently solved the problem by finding the slope and intercept of the line, then determining the intercepts of the line with the grid cell lines. Using this, I can determine the distance of each line segment. Then, to find which cell the line segment falls in, I have to find the centre point of each grid cell and the midpoint of each line segment and do a for loop to determine the minimum distance between each line segment and each cell centre.
Is there a more elegant way to solve this problem? Obviously when dealing with multiple lines and/or a large grid, this will become much more time intensive.
  2 Kommentare
Azzi Abdelmalek
Azzi Abdelmalek am 16 Jul. 2015
Like you said, this question is the duplicate of this one http://www.mathworks.com/matlabcentral/answers/230152-how-to-determine-what-grid-cell-a-given-point-is-in. there are two answers, but none of your comments. Please edit the first question, this one will be deleted after you change your previous question.
Walter Roberson
Walter Roberson am 17 Jul. 2015
This question deals with line segments, not individual points.

Melden Sie sich an, um zu kommentieren.

Antworten (4)

Star Strider
Star Strider am 17 Jul. 2015
This brings back memories of How do I store the Coordinates of Lines Intersecting a Grid? I refer you to it for the description and documentation.
I later updated the code for it but didn’t post it. The updated code is:
x = 0:5; % X-range
y = 0:25; % Y-range
lxmb = @(x,mb) mb(1).*x + mb(2); % Line equation: y = m*x+b
m = -5; % Slope (or slope array)
b = 15; % Intercept (or intercept array)
mb = [m b]; % Matrix of [slope intercept] values
L1 = lxmb(x,mb); % Calculate Line #1 = y(x,m,b)
hix = @(y,mb) [(y-mb(2))./mb(1); y]; % Calculate horizontal intercepts
vix = @(x,mb) [x; lxmb(x,mb)]; % Calculate vertical intercepts
hrz = hix(x(2:end),mb)'; % [X Y] Matrix of horizontal intercepts
vrt = vix(y(1:6),mb)'; % [X Y] Matrix of vertical intercepts
hvix = [hrz; vrt]; % Concatanated ‘hrz’ and ‘vrt’ arrays
exbd = find( (hvix(:,2) < 0) | (hvix(:,2) > 25) );
hvix(exbd,:) = [];
srtd = unique(hvix,'rows'); % Remove repeats and sort ascending by ‘x’
exL1 = find((L1 < 0) | (L1 > 25)); % Find ‘y’ values for ‘L1’ off grid
xp = x; % Create plotting x-vector for L1
xp(exL1) = []; % Eliminate out-of-bounds ‘y’ values from ‘x’
L1(exL1) = []; % Eliminate out-of-bounds ‘y’ values from ‘Li’
figure(1) % Draw grids & plot lines
plot(repmat(x,2,length(x)), [0 length(y)-1]) % Vertical gridlines
hold on
plot([0 length(x)-1], repmat(y,2,length(y))) % Horizontal gridlines
plot(xp, L1) % Plot more lines here (additional ‘plot’ statements)
hold off
axis equal
It’s been over a year since I wrote it so I would have to study it to remember what I did, but I did my best at the time to document it exhaustively with comments, so that should help. The output (grid intersections) is in the srtd array.
  1 Kommentar
Merisa Saber
Merisa Saber am 26 Dez. 2018
Do you have any idea how we can change it to 3 dimensional grid? I mean to determine which 3 dimensional cell a line in a 3D space goes through.

Melden Sie sich an, um zu kommentieren.


Walter Roberson
Walter Roberson am 17 Jul. 2015

William Chamberlain
William Chamberlain am 17 Okt. 2018

Kaushik Pradhan
Kaushik Pradhan am 16 Mai 2019
Thank you guys.

Kategorien

Mehr zu Spatial Search finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by