In terms of the overlap, the arc present from any circle that is inside of another circle should be removed, and the overlapped area should be removed as well.
For intersecting circles, how to remove overlap and have chord visible? Also, how to randomly generate circle position in design space?
조회 수: 6 (최근 30일)
이전 댓글 표시
As in the image, I am trying to remove the circle overlap from the intersection, and have the chord itself (not present in the image) visible.
채택된 답변
Joseph Cheng
2014년 6월 9일
편집: Joseph Cheng
2014년 6월 9일
How are you drawing your circles?
However you are trying to draw it you'll probably end up having x and y points representing the 2 circles.
xCenter1 = 7;
yCenter1 = 7;
xCenter2 = 12;
yCenter2 = 10;
theta = 0 : 0.01 : 2*pi;
radius1 = 5;
radius2 = 6;
%generate 2 circles with parameters above.
x1 = radius1 * cos(theta) + xCenter;
y1 = radius1 * sin(theta) + yCenter;
x2 = radius2 * cos(theta) + xCenter2;
y2 = radius2 * sin(theta) + yCenter2;
%%find distance from each circle center to the other circle's infringing points.
dC1 = sqrt((x2-xCenter1).^2+(y2-yCenter1).^2)>=radius1;
dC2 = sqrt((x1-xCenter2).^2+(y1-yCenter2).^2)>=radius2;
plot(x1(dC2), y1(dC2),'b.',x2(dC1),y2(dC1),'r.');
axis square;
xlim([0 20]);
ylim([0 20]);
grid on;
Looking at your sample picture it is easy to see that the infringing portion of circle 2 into circle 1 are points that are within the radius of circle 1. (vice versa for circle 2) With this we can calculate the distance of all points of circle 2 to the center of circle 1 and compare it to the radius.
댓글 수: 1
Joseph Cheng
2014년 6월 9일
Oh and to randomly generate points you can use rand() to generate a random number.
추가 답변 (2개)
Roger Stafford
2014년 6월 9일
Let P1 = [x1;y1] and P2 = [x2;y2] be column vectors for the coordinates of the two centers of the circles and let r1 and r2 be their respective radii.
d2 = sum((P2-P1).^2);
P0 = (P1+P2)/2+(r1^2-r2^2)/d2/2*(P2-P1);
t = ((r1+r2)^2-d2)*(d2-(r2-r1)^2);
if t <= 0
fprintf('The circles don''t intersect.\n')
else
T = sqrt(t)/d2/2*[0 -1;1 0]*(P2-P1);
Pa = P0 + T; % Pa and Pb are circles' intersection points
Pb = P0 - T;
a = atan2(P1(2)-P2(2),P1(1)-P2(1));
b1 = atan2(abs(det([Pa-P1,P1-P2])),dot(Pa-P1,P1-P2));
b2 = atan2(abs(det([Pb-P2,P2-P1])),dot(Pb-P2,P2-P1));
t1 = linspace(a-b1,a+b1);
t2 = linspace(a+pi-b2,a+pi+b2);
Q1 = bsxfun(@plus,P1,r1*[cos(t1);sin(t1)]);
Q2 = bsxfun(@plus,P2,r2*[cos(t2);sin(t2)]);
plot(Q1(1,:),Q1(2,:),'y-',Q2(1,:),Q2(2,:),'y-',...
[Pa(1),Pb(1)],[Pa(2),Pb(2)],'y-')
axis equal
end
Kelly Kearney
2014년 6월 9일
If you have the mapping toolbox, try polybool. If you don't, try this option, which appears to do provide a wrapper around GPC, which is the same thing polybool does.
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Point Cloud Processing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!