圆角:如何计算圆角半径?
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 的帽半径的约束。
【讨论】:
而对于计算位置... 用于绘制谎言中心或内部/外部部分的圆弧的中心点将位于相交线之间角度的平分线上,并且将与绘制为矩形的直线上的端点等距。 (即:将点列表转换为线列表。将线列表转换为大写和线段的交替列表)。以上是关于圆角:如何计算圆角半径?的主要内容,如果未能解决你的问题,请参考以下文章