質問

I am trying to find intersecting Points for Circle with help of this link.

enter image description here

The following note describes how to find the intersection point(s) between two circles on a plane, the following notation is used. The aim is to find the two points P3 = (x3, y3) if they exist.

First calculate the distance d between the center of the circles. d = ||P1 - P0||.

If d > r0 + r1 then there are no solutions, the circles are separate. If d < |r0 - r1| then there are no solutions because one circle is contained within the other. If d = 0 and r0 = r1 then the circles are coincident and there are an infinite number of solutions. Considering the two triangles P0P2P3 and P1P2P3 we can write

a2 + h2 = r02 and b2 + h2 = r12

Using d = a + b we can solve for a,

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

It can be readily shown that this reduces to r0 when the two circles touch at one point, ie: d = r0 + r1 Solve for h by substituting a into the first equation, h2 = r02 - a2 So

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

And finally, P3 = (x3,y3) in terms of P0 = (x0,y0), P1 = (x1,y1) and P2 = (x2,y2), is

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]

When i compare distance with sum of radius of 2 circles is get distance less than radius of both circles which i know is not true,when circles are seprate Am i calculating radius correctly or not idk there is some problem with this help.

役に立ちましたか?

解決

One possible solution is this:

| 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']

You'll want to check my arithmetic. (Update: I hadn't used the point between the two circle centres to calculate the points.)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top