圆角:如何计算圆角半径?

Posted

技术标签:

【中文标题】圆角:如何计算圆角半径?【英文标题】:Rounding Corners: How to calculate Fillet radius? 【发布时间】:2014-02-26 21:22:02 【问题描述】:

我如何找到可以应用于任一角的最大舍入,以便在另一个角上进行任意数量的舍入?

对cmets问题的回答:

1) 内外大圆弧(此处为 90 度宽)始终具有相同的中心

2) 当要求你可以做的最大舍入时,对另一个较小的圆圈有什么限制?它是否需要至少有一些半径?否则,您将只得到一个舍入。

给定两个圆的半径之一。除了我找不到的另一个圆圈的最大值之外,没有其他约束。 如果我所指的“固定”角的舍入为零,那么我正在寻找只能用于另一个角的最大舍入。

3) 什么是最大舍入?您是否尝试在上述两个示例之间进行选择?或者找到其中任何一种情况都被认为是一种解决方案?

显示的任何一个案例都是完美的解决方案。例如。在第一张图像中,可能会给出较小圆的半径。然后我正在寻找较大的最大半径。 这些图片只是完美解决方案的示例。

4) 两条弧线有什么限制吗?如果弧不能适合一个完整的圆会发生什么?答案会是最大的合适吗?

你的意思是弧不能适合一个完整的圆?

所有的圆都是完美的圆,但我不知道可能的舍入的最大大小,或者如何计算它的位置。这是一些描述问题的图像。

【问题讨论】:

虽然您的图片很好并且清楚地表明了您的要求,但缺少一些对问题范围有很大影响的细节:1) 内弧和外弧是否总是同心的(具有相同的中心)? 2) 当询问您可以进行的最大 舍入时,对另一个较小的圆圈有何限制?它是否需要至少有一些半径?否则,您最终只会进行一次舍入。 3) 什么构成最大舍入?您是否尝试在上述两个示例之间进行选择?或者正在寻找... ... 或者找到这些案例中的任何一个都被认为是解决方案? 4) 两条弧线有什么限制吗?如果弧不能适合一个完整的圆会发生什么?答案会是最大的合适吗? 嘿大卫,我很震惊你找到了我的问题!我知道你的很多答案,并从他们身上学到了很多!所以我很高兴回答你的问题(我将编辑描述) 【参考方案1】:

假设坐标系的原点在内外大圆弧的中心点...

对于大圆与外缘相切的第一种情况,大圆的圆心为

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

【讨论】:

谢谢!,我实际上希望有一个没有循环的解决方案,但也许这不太容易。借助它,我能够计算最大半径并将其应用于弧段的其他开始和结束角度(90 度宽的弧除外)【参考方案2】:

如果没有显示线段的两端,问题就无法正确提出。假设每条线段是一个数据结构,它不仅维护端点,还维护每个点的半径,并且还知道这条线将连接到的下一个端点的角度。每个帽半径将从必须作为矩形描边的线段的长度中减去。假设您在点 B 和 C 之间有一条感兴趣的线,其中 B 连接到另一个(更长的)线段 A,C 连接到另一个(更长的)线段 D。如果线 BC 的长度为 10,帽半径 B 和帽半径 C都设置为4,那么你将只为线段的直线部分渲染长度为2的矩形,而长度4用于将圆弧绘制到A,另一个长度4用于将圆弧绘制到D。

此外,C 的最大帽半径不仅受 BC 和 B 的帽半径的约束,还受 CD 和 D 的帽半径的约束。

【讨论】:

而对于计算位置... 用于绘制谎言中心或内部/外部部分的圆弧的中心点将位于相交线之间角度的平分线上,并且将与绘制为矩形的直线上的端点等距。 (即:将点列表转换为线列表。将线列表转换为大写和线段的交替列表)。

以上是关于圆角:如何计算圆角半径?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 圆角半径和阴影问题

如何计算多边形的圆角?

如何实现具有圆角半径的自定义按钮

cad圆角怎么标注

iOS 13 - UISegmentedControl - 如何更改 selectedSegment 的圆角半径?

如何使用css让图片显示圆角