zoukankan      html  css  js  c++  java
  • How to determine which grid cells a line segment passes through?

    https://cn.mathworks.com/matlabcentral/answers/230155-how-to-determine-which-grid-cells-a-line-segment-passes-through

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

    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.

    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.

  • 相关阅读:
    Java内存模型
    如何使用原生的Ribbon
    家穷应该读大学吗?| 寒门学子的奋斗史(一)
    试用期没过,因在公司上了1024网站。。。
    两个"�"="锟斤拷"?
    Java字符类Character字符串类String和StringBuffer
    Python抽象基类的定义与使用
    Java数字类Number和Math
    ESP8266 NodeMCU手把手入门(实操篇)——读取传感器的值
    不下软件,照样可以完美正确格式化树莓派SD卡!(恢复U盘/SD卡到满容量)
  • 原文地址:https://www.cnblogs.com/gisalameda/p/6526323.html
Copyright © 2011-2022 走看看