- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于另一个角上任意数量的圆角,我如何找到可以应用于任一角的最大圆角?
评论中问题的答案:
1) 内外大圆弧(此处为90度宽的圆弧)始终具有相同的中心
2) 当要求最大四舍五入时,对另一个较小的圆有什么限制?它是否需要至少有一定的半径?否则,您所做的只是一轮舍入。
给出了两个圆的半径之一。除了我找不到的另一个圆的最大值之外,没有其他限制。如果我提到的“固定”角的舍入为零,那么我正在搜索只能应用于另一个角的最大舍入。
3) 什么构成最大舍入?您是否要在以上两个示例之间进行选择?还是找到其中任何一种情况都被视为解决方案?
所示案例中的任何一个都是完美的解决方案。例如。在第一张图片中,可能会给出较小圆的半径。然后我正在寻找较大半径的最大半径。这些图像只是完美解决方案的示例。
4)两条弧线有没有约束条件?如果圆弧不适合一个完整的圆会怎样?答案会是最大的吗?
圆弧不能适合一个完整的圆,您的意思是什么?
最佳答案
假设坐标系原点在内外大圆弧的中心点...
对于第一种大圆与外缘相切的情况,大圆的圆心为
x = R cos(t) / (1 + cos(t))
y = R sin(t) / (1 + cos(t))
其中 R 是外弧段的半径,t
是 x 轴与从原点通过大圆心的射线之间的夹角。
对于第二种大圆与内边相切的情况,大圆的圆心为
x = R cos(t) / (1 - cos(t))
y = R sin(t) / (1 - cos(t))
其中R是内弧段的半径,t
是角度...
在这两种情况下,圆的半径都等于它的 x 坐标。 t
的范围在某个最小角度和 PI/2 之间。在 PI/2 处,圆小得几乎没有。在最小角度,y 值等于相反的半径。换句话说,对于大圆与外缘相切的第一种情况,最小角度是 y 等于内半径。而如果圆与内边缘相切,则最小角度是 y 等于外半径。可以从数学上证明两种情况下的最小角度相同(对于给定的内半径和外半径,内切线和外切线都具有相同的最小角度)。然而,计算最小角度有点困难。我知道如何做到这一点的唯一方法是玩高/低游戏,例如
- (CGFloat)computeAngleForOuterTangentGivenY:(CGFloat)Y
{
CGFloat y;
double high = M_PI_2;
double low = 0;
double mid = M_PI_4;
while ( high - low > 1e-9 )
{
y = (self.outerRadius * sin( mid )) / (1.0 + cos( mid ));
if ( y > Y )
high = mid;
else
low = mid;
mid = (low + high) / 2.0;
}
return( mid );
}
- (CGFloat)computeAngleForInnerTangentGivenY:(CGFloat)Y
{
CGFloat y;
double high = M_PI_2;
double low = 0;
double mid = M_PI_4;
while ( high - low > 1e-9 )
{
y = (self.innerRadius * sin( mid )) / (1.0 - cos( mid ));
if ( y > Y )
low = mid;
else
high = mid;
mid = (low + high) / 2.0;
}
return( mid );
}
循环需要大约 30 遍才能收敛到一个答案。
求小圆的坐标,注意小圆和大圆的y值相同,并且与圆弧段的对边相切。因此,使用适当的高/低算法根据其 y 值计算小圆的角度 t
,然后使用上述公式计算 x 值。
QED
关于ios - 圆角 : How to calculate Fillet radius?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053584/
我是一名优秀的程序员,十分优秀!