圆形变形的相交点

时间:2012-09-12 01:30:42

标签: geometry smalltalk pharo morphic

我试图通过此链接找到圆点的交叉点。

enter image description here

以下注释描述了如何在平面上找到两个圆之间的交点,使用以下符号。目的是找到两个点P3 =(x3,y3),如果存在的话。

首先计算圆心之间的距离d。 d = || P1 - P0 ||。

如果d> r0 + r1然后没有解决方案,圆圈是分开的。 如果d< | r0 - r1 |然后没有解决方案,因为一个圆圈包含在另一个圆圈内。 如果d = 0且r0 = r1则圆圈重合并且存在无限数量的解。 考虑到两个三角形P0P2P3和P1P2P3,我们可以写

a2 + h2 = r02且b2 + h2 = r12

使用d = a + b我们可以求解a,

a =(r02-r12 + d2)/(2 d)

可以很容易地证明,当两个圆圈在一点接触时,这会降低到r0,即:d = r0 + r1 通过将a代入第一个等式来求解h,h2 = r02-a2 所以

P2 = P0 + a(P1-P0)/ d

最后,就P0 =(x0,y0),P1 =(x1,y1)和P2 =(x2,y2)而言,P3 =(x3,y3)是

x3 = x2 + - h(y1-y0)/ d

y3 = y2 - + h(x1-x0)/ d http://paulbourke.net/geometry/2circle/

b:=CircleMorph new.
b center: 60@60.
b openInWorld.
b1:=CircleMorph new.
b center: 100@100.
b1 openInWorld.
d:= b1 center - b center. // distance between 2 circles
r1:= (((b center x abs)squared +(b  center y abs)squared)sqrt).
r2:= (((b1 center x abs)squared +(b1  center y abs)squared)sqrt).
r3:= r1+ r2.
(d) > (r3) ifTrue:[Transcript show:'Circles are seprate';cr]

当我将距离与2个圆的半径之和进行比较时得到的距离小于两个圆的半径,我知道这不是真的,当圆圈是分开的时我正确地计算半径或者没有idk这个帮助有一些问题。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是:

| b b1 d r1 r2 r3 |
b := CircleMorph new.
b center: 60@60.
b bounds: (Rectangle origin: 100@40 corner: 40@100).
b openInWorld.
b1 := CircleMorph new.
b center: 100@100.
b bounds: (Rectangle origin: 100@40 corner: 40@100).
b1 openInWorld.
r1 := b bounds width / 2.
r2 := b1 bounds width / 2.
r3 := r1+ r2.
(d < r3)
    ifTrue: [| a h mid |
        a := (r1 squared - r2 squared + d squared) / (2 * d).
        h := (r1 squared - a squared) sqrt.
        mid := (b1 center x - b center x) @ (b1 center y - b center y).
        {(mid x + (h * (b1 center y - b center y))) @ (mid y - (h * (b1 center x - b center x))).
        (mid x - (h * (b1 center y - b center y))) @ (mid y + (h * (b1 center x - b center x)))}]
    ifFalse: ['separate']

你想检查我的算术。 (更新:我没有使用两个圆心之间的点来计算点数。)