import Diagrams.Prelude import Diagrams.Backend.Cairo.CmdLine import Test.QuickCheck -- Center and signed radius data Circle = Circle { center :: P2, sRadius :: Double } descartesR sgn r1 r2 r3 = (r1 * r2 * r3) / (r1*r2 + r1*r3 + r2*r3 + sgn * 2 * sqrt(r1*r2*r3*(r1+r2+r3))) prop_descartes (NonZero r1) (NonZero r2) (NonZero r3) = abs (2*(e1*e1 + e2*e2 + e3*e3 + e4*e4) - (e1+e2+e3+e4)^2) < 1e-10 where [e1,e2,e3,e4] = map (1/) [r1,r2,r3,r4] r4 = descartesInR r1 r2 r3 descartesOutR = descartesR (-1) descartesInR = descartesR 1 main = defaultMain (circle (descartesInR 1 1 1) <> circle (descartesOutR 1 1 1) <> circles) circles = decoratePath (polygon with {sides=3} # scale (2/sqrt 3)) (repeat unitCircle)