RosettaCodeData/Task/Total-circles-area/FreeBASIC/total-circles-area.basic
2023-07-01 13:44:08 -04:00

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