用于在线和弧之间对角进行舍入的算法

时间:2018-03-22 19:23:40

标签: c# wpf algorithm automatic-ref-counting rounded-corners

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

Corner between line and arc

输出或想要的点是圆截面C0和C2以及圆弧圆的中心点-O

Rounded corner between line and arc

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

为了实现平滑共轭,F点的小弧切线应与BF方向共线,因此GF垂直于BF,H点的两个弧的切线应重合 - 因此半径矢量CH和GH位于同一行。 enter image description here

设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

enter image description here

快速检查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

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

enter image description here