在线和圆弧之间圆角的算法

Algorithm for rounding a corner between line and arc

我需要一种可以使直线和圆弧之间的角变圆的算法。我有的开始信息是P0-起点,P-角点,P2-终点,R2-P和P2之间的圆弧半径和R-圆角半径(在第二张图片上)。

输出或想要的点是横截面C0和C2和圆心-O

规格不足,无法选择独特的弧线。你需要弄清楚你想要什么端点。然后求解与这两个点都相切的椭圆。有关方程式,请参阅 Wikipedia/ellipse。我推荐一个数学包(例如SciKit)来帮你解决。

在我的草图中,BF 是给定线段的一部分(F 尚不清楚),C 是给定弧的中心,B 是粗接合点。 c是直线,平行于BF,|GF|=|GH| = r-小圆弧的半径。

为了平滑共轭,F 点小圆弧的切线应与 BF 方向共线,因此 GF 垂直于 BF,H 点两条圆弧的切线应重合 - 因此 radius-vectors CH 和GH在同一条线上。

设BF段的单位方向向量为ud=(dx,dy),则单位法线为un=(-dy, dx)。 (BF 另一侧的圆弧法线取反)

小圆弧G的中心有坐标(其中t为未知参数-BF的长度)

G = B + ud * t + un * r

距离GC是圆弧半径之差,所以

 |G - C| = |R - r| 
   or in coordinates:
(B.x + dx * t - dy * r - C.x)^2 + (B.y + dy * t + dx * r - C.y)^2 = (R - r)^2

打开括号,求解未知t的二次方程。如果有解,选择右根,得到共轭弧G的中心及其两端的坐标

快速检查1: 直线 Y=5,R=5 的大圆弧,我们想要 r=2

的小圆弧
 B=(5,5)
 ud=(-1,0)
 un=(0,-1)
 (5-t)^2 + (5-2-5)^2 = (5-2)^2
 solution gives 
 t = 5 +/- Sqrt(5), the second root is valid
 E = (5 - (5 - Sqrt(5)), 3) = (2.23, 3)

生成的平滑圆弧是 c-f

快速检查 2: 直线 Y=5,R=5 的大圆弧,我们想要 r=2

的小圆弧
 B=(5,5)
 big arc center (H here) = (1,2)  
 ud=(-1,0)
 un=(0,-1)
 (4-t)^2 + (5-2-2)^2 = (5-2)^2
 solution gives 
 t = 4 +/- Sqrt(8), the second root is valid
 E = (5 - (4 - Sqrt(8)), 3) = (3.83, 3)

生成的平滑圆弧是 F-G

(在这两种情况下,较大的根对应于与大弧的互补部分的共轭)