Clear Filters
Clear Filters

polyshapes formed by intersection of polygons/polyshapes

2 views (last 30 days)
i want to make a new polyshape formed by intersection of polygons/polyshapes .
i have attached the code uploaded by MR bruno .
1.PNG
  2 Comments
jahanzaib ahmad
jahanzaib ahmad on 31 Dec 2018
N = 80; % aproximative number of polygonals to be generated
n = 2000; % control size and number of vertexes of polygonal
nrepulsion = 3; % control the size of the polygonal and the randomness of the position
X = randn(N,2);
R = sqrt(rand(N,1));
X = R .* X ./ sqrt(sum(X.^2,2));
X(:,2) = abs(X(:,2));
nb = max(N,100);
theta = linspace(0,pi,nb)';
XC = [cos(theta), sin(theta)];
XY0 = linspace(-1,1,ceil(nb*2/pi))' .* [1 0];
XY0([1 end],:) = [];
n1 = size(X,1);
n2 = size(XC,1);
n3 = size(XY0,1);
CC = n1+(1:n2-1)' + [0 1];
C0 = (n1+n2)+(1:n3-1)' + [0 1];
C = [CC; C0];
% Repulsion of seeds to avoid them to be too close to each other
for k = 1:nrepulsion-1
XALL = [X; XC; XY0];
DT = delaunayTriangulation(XALL, C);
T = DT.ConnectivityList;
containX = ismember(T,1:n1);
b = any(containX,2);
TX = T(b,:);
containX = containX(b,:);
[r,i0] = find(containX);
i = mod(i0+(-1:1),3)+1;
m = size(TX,1);
i = TX(r + (i-1)*m);
T = accumarray([i(:,1);i(:,1)],[i(:,2);i(:,3)],[n1 1],@(x) {unique(x)});
maxd2 = 0;
R = zeros(n1,2);
for i=1:n1
Ti = T{i};
P = XALL(Ti,:);
P = X(i,:) - P;
nP2 = sum(P.^2,2);
maxd2 = max(maxd2,max(nP2));
b = Ti > n1;
nP2(b) = nP2(b)*5; % less repulsion from each point of the border
R(i,:) = sum(P./nP2,1);
end
if k==1
v0 = 0.05/sqrt(maxd2);
end
v = v0/sqrt(max(sum(R.^2,2)));
X = X + v*R;
% Project back if points falling outside the half-circle
r2 = sum(X.^2,2);
out = r2>1;
X(out,:) = X(out,:) .* (0.95 ./ sqrt(r2(out))); % 95percent back from previous point
X(:,2) = max(X(:,2),0.01);
end
XALL = [X; XC; XY0];
DT = delaunayTriangulation(XALL, C);
[V,P] = voronoiDiagram(DT);
yV = V(:,2);
xV = V(:,1);
inside = (yV > 0) & (xV.^2+yV.^2) < 1;
inside = cellfun(@(id) all(inside(id)), P);
P = P(inside);
for k=1:length(P)
Pk = P{k};
m = length(Pk);
W = rand(n,m-1) .^ (1./(m-1:-1:1));
W = cumprod([ones(n,1),W],2) .* (1-[W, zeros(n,1)]);
Pk = W*V(Pk,:);
K = convhull(Pk);
P{k} = Pk(K,:);
end
% Check
close all
hold on
for k=1:length(P)
Pk = P{k};
plot(Pk([1:end 1],1),Pk([1:end 1],2),'r');
polyin=polyshape(P{k});
polyout3 = polybuffer(polyin,0.01,'JointType','square');
plot(polyout3,'FaceColor', 'none');
end
XB = [XC; XY0];
plot(XB([1:end 1],1),XB([1:end 1],2),'k');
axis equal;
axis([-1.1 1.1 -0.1 1.1]);

Sign in to comment.

Answers (1)

Steven Lord
Steven Lord on 31 Dec 2018
Try calling intersect on your polyshape objects as I suggested in my answer for one of your previous questions.
  1 Comment
jahanzaib ahmad
jahanzaib ahmad on 1 Jan 2019
Edited: jahanzaib ahmad on 1 Jan 2019
"intersection "will give me the point of intersections . i m after the logic to connect those points so i get the polyshape .thats the problem

Sign in to comment.

Categories

Find more on Elementary Polygons 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!