如何在没有三角函数的情况下绘制连接两个圆轮廓的线?

How to draw a line that connects two circle outlines without trig functions?

如何在不使用三角函数的情况下计算连接两个圆的最短线的端点?

Two circles and a line

下面解释的原理非常直观 - 我们不是分析 two-dimensional 任务,而是将其分为两个 one-dimensional 操作。准确地说,我们将已知圆心的 x 和 y 坐标值分开并分别计算值。我们计算新的 x' 和 y' 只知道圆心之间的距离和所述圆的半径与中心之间距离的比例。

(x1 , y1 ), (x2 , y2 ), r1, r2 - known values
(x1', y1'), (x2', y2') - values we are looking for

计算我们要查找的值所需的全部操作是以下操作:

ΔY = y2 - y1           
ΔX = x2 - x1  
L = √(ΔX² + ΔY²)
r1L = r1 / L
r2L = r2 / L  
y1' = y1 + ΔY * r1L 
y2' = y2 - ΔY * r2L 
x1' = x1 + ΔX * r1L 
x2' = x2 - ΔX * r2L 

你得到 (x1', y1')(x2', y2')


这个计算背后的理论如下...

有两个圆,其半径为 r1 和 r2,圆心坐标为 (x1, y1) 和 (x2, y2),我们需要找到点 (x1', y1') 和 (x2', y2')连接两个中心的线与圆相交。

有了两个圆心(x1,y1)和(x2,y2),我们计算出ΔX和ΔY,后面会用到两次。

ΔY = y2 - y1            It is worth noting here that Δ can
ΔX = x2 - x1            be negative if x1 > x2 or y1 > y2

先用毕达哥拉斯定理计算中心距离:

L = √(ΔX² + ΔY²)

然后第二次使用半径与 L(整条线的长度)的比率来计算偏移量。

现在看下面的图,我们看到我们有一个梯形,其中一条边是 y 轴,另一条边是连接圆心的线。

我们知道第一个圆的半径是r1,圆心之间的长度是L。 我们也知道平行于基线的线分裂梯形以相同的比例分裂它的边。 因为我们知道距离 L 和半径 r1,所以我们可以计算出比率。

r1L = r1 / L

现在我们可以使用这个比率来得到点(0, y2')。

y1' = y1 + ΔY * r1L 

现在我们得到了(x1', y1')坐标的y分量。我们对 y2' 做类似的事情。

r2L = r2 / L
y2' = y2 - ΔY * r2L 

为了得到 x1' 和 x2',我们使用 x 轴形成另一个梯形并类似地重复上面显示的步骤。

x1' = x1 + ΔX * r1L 
x2' = x2 - ΔX * r2L 

结果我们得到了新的端点 (x1', y1') 和 (x2', y2')。

需要注意的是,x1' 和 y1' 的值是通过相加计算的,而 x2' 和 y2' 的值是通过从它们中减去计算的。之所以如此,是因为我们最初假设(x1, y1)更接近中心坐标(0, 0),即x1 < x2y1 < y2,在ΔY = y2 - y1ΔX = x2 - x1 .

想象一下,在两个圆的中心之间有一条线。找到该线与圆相交的点。你的线在这两点之间。

调用两个圆的圆心(x1,y1)和(x2,y2)。

ΔY = y2-y1   \___ for the whole line (blue-red-blue)
ΔX = x2-x1   /

圆心之间的直线长度为:

L = √(ΔX² + ΔY²)

使用每个圆的半径 r,您可以计算从中心到蓝线另一端的 Δy 和 Δx:

Δx = r/L ΔX
Δy = r/L ΔY

所以这些点是 (x1+Δx, y1+Δy) 并且对于另一条蓝线也是如此。 现在你有了红线的两个端点。

现在,在每一端都需要一条线(蓝色部分),其长度等于相关圆的半径。这时候你可以忘掉圆圈了!