如何找出给定圆的周长被其他交叉圆圈覆盖多少?

时间:2015-01-07 13:22:51

标签: algorithm matlab geometry

我有一个圆心,中心坐标和半径。

飞机上还有其他圆圈,其位置已知且半径相同。

如何使用Matlab找出平面中其他圆圈所覆盖的给定圆周长部分?

3 个答案:

答案 0 :(得分:4)

一般方法是:

  1. 将圆周表示为角度[0,2Pi]的间隔,表示由圆周的一部分覆盖的角度(朝向任意方向,比如x方向)
  2. 当前覆盖的周长是空间隔[0,0]
  3. 计算圆圈和另一个圆圈所覆盖的圆周(如果没有交叉点,则没有覆盖圆周,见下文)
  4. 将此间隔与当前覆盖周长合并以获得新的当前覆盖周长,您可能会得到一组间隔
  5. 检查当前覆盖的周长是否为单个区间[0,2Pi],如果不重复,则为3。
  6. 如何计算圆圈和另一个圆圈所覆盖的圆周部分?

    1. 通过等于两个圆的圆方程(r²=(x-center_x)²+(y-center_y)²)计算交点并求解二项式。如果没有两个交叉点(即< 2解决方案)继续下一个其他圆圈。
    2. 这应该会在你的圈子上给你两个可能的间隔。为了找出哪一个是正确的,在每个间隔中取一个点,即在圆周的每个部分上的一个点并检查到另一个圆的距离(必须是<半径)。这是所涵盖的圆周的一部分。
    3. 您可以提前返回,结果是总周长被覆盖但如果不是,则必须测试每隔一个圆圈。

      它只能起作用,因为所有圆的半径相等。如果其他圆圈可能更小,那么它仍然可以,但如果它们可能更大,则不会总是得到交叉点,使整个问题变得更加困难。但你说,这不是这种情况。

答案 1 :(得分:1)

正如Trilarion所解释的那样,计算的核心是你需要交叉两个圆圈。 你可以在网上找到这个代码,也可以自己编写代码。一个来源是 Computational Geometry in C ,与2D机器人手臂动作(arm.c)相关联的代码,其中包括与两个圆相交的函数。有一些堕落的情况必须小心处理:两个圆相交只有一个点,或相等的圆相交成一个圆圈。

答案 2 :(得分:1)

要把事情放在透视图中,你可以使用matlab pde向我们展示数字

pdecirc(1,2,3)

pdecirc(-1,-1,2)

如果你想用matlab在matlab上绘图,那就是:

n = 100 % Resolution

angle = 0:2*pi/n:2*pi; % vector of angles at which points are drawn R = 3; % radius

x = R*cos(angle)+2; y = R*sin(angle)+1; % Coordinates of the circle plot(x,y); % Plot the circle

axis equal; grid on;

你可以根据自己的喜好进行绘图,如果想要非常高的分辨率,可能需要将n设置为高值。现在回答你的问题.. 使用matlab circcirc查找圆圈的交点,有关详细信息,请参阅http://uk.mathworks.com/help/map/ref/circcirc.html

[xout,yout] = circcirc(1,2,3,-1,-1,2); %which returns the x-intersects and the y-intersects

您可以对x和y相交进行分组,并根据半径和相交进行圆周计算。如果你不知道怎么做,请查看http://mathcentral.uregina.ca/QQ/database/QQ.09.07/h/michelle3.html 假设您有2个以(1,2)和(-1,-1)为中心的圆圈

i = pdist([xout(1),yout(1);xout(2),yout(2)],'euclidean') %distance between intersects

P = [xout(1),yout(1);1,2] %coordinate of one of the intersections and your centre

E = pdist(P,'euclidean')

y = asin(i/(2*E))*2 %angle of your arc

cir = pi*2*R1*(y/(2*pi))%的弧度乘以总周长

这应该会在两个圈子之间给你答案,除非我的高中数学不及我。

PS:使用circcirc的好处是,如果圆圈不相交(即重叠或不相互接触,则返回坐标的NaN,然后​​可以处理)