64 lines
2.4 KiB
Text
64 lines
2.4 KiB
Text
#define dx 0.0001
|
|
|
|
'read in the data; I reordered them in descending order of radius
|
|
'This maximises our chance of being able to break early, saving run time,
|
|
'and we needn't bother finding out which circles are entirely inside others
|
|
data -0.5263668798,1.7315156631,1.4428514068
|
|
data -0.1403562064,0.2437382535,1.3804956588
|
|
data 1.4685857879,-0.8347049536,1.3670667538
|
|
data -0.5258728625,1.3782633069,1.3495508831
|
|
data 1.5293954595,0.0030278255,1.2472867347
|
|
data 1.4637371396,0.9463877418,1.1846214562
|
|
data -1.4944608174,1.2077959613,1.1039549836
|
|
data 1.4168575317,1.0683357171,1.1016025378
|
|
data -0.249589295,-0.3832854473,1.0845181219
|
|
data -1.2197352481,0.9144146579,1.0727263474
|
|
data -0.6855727502,1.6465021616,1.0593087096
|
|
data 0.0152957411,0.0638919221,0.9771215985
|
|
data 0.6110294452,-0.6907087527,0.9089162485
|
|
data 1.7813504266,1.6178237031,0.8162655711
|
|
data -0.4319462812,1.4104420482,0.7886291537
|
|
data -0.6294854565,-1.3078893852,0.7653357688
|
|
data -0.1389358881,0.109280578,0.7350208828
|
|
data -1.7011985145,-0.1263820964,0.4776976918
|
|
data 0.8055826339,-0.0482092025,0.3327165165
|
|
data 1.7952608455,0.6281269104,0.2727652452
|
|
data -0.6311979224,0.7184578971,0.2491045282
|
|
data 0.3844862411,0.2923344616,0.2375743054
|
|
data 1.6417233788,1.6121789534,0.0848270516
|
|
data -0.1985249206,-0.8343333301,0.0538864941
|
|
data 0.2178372997,-0.9499557344,0.0357871187
|
|
|
|
function dist(x0 as double, y0 as double, x1 as double, y1 as double) as double
|
|
'distance between two points in 2d space
|
|
return sqr( (x1-x0)^2 + (y1-y0)^2 )
|
|
end function
|
|
|
|
dim as double x(1 to 25), y(1 to 25), r(1 to 25), gx, gy, A0, A1, A2, A
|
|
dim as integer i, cx, cy
|
|
|
|
for i = 1 to 25
|
|
read x(i), y(i), r(i)
|
|
next i
|
|
|
|
for gx = -2.6 to 2.9 step dx 'sample points on a grid
|
|
cx += 1
|
|
for gy = -2.3 to 3.2 step dx
|
|
cy += 1
|
|
for i = 1 to 25
|
|
if dist(gx, gy, x(i), y(i)) <= r(i) then
|
|
'if our grid point is in the circle
|
|
A2 += dx^2 'add the area of a grid square
|
|
if cx mod 2 = 0 and cy mod 2 = 0 then A1 += 4*dx^2
|
|
if cx mod 4 = 0 and cy mod 4 = 0 then A0 += 16*dx^2
|
|
'also keep track of coarser grid areas of twice and four times the size
|
|
'You'll see why in a moment
|
|
exit for
|
|
end if
|
|
next i
|
|
next gy
|
|
next gx
|
|
|
|
'use Shanks method to refine our estimate of the area
|
|
A = (A0*A2-A1^2) / (A0 + A2 - 2*A1)
|
|
print A0, A1, A2, A
|