smallest line that passes through a point while staying within polygon boundaries
Show older comments
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 Comments
SALAH ALRABEEI
on 7 Jun 2021
Do you mean you want to bdrow line passing throu the center!!
Talha Majeed
on 7 Jun 2021
Image Analyst
on 7 Jun 2021
Why does it need to go through the "center" point? What is the real world use case for this situation?
How accurate does it need to be? If you could burn that polygon into a digital image with poly2mask(), then you could simply use bwdist() in the Image Processing Toolbox to construct the Euclidean Distance Map (EDM or EDT) then look for the shortest radius which is the max value of the EDM. The more pixels in your image, the more accurate it would be. So is 1 decimal place of accuracy good enough or do you need 16 places (doubtful)? That's why we need to know the use case.
Talha Majeed
on 7 Jun 2021
Walter Roberson
on 8 Jun 2021
Is that what you want, or would your needs be met by a feret diameter? https://www.mathworks.com/help/images/ref/bwferet.html
Talha Majeed
on 8 Jun 2021
Answers (1)
Nipun
on 17 May 2024
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
Categories
Find more on Region and Image Properties in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!