0

このリンクを使用して、円の交点を見つけようとしています。

ここに画像の説明を入力

次の注記では、平面上の 2 つの円の交点を見つける方法について説明します。次の表記法が使用されます。目的は、2 つの点 P3 = (x3, y3) が存在する場合に見つけることです。

まず、円の中心間の距離 d を計算します。d = ||P1 - P0||。

d > r0 + r1 の場合、解はなく、円は分離しています。d < |r0 - r1| の場合 一方の円が他方の円の中に含まれているため、解はありません。d = 0 かつ r0 = r1 の場合、円は一致し、解は無数にあります。2 つの三角形 P0P2P3 と P1P2P3 を考えると、次のように書くことができます。

a2 + h2 = r02 および b2 + h2 = r12

d = a + b を使用して、a について解くことができます。

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

2 つの円が 1 点で接触すると、これが r0 になることが容易に示されます。つまり、 d = r0 + r1 a を最初の方程式 h2 = r02 - a2 に代入して h を解きます。

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つの円の半径の合計と比較すると、両方の円の半径よりも短い距離が得られますが、これは真実ではありません。

4

1 に答える 1

1

考えられる解決策の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']

あなたは私の算数をチェックしたいと思うでしょう。(更新: ポイントを計算するために 2 つの円の中心の間のポイントを使用していませんでした。)

于 2012-09-12T07:15:17.827 に答える