C# 直线和圆弧之间圆角的算法

C# 直线和圆弧之间圆角的算法,c#,wpf,algorithm,automatic-ref-counting,rounded-corners,C#,Wpf,Algorithm,Automatic Ref Counting,Rounded Corners,我需要一个算法,可以绕过一条直线和一条圆弧之间的一个角。我得到的起始信息是P0起点、P角点、P2终点、P和P2之间的弧的R2半径以及圆角的R半径(在第二张图片上) 输出或需要的点是横截面C0和C2以及圆O的中心点 没有足够的规格来选择唯一的弧。你需要弄清楚你想要什么样的端点。然后求解与这两个点相切的椭圆。有关方程式,请参见。我推荐一个数学软件包(如SciKit)为您求解。在我的草图中,BF是给定线段的一部分(F还不知道),C是给定圆弧的中心,B是粗略共轭点c是平行于BF的直线,|GF |=|G

我需要一个算法,可以绕过一条直线和一条圆弧之间的一个角。我得到的起始信息是P0起点、P角点、P2终点、P和P2之间的弧的R2半径以及圆角的R半径(在第二张图片上)

输出或需要的点是横截面C0和C2以及圆O的中心点


没有足够的规格来选择唯一的弧。你需要弄清楚你想要什么样的端点。然后求解与这两个点相切的椭圆。有关方程式,请参见。我推荐一个数学软件包(如SciKit)为您求解。

在我的草图中,BF是给定线段的一部分(F还不知道),C是给定圆弧的中心,B是粗略共轭点
c
是平行于BF的直线,
|GF |=|GH |=r
-小圆弧的半径

为了实现平滑共轭,点F中与小圆弧相切的切线应与BF方向共线,因此GF与BF垂直,而点H中与两条圆弧相切的切线应重合-因此半径向量CH和GH位于同一条线上。

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

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

距离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)
 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)
产生的平滑圆弧为
c-f

快速检查2: 线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)
 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

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


您的目标可能重复:Winforms、WPF、ASP。。?始终正确标记您的问题!非常感谢,这很好,但我有几个问题。如何确定哪个根是有效的?如果根是复数,如何求解小圆心?我认为对于“好”的配置,有效根是较小的正根(但我没有考虑所有可能的配置)。如果根是复数的-那么对于C1连续性和给定的小半径,选择的方法没有解决方案)可能我计算的方向单位向量错误,所以这就是为什么我得到复数根。这些是我用来计算dx=(A.X-B.X)/Math.Abs(A.X-B.X)和dy=(A.Y-B.Y)/Math.Abs(A.Y-B.Y)的方程是的,错了
Len=Sqrt((A.X-B.X)^2+(A.Y-B.Y)^2);dx=(A.X-B.X)/Len,dy=(A.Y-B.Y)/Len
(对于Len,使用例程Math.Hypot,如果可用。或支持例程(规格化等)的向量)是否可以实现此解决方案,以舍入两个圆弧之间的角,而不是直线和圆弧