How to find the closest point to a line
    10 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Blue
      
 el 2 de Nov. de 2022
  
    
    
    
    
    Comentada: 012786534
 el 3 de Nov. de 2022
            Hello,
I am having a bit of a hard time finding which point (i.e centroid) is closest to a line formed by the start and end coordinates. The lines are always in a straight line.
points = array2table([1,48,-55,48.1,-55.1; 2, 50,-55,50.1,-55.1], 'VariableNames', {'name', 'start_lat','start_long','end_lat','end_long'})
centroids = cell2table({'A', 47, -56; 'B', 51,-54}, 'VariableNames', {'name', 'centroid_lat','centroid_long'})
desired_output = cell2table({1,48,-55,48.1,-55.1, 'A'; 2, 50,-55,50.1,-55.1, 'B'}, 'VariableNames', {'name', 'start_lat','start_long','end_lat','end_long', 'closet_centroid'})
Thank you,
3 comentarios
  Davide Masiello
      
 el 2 de Nov. de 2022
				How do you determine the distance between a line and a point?
Is the distance between the point and the line centroid ok?
Respuesta aceptada
  Walter Roberson
      
      
 el 2 de Nov. de 2022
        3 comentarios
  Rik
      
      
 el 3 de Nov. de 2022
				Since you know you only put in 2 points, why not create the vector including the 0? That way you also get to skip the test with length (which I wouldn't use anymore.
I also removed the repmat call, as you only provide a single point.
points = array2table([1,48,-55,48.1,-55.1; 2, 50,-55,50.1,-55.1],...
    'VariableNames', {'name', 'start_lat','start_long','end_lat','end_long'});
centroids = cell2table({'A', 47, -56; 'B', 51,-54},...
    'VariableNames', {'name', 'centroid_lat','centroid_long'});
for i = 1:height(points)
    v1 = [points.start_lat(i), points.start_long(i), 0];
    v2 = [points.end_lat(i)  , points.end_long(i)  , 0];
    for  j = 1:height(centroids)
        pt = [centroids.centroid_lat(j), centroids.centroid_long(j), 0];
        a = v1 - v2;
        b = pt - v2;
        distance(j) = sqrt(sum(cross(a,b,2).^2,2)) ./ sqrt(sum(a.^2,2));
    end
    [~, idx] = min(distance);
    points.associated_centroid(i) = centroids.name(idx);
end
points
Más respuestas (1)
Ver también
Categorías
				Más información sobre Interpolation en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!





