MATLAB: How to do least square problem to get certain area

areaexpandleast-squarepolygon

I have many polygons and one of them is :
x_ori = [1.0, 2.0, 3.5, 3.5, 2.0];
y_ori = [2.5, 0.5, 1.5, 3.5, 4.5];
And I want to expand or shrink them to have certain area.
area_target = 2;
So I have to expand them by scaling some value, but the value will be different for every polygon.
scale_val = rand;
x_scaled = scale_val*x_ori+(1-scale_val)*mean(x_ori(1:end-1));
y_scaled = scale_val*y_ori+(1-scale_val)*mean(y_ori(1:end-1));
I want to find 'scale_val' for the polygon to have area of 'area_target'.

Best Answer

Try this:
x_ori = [1.0, 2.0, 3.5, 3.5, 2.0];
y_ori = [2.5, 0.5, 1.5, 3.5, 4.5];
plot(x_ori, y_ori, '-', 'LineWidth', 2);
grid on;
area_target = 2;
% Get centroid
xCenter = mean(x_ori)
yCenter = mean(y_ori)
hold on;
plot(xCenter, yCenter, 'r+', 'MarkerSize', 15, 'LineWidth', 2);
% Get original area
originalArea = polyarea(x_ori, y_ori)
% Specify a target area:
area_target = 2;
scale_val = sqrt(area_target / originalArea)
% Get new vertices with the same center.
x_scaled = xCenter + scale_val * (x_ori - xCenter);
y_scaled = yCenter + scale_val * (y_ori - yCenter);
plot(x_scaled, y_scaled, '-', 'LineWidth', 2);
% Get scaled area to see if it's equal to the target area.
scaledArea = polyarea(x_scaled, y_scaled)