How to find the closest point to a line

6 visualizzazioni (ultimi 30 giorni)
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 Commenti
Blue
Blue il 2 Nov 2022
I have edited the question to change the centroids positions. I simply want to associate each centroid to the closest line formed by the start and end positions of each point
Davide Masiello
Davide Masiello il 2 Nov 2022
How do you determine the distance between a line and a point?
Is the distance between the point and the line centroid ok?

Accedi per commentare.

Risposta accettata

Walter Roberson
Walter Roberson il 2 Nov 2022
  3 Commenti
Rik
Rik il 3 Nov 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
points = 2×6 table
name start_lat start_long end_lat end_long associated_centroid ____ _________ __________ _______ ________ ___________________ 1 48 -55 48.1 -55.1 {'A'} 2 50 -55 50.1 -55.1 {'B'}

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 3 Nov 2022
Does my attached function help any?

Categorie

Scopri di più su Interpolation in Help Center e File Exchange

Prodotti


Release

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by