#!/usr/bin/env python3 import math c2=[(55,90),(55,20),(125,90),(90,20),(35,55),(20,20),(20,90),(110,55),(125,20),(75,55),(90,90)] sq=[(135,50),(135,60),(10,50),(10,60)] cir=[(x,y,20) for x,y in c2] def f(x): z=[] for a,b,r in cir: q=r*r-(x-a)**2 if q>0: d=math.sqrt(q);z.append((max(0,b-d),min(110,b+d))) for a,b in sq: if abs(x-a)<=5:z.append((max(0,b-5),min(110,b+5))) z.sort();s=0;lo=hi=None for a,b in z: if b<=a:continue if lo is None:lo,hi=a,b elif a>hi:s+=hi-lo;lo,hi=a,b elif b>hi:hi=b return s+(0 if lo is None else hi-lo) def sim(a,b,fa,fm,fb):return(b-a)*(fa+4*fm+fb)/6 def integ(a,b,fa,fm,fb,S,eps,dep=30): m=(a+b)/2;l=(a+m)/2;r=(m+b)/2;fl,fr=f(l),f(r);sl,sr=sim(a,m,fa,fl,fm),sim(m,b,fm,fr,fb) if dep==0 or abs(sl+sr-S)<15*eps:return sl+sr+(sl+sr-S)/15 return integ(a,m,fa,fl,fm,sl,eps/2,dep-1)+integ(m,b,fm,fr,fb,sr,eps/2,dep-1) xs=sorted(set([0,140]+[max(0,min(140,a+d)) for a,b,r in cir for d in (-r,0,r)]+[max(0,min(140,a+d)) for a,b in sq for d in (-5,5)])) A=0 for a,b in zip(xs,xs[1:]): fa,fm,fb=f(a),f((a+b)/2),f(b);A+=integ(a,b,fa,fm,fb,sim(a,b,fa,fm,fb),1e-7) print(A,A/15400,A-13552)