# Calculating the area of overlapping polgyons

63 vues (au cours des 30 derniers jours)
Louis Helledie le 4 Août 2023
Commenté : Louis Helledie le 4 Août 2023
I would like to find a way to calculate the area different polygons based on their place in a hierarchy such that if a polygon overlaps with any prior defined polygons, it will obtain the overlapping area. This overlapping area should also be subtracted to the initial area of the prior defined polygon, so the total area will star correct. I have provided a simple example that tries to visualize my problem.
Here, polygon 3 is last defined (in the front) and should have an area of 1. Polygon 2 should have an initial area of 4 square units, but because polygon 3 overlaps with it, it should only have an area of 3 square units. Polygon 1 (which is farthest in the back because it is defined first) has an initial area of 9 square units, but should be 5 square units as polygon 3 obtains 1 square unit and polygon 2 obtains 3 square units (9-3-1=5)
The code I am using give me an area of 4 square units for polygon 1, and it must be because both polygon 2 and polygon 3, in the part where they both overlaps with polygon 1, are subtracted from polygon 1. The part where they both overlap is the region covered by the coordinates (1,1) (2,1), (2,2), and (1,2).
Below is the code i use provided. Hope any of you can help me with this problem.
% Clear the workspace and close all figures
clear all;
close all;
clc;
% Define the vertices of the polygons
polygon1 = [0, 0; 3, 0; 3, 3; 0, 3];
polygon2 = [0.5, 0.5; 2.5, 0.5; 2.5, 2.5; 0.5, 2.5];
polygon3 = [1, 1; 2, 1; 2, 2; 1, 2];
polygons = {polygon1, polygon2, polygon3};
% Calculate the areas of the polygons
num_polygons = numel(polygons);
areas = zeros(num_polygons, 1);
for i = num_polygons:-1:1
intersect_area = 0;
for j = (i + 1):num_polygons
[xi, yi] = polybool('intersection', polygons{i}(:, 1), polygons{i}(:, 2), polygons{j}(:, 1), polygons{j}(:, 2));
intersect_area = intersect_area + polyarea(xi, yi);
end
areas(i) = polyarea(polygons{i}(:, 1), polygons{i}(:, 2)) - intersect_area;
end
% Display the calculated areas
for i = 1:num_polygons
fprintf('Polygon %d Area: %f square units\n', i, areas(i));
end
% Plot the polygons with different colors and FaceAlpha 1
figure;
hold on;
colors = jet(num_polygons);
for i = 1:num_polygons
fill(polygons{i}(:, 1), polygons{i}(:, 2), colors(i, :), 'FaceAlpha', 1);
end
hold off;
axis equal;
title('Overlapping Squares');
xlabel('X-axis');
ylabel('Y-axis');
% Update the legend to include all polygons
legend('Polygon 1', 'Polygon 2', 'Polygon 3', 'Location', 'Best');
Thank you in advance,
Louis H
##### 0 commentairesAfficher -2 commentaires plus anciensMasquer -2 commentaires plus anciens

Connectez-vous pour commenter.

### Réponse acceptée

Bruno Luong le 4 Août 2023
Modifié(e) : Bruno Luong le 4 Août 2023
Is it what you want? (I'm not sure about the desired output if polygons are not hierachical included to each other, see variant in comment bellow)
% Define the vertices of the polygons
polygon1 = [0, 0; 3, 0; 3, 3; 0, 3];
polygon2 = [0.5, 0.5; 2.5, 0.5; 2.5, 2.5; 0.5, 2.5];
polygon3 = [1, 1; 2, 1; 2, 2; 1, 2];
polygons = {polygon1, polygon2, polygon3};
Q = polyshape(zeros(0,2));
n = length(polygons);
A = zeros(1, n);
for k=length(polygons):-1:1
Pk = polyshape(polygons{k});
A(k) = area(subtract(Pk, Q));
Q = Pk;
end
for k=1:n
fprintf('Addition area poygonal %d = %f\n', k, A(k));
end
Addition area poygonal 1 = 5.000000 Addition area poygonal 2 = 3.000000 Addition area poygonal 3 = 1.000000
##### 2 commentairesAfficher AucuneMasquer Aucune
Bruno Luong le 4 Août 2023
% Define the vertices of the polygons
polygon1 = [0, 0; 3, 0; 3, 3; 0, 3];
polygon2 = [0.5, 0.5; 2.5, 0.5; 2.5, 2.5; 0.5, 2.5];
polygon3 = [1, 1; 3, 1; 3, 2; 1, 2]; % different examples here, non inclusion
polygons = {polygon1, polygon2, polygon3};
Q = polyshape(zeros(0,2));
n = length(polygons);
A = zeros(1, n);
P = cell(1,n);
for k=length(polygons):-1:1
Pk = polyshape(polygons{k});
A(k) = area(subtract(Pk, Q));
P{k} = Pk;
Q = union(Q, Pk); % variant
end
hold on
for k=1:n
plot(P{k},'FaceAlpha', 0.5)
end
for k=1:n
fprintf('Addition area poygonal %d = %f\n', k, A(k));
end
Addition area poygonal 1 = 4.500000 Addition area poygonal 2 = 2.500000 Addition area poygonal 3 = 2.000000
Louis Helledie le 4 Août 2023
Thank you so much for the quick response. This is really good, and I will try to implement it with some more polygons that are a little more complex and hopefully be able to use it on my final project. Will keep you updated

Connectez-vous pour commenter.

### Plus de réponses (1)

Davide Masiello le 4 Août 2023
% Clear the workspace and close all figures
clear,clc
% Define the vertices of the polygons
polygon1 = [0, 0; 3, 0; 3, 3; 0, 3];
polygon2 = [0.5, 0.5; 2.5, 0.5; 2.5, 2.5; 0.5, 2.5];
polygon3 = [1, 1; 2, 1; 2, 2; 1, 2];
polygons = {polygon1, polygon2, polygon3};
% Calculate the areas of the polygons
num_polygons = numel(polygons);
areas = zeros(num_polygons, 1);
for i = num_polygons:-1:1
areas(i) = polyarea(polygons{i}(:, 1), polygons{i}(:, 2));
end
areas = abs(diff([areas;0]));
% Display the calculated areas
for i = 1:num_polygons
fprintf('Polygon %d Area: %f square units\n', i, areas(i));
end
Polygon 1 Area: 5.000000 square units Polygon 2 Area: 3.000000 square units Polygon 3 Area: 1.000000 square units
% Plot the polygons with different colors and FaceAlpha 1
figure;
hold on;
colors = jet(num_polygons);
for i = 1:num_polygons
fill(polygons{i}(:, 1), polygons{i}(:, 2), colors(i, :), 'FaceAlpha', 1);
end
hold off;
axis equal;
title('Overlapping Squares');
xlabel('X-axis');
ylabel('Y-axis');
% Update the legend to include all polygons
legend('Polygon 1', 'Polygon 2', 'Polygon 3', 'Location', 'Best');
##### 3 commentairesAfficher 1 commentaire plus ancienMasquer 1 commentaire plus ancien
Bruno Luong le 4 Août 2023
@Louis Helledie "Here, it should be affected by the overlapping area, and therefore obtain an area less than 5 square units."
You didn't clearly state it in your original question. See the comment under my answer.
Louis Helledie le 4 Août 2023
@Bruno Luong I saw that, my fault. I did see your reply and i'm trying to implement it to my work at the very moment. Thank you

Connectez-vous pour commenter.

### Catégories

En savoir plus sur Elementary Polygons dans Help Center et File Exchange

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by