简体   繁体   中英

Points (coordinates) with equal distances from each other on a polygon boundary - Matlab

I was thinking about a solution for the following problem: How to find X points (coordinates) that have equal distances from each other on a polygon boundary (polyshape object.). I do not know even how to approach it so any ideas how to do it are welcome?

Code:

clc;
clear all;
close all;
 
numOfSegments = 10; % just an example
polygon = polyshape([0 5 15 15 20 18 10 20 20],[1 5 10 10 10 15 10 25 35]);
plot(polygon)
P = perimeter(polygon);
SegemntP = P/numOfSegments;
  1. set LengthToGo to SegemntP
  2. Pick a starting point on your polyshape
  3. Move your LengthToGo towards the next point
  4. If you don't reach this point, you have found one of your points. Use this as your new starting point and continue with 0.
  5. If you have reached this point, reduce LengthToGo by the distance of your starting point and the point you have reached. Set the point you reached to be your new starting point. continue with 0

Hope the following code explains:

clc;
clear all;
close all;
 
numOfSegments = 10; % just an example
polygon = polyshape([0 5 15 15 20 18 10 20 20],[1 5 10 10 10 15 10 25 35]);
% polygon = polyshape([0 20 20 0 0],[0 0 20 20 0]);
plot(polygon)
hold on;

P = perimeter(polygon);
SegemntP = P/numOfSegments;

% this is first point on the polygon
lastPoint = polygon.Vertices(1,:);
% container for points
points = lastPoint;

polyIdx = 1;
lenToGo = SegemntP;
plygonPoints = [polygon.Vertices;polygon.Vertices(1,:)];% add first point so polygon is closed
while(size(points,1)<numOfSegments)
    lenOnPolyline = norm(plygonPoints(polyIdx+1,:)-lastPoint);
    if lenOnPolyline > lenToGo
        % move on this line
        dir = plygonPoints(polyIdx+1,:)-lastPoint;
        dir = dir ./ norm(dir);
        lastPoint = dir*lenToGo+lastPoint;
        points = [points;lastPoint];
        lenToGo = SegemntP;
    else
        % go to next line segment
        lenToGo = lenToGo-lenOnPolyline;
        polyIdx = polyIdx +1;
        lastPoint = plygonPoints(polyIdx,:);
    end
end

plot(points(:,1),points(:,2),'b*')
axis equal

Result:

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM