Total circles area: Difference between revisions

Added XPL0 example.
(→‎Scanline version: Now uses new core library method.)
(Added XPL0 example.)
Line 3,561:
<pre>
Approximate area = 21.565036588498
</pre>
 
=={{header|XPL0}}==
Gird sampling. Takes 27 seconds on Pi4.
<lang XPL0>real Circles, MinX, MaxX, MinY, MaxY, Temp, X, Y, DX, DY, Area;
int N, Cnt1, Cnt2;
def Del = 0.0005;
def Inf = float(-1>>1);
[\ X Y R
Circles:= [
1.6417233788, 1.6121789534, 0.0848270516,
-1.4944608174, 1.2077959613, 1.1039549836,
0.6110294452, -0.6907087527, 0.9089162485,
0.3844862411, 0.2923344616, 0.2375743054,
-0.2495892950, -0.3832854473, 1.0845181219,
1.7813504266, 1.6178237031, 0.8162655711,
-0.1985249206, -0.8343333301, 0.0538864941,
-1.7011985145, -0.1263820964, 0.4776976918,
-0.4319462812, 1.4104420482, 0.7886291537,
0.2178372997, -0.9499557344, 0.0357871187,
-0.6294854565, -1.3078893852, 0.7653357688,
1.7952608455, 0.6281269104, 0.2727652452,
1.4168575317, 1.0683357171, 1.1016025378,
1.4637371396, 0.9463877418, 1.1846214562,
-0.5263668798, 1.7315156631, 1.4428514068,
-1.2197352481, 0.9144146579, 1.0727263474,
-0.1389358881, 0.1092805780, 0.7350208828,
1.5293954595, 0.0030278255, 1.2472867347,
-0.5258728625, 1.3782633069, 1.3495508831,
-0.1403562064, 0.2437382535, 1.3804956588,
0.8055826339, -0.0482092025, 0.3327165165,
-0.6311979224, 0.7184578971, 0.2491045282,
1.4685857879, -0.8347049536, 1.3670667538,
-0.6855727502, 1.6465021616, 1.0593087096,
0.0152957411, 0.0638919221, 0.9771215985];
MinX:= +Inf; MaxX:= -Inf;
MinY:= +Inf; MaxY:= -Inf;
for N:= 0 to 25*3-1 do
[Temp:= Circles(N+0);
if Temp < 0.0 then Temp:= Temp - Circles(N+2)
else Temp:= Temp + Circles(N+2);
if Temp < MinX then MinX:= Temp;
if Temp > MaxX then MaxX:= Temp;
Temp:= Circles(N+1);
if Temp < 0.0 then Temp:= Temp - Circles(N+2)
else Temp:= Temp + Circles(N+2);
if Temp < MinY then MinY:= Temp;
if Temp > MaxY then MaxY:= Temp;
Circles(N+2):= sq(Circles(N+2)); \square for speed
N:= N+2;
];
Cnt1:= 0; Cnt2:= 0;
Y:= MinY;
repeat X:= MinX;
repeat
loop [for N:= 0 to 25*3-1 do
[DX:= X - Circles(N+0);
DY:= Y - Circles(N+1);
if DX*DX + DY*DY <= Circles(N+2) then
[Cnt1:= Cnt1+1; quit];
N:= N+2;
];
quit;
];
Cnt2:= Cnt2+1;
X:= X + Del;
until X >= MaxX;
Y:= Y + Del;
until Y >= MaxY;
Area:= (MaxX-MinX) * (MaxY-MinY); \of bounding box
Area:= float(Cnt1)/float(Cnt2) * Area; \of circles
RlOut(0, Area);
]</lang>
 
{{out}}
<pre>
21.56188
</pre>
 
772

edits