#!/usr/bin/env python3 import math c2=[(15,90),(90,90),(70,55),(85,20),(120,20),(50,20),(125,90),(30,55),(15,20),(110,55),(50,90)] c1=[(5,45),(5,55),(135,60),(135,40),(135,50)] cir=[(x,y,20) for x,y in c2]+[(x,y,5) for x,y in c1] 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))) 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)])) 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,'target',.88*15400,'margin',A-.88*15400)