function enum = findedge(p,node,edge,TOL) %*****************************************************************************80 % % FINDEDGE: Locate points on edges. % % Determine which edges a series of points lie on in a 2D plane. % % i = findedge(p,node,edge,tol); % % INPUTS % % P : An Nx2 array of xy co-ordinates of points to be checked. % NODE : An Kx2 array of xy co-ordinates of edge endpoints. % EDGE : An Mx2 array of edges, specified as connections between the % vertices in NODE: [n1 n2; n3 n4; etc]. % TOL : Tolerance used when testing points. % % OUTPUTS % % I : Nx1 array of edge numbers, corresponding to the edge that each % node lies on. Nodes that do not lie on any edges are assigned 0. % % See also INPOLYGON % % Author: % % Darren Engwirda % %% ERROR CHECKING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if nargin<4 TOL = 1.0e-12; if nargin<3 edge = []; if nargin<2 error('Insufficient inputs'); end end end nnode = size(node,1); if isempty(edge) % Build edge if not passed edge = [(1:nnode-1)' (2:nnode)'; nnode 1]; end if size(p,2)~=2 error('P must be an Nx2 array.'); end if size(node,2)~=2 error('NODE must be an Mx2 array.'); end if size(edge,2)~=2 error('EDGE must be an Mx2 array.'); end if max(edge(:))>nnode || any(edge(:)<1) error('Invalid EDGE.'); end %% PRE-PROCESSING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% n = size(p,1); nc = size(edge,1); % Choose the direction with the biggest range as the "y-coordinate" for the % test. This should ensure that the sorting is done along the best % direction for long and skinny problems wrt either the x or y axes. dxy = max(p,[],1)-min(p,[],1); if dxy(1)>dxy(2) % Flip co-ords if x range is bigger p = p(:,[2,1]); node = node(:,[2,1]); end tol = TOL*min(dxy); % Sort test points by y-value [y,i] = sort(p(:,2)); x = p(i,1); %% MAIN LOOP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% enum = zeros(size(p,1),1); for k = 1:nc % Loop through edges % Nodes in current edge n1 = edge(k,1); n2 = edge(k,2); % Endpoints - sorted so that [x1,y1] & [x2,y2] has y1<=y2 y1 = node(n1,2); y2 = node(n2,2); if y1=y1 start = 1; elseif y(n)y % value need to be checked break end end end % Re-index to undo the sorting enum(i) = enum; end % findedge()