我们有一个半径为10的红色圆圈。在这个红色的圆柱上,还有另外3个蓝色(半径8)的圆圈,它们间隔120°。 C点是两个蓝色圆圈的中间,有一个绿色圆圈(半径2)。
我需要找到同时接触两个蓝色圆圈和绿色的黄色圆圈的坐标和半径。我知道如何制作一个有3个点的圆圈但黄色圆圈只能触及其他3个圆圈。每个圆圈只有1个点交叉点。
在图片上,我们可以看到它不正确。黄色圆圈触摸2点蓝色圆圈。
在示例中有3个蓝色圆圈,但它应该与红色圆圈上等距的2,3,4和5个蓝色圆圈一起使用。
我现在已经解决了这个问题,帮助......
我尝试为iPhone做这件事,但欢迎使用任何代码。
答案 0 :(得分:0)
如果你有他们的位置和半径值,我认为这很简单。 您可以比较黄色圆圈和目标圆圈之间的距离是否与所需的值匹配:
要找到两点(1和2)之间的距离,我们将使用等式d=sqrt((x2-x1)^2+(y2-y1)^2)
。
但是我们必须考虑它们的半径,所以我们只需要比较考虑到目标圆的半径,黄色圆圈边缘上的点之间的距离是否在目标圆内。半径。
iOS提供these个数学函数,因此我们可以将上面的等式变成这样的:
- (BOOL)yellowCircleCrossesTargetCircleWithCenter:(CGPoint)center andRadius:(CGFloat)radius {
//consider x, y, r and the like, like real numbers.
//this is just an example
CGPoint yellowCircle = CGPointMake(x,y);
CGFloat yellowCircleRadius = r;
CGPoint targetCircle = center
CGFloat targetCircleRadius = radius;
double distance = sqrt(pow(targtetCircle.x-yellowCircle.x)+pow(targetCircle.y-yellowCircle.y));
BOOL isAboveMinimumLimit = (yellowCircleRadius - targetCircleRadius) < distance;
BOOL isBelowMaximumLimit = (yellowCircleRadius + targetCircleRadius) > distance;
return isAboveMinimumLimit && isBelowMaximumLimit;
//returns YES if yellow circle's border crosses the target circle
}
您必须为要检查的每个圈子运行此操作。如果所有圆圈都返回YES,则黄色将全部交叉。
答案 1 :(得分:0)
让我们
blue radius = R
green radius = r
unknown yellow radius is F
and |BC| = P
然后| GB | = R + F,因为半径到触点垂直于公切线,所以它们是共线的,对于直角BGC三角形
(R + F)^2 = (r + F)^2 + P^2
(由于毕达哥拉斯定理)
R^2 + 2*R*F+F^2 = r^2 + 2*r*F + F^2 + P^2
2F*(R-r) = P^2 + r^2 -R^2
and finally
F = (P^2 + r^2 -R^2) / (2*(R-r))
适用于您的案例R = 8, r = 2, P = 10*Sin(Pi/3)=5 *Sqrt(3), P^2 = 75
F = (75 + 4 - 64) / (2 * (8 - 2)) = 15/12 = 5/4
草图(另一个点名称):