NB.I propose this solution.  The posted solutions are algebraic.

NB. amoeba is the simplex optimization method found at www.jsoftware.com

require'amoeba'['/usr/local/j64-602/addons/math/misc/amoeba.ijs'

NB. y is Cx0 Cy0 R0  Cx1 Cy1 R1  Cx2 Cy2 R2
NB. x are radius scale factors to control which circles are included
NB.   in the common tangent circle.  1 to surround, _1 to exclude.
NB. returns (center, radius); final simplex volume
apollonius =: 3 :0
 1 apollonius y
:
 a=.9$0 0 1              NB. boolean selection vector
 c=.3 2$(-.a)#,y         NB. centers
 r=.x*a#,y               NB. radii
 v=.1e_20                NB. goal simplex volume
 NB. scale the problem rather than the volume?
 d=:r 2 : 'm + [: +/"1&.:*: n -"1 ]' c NB. distances to tangents
 s=.([: +/ [: *:@, -/~@:d) amoeba v c              NB. solution
 avg =. +/ % #
 ((, avg@:d)&.:>@:{. , {:)s
)

NB. all 8 solutions
(<:+:#:i.8)apollonius"1 _ ] _1 1 1,4 2 2,:1 _3 3


NB........graphical demonstration...........

load'graph'

p0 =: 1,.~|:2 1 o./ 2p1 * (i. % <:) 80

draw =: 4 : 0
 gdclose name=:'apollo'
 gdopen name
 gdcolor GREEN
 gdpolygon ,/"2 p0(+/ .*)("_ _1)0.1*((0 1,3 4,:6 7){,y),"2 1~(2 5
8{,y)*/=i.2
 gdcolor RED
 gdlines ,p0+/ .*0.1*(2{.,x),~({:,x)*=i.2
 gdshow name
)

(draw~ >@{.@:((-_1 1 1)&apollonius))_1 1 1,4 2 2,:1 _3 3


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to