smallest line that passes through a point while staying within polygon boundaries
4 ビュー (過去 30 日間)
古いコメントを表示
I have a polygon that is generated through x and y coordinates, I also have the center point of the polygon. What I want to do is extend a line at every degree (0-180) that goes through the center point of the polygon but stops at both sides of the polygon boundary. What I want to do then is to extract the length of the smallest of these lines, and the line that is perpendicular to it. (I have been using polyxpoly function from the mapping toolbox, I'm just confused how to apply it to this).
Here is what I have:
6 件のコメント
Walter Roberson
2021 年 6 月 8 日
Is that what you want, or would your needs be met by a feret diameter? https://www.mathworks.com/help/images/ref/bwferet.html
回答 (1 件)
Nipun
2024 年 5 月 17 日
Hi Talha,
I understand that you are trying to generate lines at every degree through the center point of a polygon, find where these lines intersect the polygon boundary, and then calculate the lengths of these lines to identify the shortest one and the line perpendicular to it. Here is a concise MATLAB code snippet to achieve this:
% Assuming polygonX, polygonY are the coordinates of the polygon vertices,
% and centerX, centerY are the coordinates of the center point.
shortestLength = inf;
shortestAngle = 0;
% Loop through each degree from 0 to 180
for angle = 0:180
% Generate points far enough to ensure intersection with the polygon
farPointX = centerX + cosd(angle) * 10000; % Adjust 10000 based on your polygon scale
farPointY = centerY + sind(angle) * 10000;
% Find intersection points with the polygon
[xi, yi] = polyxpoly([centerX, farPointX], [centerY, farPointY], polygonX, polygonY);
% Calculate the distance if there are intersections
if numel(xi) > 1
distances = hypot(diff(xi), diff(yi));
minDistance = min(distances); % In case of multiple segments, take the shortest
if minDistance < shortestLength
shortestLength = minDistance;
shortestAngle = angle;
end
end
end
% Calculate perpendicular line
perpendicularAngle = mod(shortestAngle + 90, 180);
farPointX = centerX + cosd(perpendicularAngle) * 10000;
farPointY = centerY + sind(perpendicularAngle) * 10000;
[xi_perp, yi_perp] = polyxpoly([centerX, farPointX], [centerY, farPointY], polygonX, polygonY);
% Assuming perpendicular line also intersects the polygon at exactly two points
if numel(xi_perp) > 1
perpendicularLength = hypot(xi_perp(2) - xi_perp(1), yi_perp(2) - yi_perp(1));
else
perpendicularLength = NaN; % Handle case where there isn't exactly one intersection pair
end
fprintf('Shortest Line Length: %f\n', shortestLength);
fprintf('Perpendicular Line Length: %f\n', perpendicularLength);
This code calculates the shortest line and its perpendicular counterpart based on their intersection points with the polygon. It assumes that the lines will intersect the polygon at exactly two points, which might need adjustment for complex polygons or specific scenarios.
Hope this helps.
Regards,
Nipun
0 件のコメント
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!