How to find the closest point to a line
31 次查看(过去 30 天)
显示 更早的评论
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 个评论
Davide Masiello
2022-11-2
How do you determine the distance between a line and a point?
Is the distance between the point and the line centroid ok?
采纳的回答
Walter Roberson
2022-11-2
3 个评论
Rik
2022-11-3
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
更多回答(1 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!