Jump to content

Total circles area: Difference between revisions

Added Algol 68
(Added Arturo implementation)
(Added Algol 68)
 
(26 intermediate revisions by 13 users not shown)
Line 55:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">T Circle
Float x, y, r
F (x, y, r)
Line 108:
count++
 
print(‘Approximated area: ’(count * dx * dy))</langsyntaxhighlight>
 
{{out}}
<pre>
Approximated area: 21.561559772
</pre>
 
=={{header|ALGOL 68}}==
{{Trans|Nim|which is a translation of Python}}
<syntaxhighlight lang="algol68">
BEGIN # caclulate an approximation to the total of some overlapping circles #
# translated from the Nim sample #
 
MODE CIRCLE = STRUCT( REAL x, y, r );
 
[]CIRCLE 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 )
);
 
OP SQR = ( REAL x )REAL: x * x;
 
PRIO MIN = 5;
OP MIN = ( []CIRCLE rc, PROC(CIRCLE)REAL f )REAL:
IF LWB rc > UPB rc
THEN 0
ELSE REAL result := f( rc[ LWB rc ] );
FOR c pos FROM LWB rc + 1 TO UPB rc DO
REAL v = f( rc[ c pos ] );
IF v < result THEN result := v FI
OD;
result
FI # MIN # ;
PRIO MAX = 5;
OP MAX = ( []CIRCLE rc, PROC(CIRCLE)REAL f )REAL:
IF LWB rc > UPB rc
THEN 0
ELSE REAL result := f( rc[ LWB rc ] );
FOR c pos FROM LWB rc + 1 TO UPB rc DO
REAL v = f( rc[ c pos ] );
IF v > result THEN result := v FI
OD;
result
FI # MAX # ;
 
REAL x min = circles MIN ( ( CIRCLE it )REAL: x OF it - r OF it );
REAL x max = circles MAX ( ( CIRCLE it )REAL: x OF it + r OF it );
REAL y min = circles MIN ( ( CIRCLE it )REAL: y OF it - r OF it );
REAL y max = circles MAX ( ( CIRCLE it )REAL: y OF it + r OF it );
 
INT box side = 500;
 
REAL dx = ( x max - x min ) / box side;
REAL dy = ( y max - y min ) / box side;
 
INT count := 0;
 
FOR r FROM 0 TO box side - 1 DO
REAL y = y min + ( r * dy );
FOR c FROM 0 TO box side - 1 DO
REAL x = x min + ( c * dx );
BOOL xy in circle := FALSE;
FOR c pos FROM LWB circles TO UPB circles WHILE NOT xy in circle DO
CIRCLE curr circle = circles[ c pos ];
IF SQR ( x - x OF curr circle ) + SQR ( y - y OF curr circle ) <= SQR r OF curr circle THEN
count +:= 1;
xy in circle := TRUE
FI
OD
OD
OD;
 
print( ( "Approximated area: ", fixed( count * dx * dy, -16, 14 ), newline ) )
 
END
</syntaxhighlight>
{{out}}
<pre>
Approximated area: 21.5615597720033
</pre>
 
Line 119 ⟶ 215:
{{trans|Python}}
 
<langsyntaxhighlight lang="rebol">circles: @[
@[ 1.6417233788 1.6121789534 0.0848270516]
@[neg 1.4944608174 1.2077959613 1.1039549836]
Line 172 ⟶ 268:
]
 
print ["Approximated area: " count * dx * dy]</langsyntaxhighlight>
 
{{out}}
Line 181 ⟶ 277:
===Montecarlo Sampling===
This program uses a Montecarlo sampling. For this problem this is less efficient (converges more slowly) than a regular grid sampling, like in the Python entry.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
#include <math.h>
Line 279 ⟶ 375:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>21.4498 +/- 0.0370 (65536 samples)
Line 299 ⟶ 395:
===Scanline Method===
This version performs about 5 million scanlines in about a second, result should be accurate to maybe 10 decimal points.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <string.h>
#include <stdlib.h>
Line 405 ⟶ 501:
 
return 0;
}</langsyntaxhighlight>
{{out}}
area = 21.5650366037 at 5637290 scanlines
 
 
=={{header|C#}}==
 
===Scanline Method===
 
{{works with| .NET 8}}
{{trans|Java}}
<syntaxhighlight lang="C#">
using System;
using System.Collections.Generic;
using System.Linq;
 
public class Program
{
public static void Main(string[] args)
{
const double precision = 0.000001;
Console.WriteLine($"Approximate area = {AreaScan(precision):F8}");
}
 
private static double AreaScan(double precision)
{
List<double> valuesY = new List<double>();
foreach (var circle in circles)
{
valuesY.Add(circle.CentreY + circle.Radius);
valuesY.Add(circle.CentreY - circle.Radius);
}
 
double min = valuesY.Min();
double max = valuesY.Max();
long minY = (long)Math.Floor(min / precision);
long maxY = (long)Math.Ceiling(max / precision);
double totalArea = 0.0;
for (long i = minY; i <= maxY; i++)
{
double y = i * precision;
double right = double.NegativeInfinity;
List<PairX> pairsX = new List<PairX>();
foreach (var circle in circles)
{
if (Math.Abs(y - circle.CentreY) < circle.Radius)
{
pairsX.Add(HorizontalSection(circle, y));
}
}
 
pairsX.Sort((one, two) => one.X1.CompareTo(two.X1));
foreach (var pairX in pairsX)
{
if (pairX.X2 > right)
{
totalArea += pairX.X2 - Math.Max(pairX.X1, right);
right = pairX.X2;
}
}
}
 
return totalArea * precision;
}
 
private static PairX HorizontalSection(Circle circle, double y)
{
double value = Math.Pow(circle.Radius, 2) - Math.Pow(y - circle.CentreY, 2);
double deltaX = Math.Sqrt(value);
return new PairX(circle.CentreX - deltaX, circle.CentreX + deltaX);
}
 
private record PairX(double X1, double X2);
private record Circle(double CentreX, double CentreY, double Radius);
private static readonly List<Circle> circles = new List<Circle>
{
new Circle(1.6417233788, 1.6121789534, 0.0848270516),
new Circle(-1.4944608174, 1.2077959613, 1.1039549836),
new Circle(0.6110294452, -0.6907087527, 0.9089162485),
new Circle(0.3844862411, 0.2923344616, 0.2375743054),
new Circle(-0.2495892950, -0.3832854473, 1.0845181219),
new Circle(1.7813504266, 1.6178237031, 0.8162655711),
new Circle(-0.1985249206, -0.8343333301, 0.0538864941),
new Circle(-1.7011985145, -0.1263820964, 0.4776976918),
new Circle(-0.4319462812, 1.4104420482, 0.7886291537),
new Circle(0.2178372997, -0.9499557344, 0.0357871187),
new Circle(-0.6294854565, -1.3078893852, 0.7653357688),
new Circle(1.7952608455, 0.6281269104, 0.2727652452),
new Circle(1.4168575317, 1.0683357171, 1.1016025378),
new Circle(1.4637371396, 0.9463877418, 1.1846214562),
new Circle(-0.5263668798, 1.7315156631, 1.4428514068),
new Circle(-1.2197352481, 0.9144146579, 1.0727263474),
new Circle(-0.1389358881, 0.1092805780, 0.7350208828),
new Circle(1.5293954595, 0.0030278255, 1.2472867347),
new Circle(-0.5258728625, 1.3782633069, 1.3495508831),
new Circle(-0.1403562064, 0.2437382535, 1.3804956588),
new Circle(0.8055826339, -0.0482092025, 0.3327165165),
new Circle(-0.6311979224, 0.7184578971, 0.2491045282),
new Circle(1.4685857879, -0.8347049536, 1.3670667538),
new Circle(-0.6855727502, 1.6465021616, 1.0593087096),
new Circle(0.0152957411, 0.0638919221, 0.9771215985)
};
}
</syntaxhighlight>
{{out}}
<pre>
Approximate area = 21.56503660
</pre>
 
 
 
=={{header|C++}}==
<syntaxhighlight lang="c++">
 
#include <algorithm>
#include <cfloat>
#include <cmath>
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <vector>
 
struct Pair_X {
double x1;
double x2;
 
bool operator <(const Pair_X& pair_x) const {
return x1 < pair_x.x1;
}
};
 
struct Circle {
double centre_x;
double centre_y;
double radius;
};
 
const std::vector<Circle> circles = {
Circle( 1.6417233788, 1.6121789534, 0.0848270516),
Circle(-1.4944608174, 1.2077959613, 1.1039549836),
Circle( 0.6110294452, -0.6907087527, 0.9089162485),
Circle( 0.3844862411, 0.2923344616, 0.2375743054),
Circle(-0.2495892950, -0.3832854473, 1.0845181219),
Circle( 1.7813504266, 1.6178237031, 0.8162655711),
Circle(-0.1985249206, -0.8343333301, 0.0538864941),
Circle(-1.7011985145, -0.1263820964, 0.4776976918),
Circle(-0.4319462812, 1.4104420482, 0.7886291537),
Circle( 0.2178372997, -0.9499557344, 0.0357871187),
Circle(-0.6294854565, -1.3078893852, 0.7653357688),
Circle( 1.7952608455, 0.6281269104, 0.2727652452),
Circle( 1.4168575317, 1.0683357171, 1.1016025378),
Circle( 1.4637371396, 0.9463877418, 1.1846214562),
Circle(-0.5263668798, 1.7315156631, 1.4428514068),
Circle(-1.2197352481, 0.9144146579, 1.0727263474),
Circle(-0.1389358881, 0.1092805780, 0.7350208828),
Circle( 1.5293954595, 0.0030278255, 1.2472867347),
Circle(-0.5258728625, 1.3782633069, 1.3495508831),
Circle(-0.1403562064, 0.2437382535, 1.3804956588),
Circle( 0.8055826339, -0.0482092025, 0.3327165165),
Circle(-0.6311979224, 0.7184578971, 0.2491045282),
Circle( 1.4685857879, -0.8347049536, 1.3670667538),
Circle(-0.6855727502, 1.6465021616, 1.0593087096),
Circle( 0.0152957411, 0.0638919221, 0.9771215985)
};
 
Pair_X horizontal_section(const Circle& circle, const double& y) {
const double value = circle.radius * circle.radius - ( y - circle.centre_y ) * ( y - circle.centre_y );
double delta_x = std::sqrt(value);
return Pair_X(circle.centre_x - delta_x, circle.centre_x + delta_x);
}
 
double area_scan(const double& precision) {
std::vector<double> y_values;
for ( const Circle& circle : circles ) {
y_values.emplace_back(circle.centre_y + circle.radius);
}
for ( const Circle& circle : circles ) {
y_values.emplace_back(circle.centre_y - circle.radius);
}
 
const double min = *min_element(y_values.begin(), y_values.end());
const double max = *max_element(y_values.begin(), y_values.end());
const int64_t min_y = std::floor(min / precision);
const int64_t max_y = std::ceil(max / precision);
 
double total_area = 0.0;
for ( int64_t i = min_y; i <= max_y; ++i ) {
double y = i * precision;
double right = -DBL_MAX;
 
std::vector<Pair_X> pairs_x;
for ( const Circle& circle : circles ) {
if ( std::fabs(y - circle.centre_y) < circle.radius ) {
pairs_x.emplace_back(horizontal_section(circle, y));
}
}
std::sort(pairs_x.begin(), pairs_x.end());
 
for ( const Pair_X& pair_x : pairs_x ) {
if ( pair_x.x2 > right ) {
total_area += pair_x.x2 - std::max(pair_x.x1, right);
right = pair_x.x2;
}
}
}
return total_area * precision;
}
 
int main() {
const double precision = 0.00001;
std::cout << "Approximate area = " << std::setprecision(9) << area_scan(precision);
}
</syntaxhighlight>
{{ out }}
<pre>
Approximate area = 21.5650366
</pre>
 
=={{header|D}}==
Line 413 ⟶ 723:
===Scanline Method===
{{trans|C}}
<langsyntaxhighlight lang="d">import std.stdio, std.math, std.algorithm, std.typecons, std.range;
 
alias Fp = real;
Line 526 ⟶ 836:
nSlicesX *= 2;
}
}</langsyntaxhighlight>
{{out}}
<pre>Input Circles: 25
Line 537 ⟶ 847:
{{trans|Haskell}}
This version is not fully idiomatic D, it retains some of the style of the Haskell version.
<langsyntaxhighlight lang="d">import std.stdio, std.typecons, std.math, std.algorithm, std.range;
 
struct Vec { double x, y; }
Line 704 ⟶ 1,014:
 
writefln("Area: %1.13f", circles.circlesArea);
}</langsyntaxhighlight>
{{out}}
<pre>Area: 21.5650366038564</pre>
The run-time is minimal (0.03 seconds or less).
 
=={{header|Delphi}}==
{{works with|Delphi|6.0}}
{{libheader|SysUtils,StdCtrls}}
 
 
<syntaxhighlight lang="Delphi">
 
type TCircle = record
X,Y: double;
R: double;
end;
 
 
const Circles: array [0..24] of TCircle =(
(X: 1.6417233788; Y: 1.6121789534; R: 0.0848270516),
(X: -1.4944608174; Y: 1.2077959613; R: 1.1039549836),
(X: 0.6110294452; Y: -0.6907087527; R: 0.9089162485),
(X: 0.3844862411; Y: 0.2923344616; R: 0.2375743054),
(X: -0.2495892950; Y: -0.3832854473; R: 1.0845181219),
(X: 1.7813504266; Y: 1.6178237031; R: 0.8162655711),
(X: -0.1985249206; Y: -0.8343333301; R: 0.0538864941),
(X: -1.7011985145; Y: -0.1263820964; R: 0.4776976918),
(X: -0.4319462812; Y: 1.4104420482; R: 0.7886291537),
(X: 0.2178372997; Y: -0.9499557344; R: 0.0357871187),
(X: -0.6294854565; Y: -1.3078893852; R: 0.7653357688),
(X: 1.7952608455; Y: 0.6281269104; R: 0.2727652452),
(X: 1.4168575317; Y: 1.0683357171; R: 1.1016025378),
(X: 1.4637371396; Y: 0.9463877418; R: 1.1846214562),
(X: -0.5263668798; Y: 1.7315156631; R: 1.4428514068),
(X: -1.2197352481; Y: 0.9144146579; R: 1.0727263474),
(X: -0.1389358881; Y: 0.1092805780; R: 0.7350208828),
(X: 1.5293954595; Y: 0.0030278255; R: 1.2472867347),
(X: -0.5258728625; Y: 1.3782633069; R: 1.3495508831),
(X: -0.1403562064; Y: 0.2437382535; R: 1.3804956588),
(X: 0.8055826339; Y: -0.0482092025; R: 0.3327165165),
(X: -0.6311979224; Y: 0.7184578971; R: 0.2491045282),
(X: 1.4685857879; Y: -0.8347049536; R: 1.3670667538),
(X: -0.6855727502; Y: 1.6465021616; R: 1.0593087096),
(X: 0.0152957411; Y: 0.0638919221; R: 0.9771215985)
);
 
 
procedure CalculateCircleArea(Memo: TMemo; BoxPoints: integer = 500);
var MinX,MinY,MaxX,MaxY,Area: double;
var X,Y,BoxScaleX,BoxScaleY: double;
var I,Row,Col,Count: integer;
var Circle: TCircle;
begin
{Get minimum and maximum size of all the circles}
MinX:=MaxDouble; MinY:=MaxDouble;
MaxX:=MinDouble; MaxY:=MinDouble;
for I:=0 to High(Circles) do
begin
Circle:=Circles[I];
MinX:=min(MinX,Circle.X - Circle.R);
MaxX:=max(MaxX,Circle.X + Circle.R);
MinY:=min(MinY,Circle.Y - Circle.R);
MaxY:=max(MaxY,Circle.Y + Circle.R);
end;
{Calculate scaling factor for X/Y dimension of box}
BoxScaleX:=(MaxX - MinX) / BoxPoints;
BoxScaleY:=(MaxY - MinY) / BoxPoints;
Count:=0;
{Iterate through all X/Y BoxPoints}
for Row:=0 to BoxPoints-1 do
begin
{Get scaled and offset Y pos}
Y:=MinY + Row * BoxScaleY;
for Col:=0 to BoxPoints-1 do
begin
{Get scaled and offset X pos}
X:=MinX + Col * BoxScaleX;
for I:=0 to High(Circles) do
begin
Circle:=Circles[I];
{Check to see if point is in circle}
if (sqr(X - Circle.X) + sqr(Y - Circle.Y)) <= (Sqr(Circle.R)) then
begin
Inc(Count);
{Only count one circle}
break;
end;
end;
end;
end;
{Calculate area from the box scale}
Area:=Count * BoxScaleX * BoxScaleY;
{Display it}
Memo.Lines.Add(Format('Side: %5d Points: %9.0n Area: %3.18f',[BoxPoints,BoxPoints*BoxPoints+0.0,Area]));
end;
 
 
 
procedure TotalCirclesArea(Memo: TMemo);
begin
CalculateCircleArea(Memo, 500);
CalculateCircleArea(Memo, 1000);
CalculateCircleArea(Memo, 1500);
CalculateCircleArea(Memo, 5000);
end;
</syntaxhighlight>
{{out}}
<pre>
Side: 500 Points: 250,000 Area: 21.5615597720033172
Side: 1,000 Points: 1,000,000 Area: 21.5638384878351026
Side: 5,000 Points: 25,000,000 Area: 21.5649556428787861
Side: 15,000 Points: 225,000,000 Area: 21.5650079689460341
 
Elapsed Time: 01:23.134 min
 
</pre>
 
 
=={{header|EasyLang}}==
<syntaxhighlight lang=easylang>
# with Montecarlo sampling
repeat
s$ = input
until s$ = ""
c[][] &= number strsplit s$ " "
.
# mark inner circles
for i to len c[][]
for j to len c[][]
if i <> j
dx = abs (c[i][1] - c[j][1])
dy = abs (c[i][2] - c[j][2])
d = sqrt (dx * dx + dy * dy)
if d + c[j][3] < c[i][3]
c[j][3] = 0
.
.
.
.
# find bounding box and remove marked circles
i = len c[][]
while i >= 1
if 0 = 1 and c[i][3] = 0
swap c[i][] c[len c[][]][]
len c[][] -1
else
maxx = higher (c[i][1] + c[i][3]) maxx
minx = lower (c[i][1] - c[i][3]) minx
maxy = higher (c[i][2] + c[i][3]) maxy
miny = lower (c[i][2] - c[i][3]) miny
c[i][3] = c[i][3] * c[i][3]
.
i -= 1
.
ntry = 10000000
print ntry & " samples ..."
for try to ntry
px = (maxx - minx) * randomf + minx
py = (maxy - miny) * randomf + miny
for i to len c[][]
dx = px - c[i][1]
dy = py - c[i][2]
if dx * dx + dy * dy <= c[i][3]
inside += 1
break 1
.
.
.
numfmt 4 0
print inside / ntry * (maxx - minx) * (maxy - miny)
#
input_data
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
</syntaxhighlight>
 
=={{header|EchoLisp}}==
Circles included in circles are discarded, and the circles are sorted : largest radius first. The circles bounding box is computed and divided into nxn rectangular tiles of size ds = dx * dy . Surfaces of tiles which are entirely included in a circle are added. Remaining tiles are divided into four smaller tiles, and the process is repeated : recursive call of procedure '''S''' , until ds < s-precision. To optimize things, a first pass - procedure '''S0''' - is performed, which assigns a list of candidates intersecting circles to each tile. This is quite effective, since the mean number of candidates circles for a given tile is 1.008 for n = 800.
 
<langsyntaxhighlight lang="scheme">
(lib 'math)
(define (make-circle x0 y0 r)
Line 833 ⟶ 1,337:
(// ds 2))
)))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 866 ⟶ 1,370:
→ 21.56503655935408
</pre>
 
=={{header|FreeBASIC}}==
Just a quick and dirty grid sampling method, with some convergence acceleration at the end.
<syntaxhighlight lang="freebasic">#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</syntaxhighlight>
 
{{out}}
Shows the area calculated by progressively finer grid sizes, and a refined estimate calculated form those.
<pre>21.56502992281657 21.56503478240848 21.56503694212367 21.56503866963273</pre>
 
=={{header|Go}}==
{{trans|Raku}} (more "based on" than a direct translation)
This is very memory inefficient and as written will not run on a 32 bit architecture (due mostly to the required size of the "unknown" Rectangle channel buffer to get even a few decimal places). It may be interesting anyway as an example of using channels with Go to split the work among several go routines (and processor cores).
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,101 ⟶ 1,676:
fmt.Printf("Area = %v±%v\n", avg, rng)
fmt.Printf("Area ≈ %.*f\n", 5, avg)
}</langsyntaxhighlight>
{{out}}
<pre>Starting with 25 circles.
Line 1,113 ⟶ 1,688:
===Grid Sampling Version===
{{trans|Python}}
<langsyntaxhighlight lang="haskell">data Circle = Circle { cx :: Double, cy :: Double, cr :: Double }
 
isInside :: Double -> Double -> Circle -> Bool
Line 1,165 ⟶ 1,740:
 
main = putStrLn $ "Approximated area: " ++
(show $ approximatedArea circles 5000)</langsyntaxhighlight>
{{out}}
<pre>Approximated area: 21.564955642878786</pre>
Line 1,171 ⟶ 1,746:
===Analytical Solution===
Breaking down circles to non-intersecting arcs and assemble zero winding paths, then calculate their areas. Pro: precision doesn't depend on a step size, so no need to wait longer for a more precise result; Con: probably not numerically stable in marginal situations, which can be catastrophic.
<langsyntaxhighlight lang="haskell">{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
import Data.List (sort)
Line 1,339 ⟶ 1,914:
Circle ( 0.0152957411) ( 0.0638919221) 0.9771215985]
 
main = print $ circlesArea circles</langsyntaxhighlight>
{{out}}
21.5650366038564
Line 1,356 ⟶ 1,931:
===Uniform Grid===
We're missing an error estimate. Because it happened to be fairly accurate isn't proof that it's good. Runtime is 16 seconds on a Lenovo T500 with plenty of memory and connected to the power grid.
<langsyntaxhighlight Jlang="j">NB. check points on a regular grid within the bounding box
 
 
Line 1,430 ⟶ 2,005:
FRACTION*AREA
 
NB. result is 21.5645</langsyntaxhighlight>
 
=={{header|Java}}==
Line 1,438 ⟶ 2,013:
depth limit is reached.
 
<syntaxhighlight lang="java">
<lang Java>
public class CirclesTotalAreaTotalCirclesArea {
 
/*
Line 1,563 ⟶ 2,138:
System.out.println("Error is " + Math.abs(21.56503660 - ans));
}
}</langsyntaxhighlight>
===Scanline Method===
Alternative example using the Scanline method.
<syntaxhighlight lang="java">
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public final class TotalCirclesArea {
 
public static void main(String[] args) {
final double precision = 0.000_001;
System.out.println(String.format("%s%.8f", "Approximate area = ", areaScan(precision)));
}
private static double areaScan(double precision) {
List<Double> valuesY = new ArrayList<Double>();
for ( Circle circle : circles ) {
valuesY.add(circle.centreY + circle.radius);
}
for ( Circle circle : circles ) {
valuesY.add(circle.centreY - circle.radius);
}
final double min = valuesY.stream().min(Double::compare).get();
final double max = valuesY.stream().max(Double::compare).get();
final long minY = (long) Math.floor(min / precision);
final long maxY = (long) Math.ceil(max / precision);
 
double totalArea = 0.0;
for ( long i = minY; i <= maxY; i++ ) {
final double y = i * precision;
double right = Double.NEGATIVE_INFINITY;
 
List<PairX> pairsX = new ArrayList<PairX>();
for ( Circle circle : circles ) {
if ( Math.abs(y - circle.centreY) < circle.radius ) {
pairsX.add(horizontalSection(circle, y));
}
}
Collections.sort(pairsX, (one, two) -> Double.compare(one.x1, two.x1) );
 
for ( PairX pairX : pairsX ) {
if ( pairX.x2 > right ) {
totalArea += pairX.x2 - Math.max(pairX.x1, right);
right = pairX.x2;
}
}
}
return totalArea * precision;
}
private static PairX horizontalSection(Circle circle, double y) {
final double value = circle.radius * circle.radius - ( y - circle.centreY ) * ( y - circle.centreY );
final double deltaX = Math.sqrt(value);
return new PairX(circle.centreX - deltaX, circle.centreX + deltaX);
}
private static record PairX(double x1, double x2) {}
private static record Circle(double centreX, double centreY, double radius) {}
private static final List<Circle> circles = List.of(
new Circle( 1.6417233788, 1.6121789534, 0.0848270516),
new Circle(-1.4944608174, 1.2077959613, 1.1039549836),
new Circle( 0.6110294452, -0.6907087527, 0.9089162485),
new Circle( 0.3844862411, 0.2923344616, 0.2375743054),
new Circle(-0.2495892950, -0.3832854473, 1.0845181219),
new Circle( 1.7813504266, 1.6178237031, 0.8162655711),
new Circle(-0.1985249206, -0.8343333301, 0.0538864941),
new Circle(-1.7011985145, -0.1263820964, 0.4776976918),
new Circle(-0.4319462812, 1.4104420482, 0.7886291537),
new Circle( 0.2178372997, -0.9499557344, 0.0357871187),
new Circle(-0.6294854565, -1.3078893852, 0.7653357688),
new Circle( 1.7952608455, 0.6281269104, 0.2727652452),
new Circle( 1.4168575317, 1.0683357171, 1.1016025378),
new Circle( 1.4637371396, 0.9463877418, 1.1846214562),
new Circle(-0.5263668798, 1.7315156631, 1.4428514068),
new Circle(-1.2197352481, 0.9144146579, 1.0727263474),
new Circle(-0.1389358881, 0.1092805780, 0.7350208828),
new Circle( 1.5293954595, 0.0030278255, 1.2472867347),
new Circle(-0.5258728625, 1.3782633069, 1.3495508831),
new Circle(-0.1403562064, 0.2437382535, 1.3804956588),
new Circle( 0.8055826339, -0.0482092025, 0.3327165165),
new Circle(-0.6311979224, 0.7184578971, 0.2491045282),
new Circle( 1.4685857879, -0.8347049536, 1.3670667538),
new Circle(-0.6855727502, 1.6465021616, 1.0593087096),
new Circle( 0.0152957411, 0.0638919221, 0.9771215985)
);
 
}
</syntaxhighlight>
{{ out }}
<pre>
Approximate area = 21.56503660
</pre>
 
=={{header|jq}}==
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq'''
 
'''Adapted from [[#Wren|Wren]]'''
 
This entry uses the "scanline" method after winnowing based on containment.
To compute the common area, horizontal strips are used in the manner of Cavalieri.
<syntaxhighlight lang="jq">
def Segment($x; $y): {$x, $y};
 
def Circle($x; $y; $r) : {$x, $y, $r};
 
def sq: . * .;
 
def distance($x; $y):
(($x.x - $y.x)|sq) + (($x.y - $y.y)|sq) | sqrt;
 
# Is the circle $c1 contained within the circle $c2?
def le($c1; $c2):
$c1 | distance(.;$c2) + .r <= $c2.r;
 
# Input: an array of circles, sorted by radius length.
# Output: the same array but pruned of any circle contained within another.
def winnow:
if length <= 1 then .
else .[0] as $circle
| .[1:] as $rest
| if any( $rest[]; le($circle; .) )
then $rest | winnow
else [$circle] + ($rest | winnow)
end
end;
# Input: an array of Circles
# Output: the area covered by all the circles
# Method: Cavalieri, horizontally
def areaScan(precision):
def segment($c; $y):
( (($c.r|sq) - (($y - $c.y)|sq) ) | sqrt) as $dr
| Segment($c.x - $dr; $c.x + $dr);
 
(sort_by(.r) | winnow) as $circles
| (map( .y + .r ) + map(.y - .r )) as $ys
| ((($ys | min) / precision)|floor) as $miny
| ((($ys | max) / precision)|ceil ) as $maxy
| reduce range($miny; 1 + $maxy) as $x ({total: 0};
($x * precision) as $y
| .right = - infinite
| ($circles
| map( select( (($y - .y)|length) < .r)) # length computes abs
| map( segment(.; $y)) ) as $segments
| reduce ($segments | sort_by(.x))[] as $p (.;
if $p.y > .right
then .total += $p.y - ([$p.x, .right]|max)
| .right = $p.y
else .
end ) )
| .total * precision ;
 
# The Task
def circles: [
Circle( 1.6417233788; 1.6121789534; 0.0848270516),
Circle(-1.4944608174; 1.2077959613; 1.1039549836),
Circle( 0.6110294452; -0.6907087527; 0.9089162485),
Circle( 0.3844862411; 0.2923344616; 0.2375743054),
Circle(-0.2495892950; -0.3832854473; 1.0845181219),
Circle( 1.7813504266; 1.6178237031; 0.8162655711),
Circle(-0.1985249206; -0.8343333301; 0.0538864941),
Circle(-1.7011985145; -0.1263820964; 0.4776976918),
Circle(-0.4319462812; 1.4104420482; 0.7886291537),
Circle( 0.2178372997; -0.9499557344; 0.0357871187),
Circle(-0.6294854565; -1.3078893852; 0.7653357688),
Circle( 1.7952608455; 0.6281269104; 0.2727652452),
Circle( 1.4168575317; 1.0683357171; 1.1016025378),
Circle( 1.4637371396; 0.9463877418; 1.1846214562),
Circle(-0.5263668798; 1.7315156631; 1.4428514068),
Circle(-1.2197352481; 0.9144146579; 1.0727263474),
Circle(-0.1389358881; 0.1092805780; 0.7350208828),
Circle( 1.5293954595; 0.0030278255; 1.2472867347),
Circle(-0.5258728625; 1.3782633069; 1.3495508831),
Circle(-0.1403562064; 0.2437382535; 1.3804956588),
Circle( 0.8055826339; -0.0482092025; 0.3327165165),
Circle(-0.6311979224; 0.7184578971; 0.2491045282),
Circle( 1.4685857879; -0.8347049536; 1.3670667538),
Circle(-0.6855727502; 1.6465021616; 1.0593087096),
Circle( 0.0152957411; 0.0638919221; 0.9771215985)
];
"Approximate area = \(circles | areaScan(1e-5))"
</syntaxhighlight>
{{output}}
<pre>
Approximate area = 21.565036588498263
</pre>
 
=={{header|Julia}}==
Simple grid algorithm. Borrows the xmin/xmax idea from the Python version. This algorithm is fairly slow.
<langsyntaxhighlight lang="julia">using Printf
 
# Total circles area: https://rosettacode.org/wiki/Total_circles_area
Line 1,600 ⟶ 2,365:
inside = 0
# For every point in my grid.
for x in linspaceLinRange(xmin, xmax, ngrid), y = linspaceLinRange(ymin, ymax, ngrid)
inside += any(r2 .> (x .- xc) .^ 2 + (y .- yc) .^ 2)
end
boxarea = (xmax - xmin) * (ymax - ymin)
Line 1,607 ⟶ 2,372:
end
 
println(@time main(xc, yc, r, 1000))</langsyntaxhighlight>
 
=={{header|Kotlin}}==
===Grid Sampling Version===
{{trans|Python}}
<langsyntaxhighlight lang="scala">// version 1.1.2
 
class Circle(val x: Double, val y: Double, val r: Double)
Line 1,665 ⟶ 2,430:
println("Approximate area = ${count * dx * dy}")
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,674 ⟶ 2,439:
===Scanline Version===
{{trans|Python}}
<langsyntaxhighlight lang="scala">// version 1.1.2
 
class Point(val x: Double, val y: Double)
Line 1,738 ⟶ 2,503:
val p = 1e-6
println("Approximate area = ${areaScan(p)}")
}</langsyntaxhighlight>
 
{{out}}
Line 1,745 ⟶ 2,510:
</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Simple solution needs Mathematica 10:
<syntaxhighlight lang="mathematica">data = ImportString[" 1.6417233788 1.6121789534 0.0848270516
 
<lang Mathematica>data = ImportString[" 1.6417233788 1.6121789534 0.0848270516
-1.4944608174 1.2077959613 1.1039549836
0.6110294452 -0.6907087527 0.9089162485
Line 1,775 ⟶ 2,539:
 
toDisk[{x_, y_, r_}] := Disk[{x, y}, r];
RegionMeasure[RegionUnion[toDisk /@ data]]</langsyntaxhighlight>
 
Returns 21.5650370663759
 
If one assumes that the input data is exact (all omitted digits are zero) then the exact answer can be derived by changing the definition of toDisk in the above code to
<langsyntaxhighlight Mathematicalang="mathematica">toDisk[{x_, y_, r_}] := Disk[{Rationalize[x, 0], Rationalize[y, 0]}, Rationalize[r, 0]]</langsyntaxhighlight>
The first 100 digits of the decimal expansion of the result are 21.56503660385639951717662965041005741103435843377395022310218015982077828980273399575555145558778509 so the solution given in the problem statement is incorrect after the first 16 decimal places (if we assume no bugs in the parts of Mathematica used here).
 
Line 1,787 ⟶ 2,551:
Simple grid algorithm. Borrows the xmin/xmax idea from the Python version. This algorithm is fairly slow.
 
<langsyntaxhighlight Matlablang="matlab">function res = circles()
 
tic
Line 1,831 ⟶ 2,595:
toc
 
end</langsyntaxhighlight>
 
=={{header|Nim}}==
===Grid Sampling Version===
{{trans|Python}}
<langsyntaxhighlight lang="nim">import sequtils
 
type Circle = tuple[x, y, r: float]
Line 1,890 ⟶ 2,654:
break
 
echo "Approximated area: ", float(count) * dx * dy</langsyntaxhighlight>
 
{{out}}
Line 1,897 ⟶ 2,661:
=={{header|Perl}}==
{{trans|Python}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 1,951 ⟶ 2,715:
}
 
printf "Approximated area: %.9f\n", $count * $dx * $dy;</langsyntaxhighlight>
{{out}}
<pre>Approximated area: 21.561559772</pre>
Line 1,957 ⟶ 2,721:
=={{header|Phix}}==
{{trans|Python}}
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>constant circles = {{ 1.6417233788, 1.6121789534, 0.0848270516},
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
{-1.4944608174, 1.2077959613, 1.1039549836},
<span style="color: #008080;">constant</span> <span style="color: #000000;">circles</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span> <span style="color: #000000;">1.6417233788</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.6121789534</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.0848270516</span><span style="color: #0000FF;">},</span>
{ 0.6110294452, -0.6907087527, 0.9089162485},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">1.4944608174</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.2077959613</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.1039549836</span><span style="color: #0000FF;">},</span>
{ 0.3844862411, 0.2923344616, 0.2375743054},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0.6110294452</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">0.6907087527</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.9089162485</span><span style="color: #0000FF;">},</span>
{-0.2495892950, -0.3832854473, 1.0845181219},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0.3844862411</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.2923344616</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.2375743054</span><span style="color: #0000FF;">},</span>
{ 1.7813504266, 1.6178237031, 0.8162655711},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.2495892950</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">0.3832854473</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.0845181219</span><span style="color: #0000FF;">},</span>
{-0.1985249206, -0.8343333301, 0.0538864941},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">1.7813504266</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.6178237031</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.8162655711</span><span style="color: #0000FF;">},</span>
{-1.7011985145, -0.1263820964, 0.4776976918},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.1985249206</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">0.8343333301</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.0538864941</span><span style="color: #0000FF;">},</span>
{-0.4319462812, 1.4104420482, 0.7886291537},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">1.7011985145</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">0.1263820964</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.4776976918</span><span style="color: #0000FF;">},</span>
{ 0.2178372997, -0.9499557344, 0.0357871187},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.4319462812</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.4104420482</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.7886291537</span><span style="color: #0000FF;">},</span>
{-0.6294854565, -1.3078893852, 0.7653357688},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0.2178372997</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">0.9499557344</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.0357871187</span><span style="color: #0000FF;">},</span>
{ 1.7952608455, 0.6281269104, 0.2727652452},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.6294854565</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1.3078893852</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.7653357688</span><span style="color: #0000FF;">},</span>
{ 1.4168575317, 1.0683357171, 1.1016025378},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">1.7952608455</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.6281269104</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.2727652452</span><span style="color: #0000FF;">},</span>
{ 1.4637371396, 0.9463877418, 1.1846214562},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">1.4168575317</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.0683357171</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.1016025378</span><span style="color: #0000FF;">},</span>
{-0.5263668798, 1.7315156631, 1.4428514068},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">1.4637371396</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.9463877418</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.1846214562</span><span style="color: #0000FF;">},</span>
{-1.2197352481, 0.9144146579, 1.0727263474},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.5263668798</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.7315156631</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.4428514068</span><span style="color: #0000FF;">},</span>
{-0.1389358881, 0.1092805780, 0.7350208828},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">1.2197352481</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.9144146579</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.0727263474</span><span style="color: #0000FF;">},</span>
{ 1.5293954595, 0.0030278255, 1.2472867347},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.1389358881</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.1092805780</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.7350208828</span><span style="color: #0000FF;">},</span>
{-0.5258728625, 1.3782633069, 1.3495508831},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">1.5293954595</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.0030278255</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.2472867347</span><span style="color: #0000FF;">},</span>
{-0.1403562064, 0.2437382535, 1.3804956588},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.5258728625</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.3782633069</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.3495508831</span><span style="color: #0000FF;">},</span>
{ 0.8055826339, -0.0482092025, 0.3327165165},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.1403562064</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.2437382535</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.3804956588</span><span style="color: #0000FF;">},</span>
{-0.6311979224, 0.7184578971, 0.2491045282},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0.8055826339</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">0.0482092025</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.3327165165</span><span style="color: #0000FF;">},</span>
{ 1.4685857879, -0.8347049536, 1.3670667538},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.6311979224</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.7184578971</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.2491045282</span><span style="color: #0000FF;">},</span>
{-0.6855727502, 1.6465021616, 1.0593087096},
<span style="color: #0000FF;">{</span> <span style="color: #000000;">1.4685857879</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">0.8347049536</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.3670667538</span><span style="color: #0000FF;">},</span>
{ 0.0152957411, 0.0638919221, 0.9771215985}},
<span style="color: #0000FF;">{-</span><span style="color: #000000;">0.6855727502</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.6465021616</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1.0593087096</span><span style="color: #0000FF;">},</span>
{x,y,r} = columnize(circles),
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0.0152957411</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.0638919221</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0.9771215985</span><span style="color: #0000FF;">}},</span>
r2 = sq_power(r,2)
<span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">(</span><span style="color: #000000;">circles</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">r2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
atom xMin = min(sq_sub(x,r)),
xMax = max(sq_add(x,r)),
<span style="color: #004080;">atom</span> <span style="color: #000000;">xMin</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)),</span>
yMin = min(sq_sub(y,r)),
<span style="color: #000000;">xMax</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)),</span>
yMax = max(sq_add(y,r)),
<span style="color: #000000;">yMin</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)),</span>
boxSide = 500,
<span style="color: #000000;">yMax</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">)),</span>
dx = (xMax - xMin) / boxSide,
<span style="color: #000000;">boxSide</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">500</span><span style="color: #0000FF;">,</span>
dy = (yMax - yMin) / boxSide,
<span style="color: #000000;">dx</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">xMax</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">xMin</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">boxSide</span><span style="color: #0000FF;">,</span>
count = 0
<span style="color: #000000;">dy</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">yMax</span> <span style="color: #0000FF;">-</span> <span style="color: #000000;">yMin</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">/</span> <span style="color: #000000;">boxSide</span><span style="color: #0000FF;">,</span>
sequence cxs = {}
<span style="color: #000000;">count</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
for s=1 to boxSide do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cxs</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
atom py = yMin + s * dy
<span style="color: #008080;">for</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">boxSide</span> <span style="color: #008080;">do</span>
sequence cy = sq_power(sq_sub(py,y),2)
<span style="color: #004080;">atom</span> <span style="color: #000000;">py</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">yMin</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dy</span>
for c=1 to boxSide do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cy</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">py</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
if s=1 then
<span style="color: #008080;">for</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">boxSide</span> <span style="color: #008080;">do</span>
atom px = xMin + c * dx
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
cxs = append(cxs,sq_power(sq_sub(px,x),2))
<span style="color: #004080;">atom</span> <span style="color: #000000;">px</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">xMin</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">c</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dx</span>
end if
<span style="color: #000000;">cxs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cxs</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sq_power</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">px</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">),</span><span style="color: #000000;">2</span><span style="color: #0000FF;">))</span>
sequence cx = cxs[c]
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for i=1 to length(circles) do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cxs</span><span style="color: #0000FF;">[</span><span style="color: #000000;">c</span><span style="color: #0000FF;">]</span>
if cx[i]+cy[i]<=r2[i] then count+=1 exit end if
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">circles</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
end for
<span style="color: #008080;">if</span> <span style="color: #000000;">cx</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">cy</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]<=</span><span style="color: #000000;">r2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> <span style="color: #000000;">count</span><span style="color: #0000FF;">+=</span><span style="color: #000000;">1</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
printf(1,"Approximate area = %.9f\n",{count * dx * dy})</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Approximate area = %.9f\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">count</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dx</span> <span style="color: #0000FF;">*</span> <span style="color: #000000;">dy</span><span style="color: #0000FF;">})</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 2,017 ⟶ 2,784:
===Grid Sampling Version===
This implements a regular grid sampling. For this problems this is more efficient than a Montecarlo sampling.
<langsyntaxhighlight lang="python">from collections import namedtuple
 
Circle = namedtuple("Circle", "x y r")
Line 2,072 ⟶ 2,839:
print "Approximated area:", count * dx * dy
 
main()</langsyntaxhighlight>
{{out}}
<pre>Approximated area: 21.561559772</pre>
 
===Scanline Conversion===
<langsyntaxhighlight lang="python">from math import floor, ceil, sqrt
 
def area_scan(prec, circs):
Line 2,133 ⟶ 2,900:
print "@stepsize", p, "area = %.4f" % area_scan(p, circles)
 
main()</langsyntaxhighlight>
===2D Van der Corput sequence===
[[File:Van_der_Corput_2D.png|200px|thumb|right]]
Line 2,143 ⟶ 2,910:
* Wholly obscured circles removed,
* And the square of the radius computed outside the main loops.
<langsyntaxhighlight lang="python">from __future__ import division
from math import sqrt
from itertools import count
Line 2,248 ⟶ 3,015:
 
if __name__ == '__main__':
main(circles)</langsyntaxhighlight>
The above is tested to work with Python v.2.7, Python3 and PyPy.
{{out}}
Line 2,272 ⟶ 3,039:
This requires the dmath module. Because of the usage of Decimal and trigonometric functions implemented in Python, this program takes few minutes to run.
{{trans|Haskell}}
<langsyntaxhighlight lang="python">from collections import namedtuple
from functools import partial
from itertools import repeat, imap, izip
Line 2,429 ⟶ 3,196:
print "Total Area:", circles_area(circles)
 
main()</langsyntaxhighlight>
{{out}}
<pre>Total Area: 21.56503660385639895908422492887814801839</pre>
Line 2,440 ⟶ 3,207:
(formerly Perl 6)
This subdivides the outer rectangle repeatedly into subrectangles, and classifies them into wet, dry, or unknown. The knowns are summed to provide an inner bound and an outer bound, while the unknowns are further subdivided. The estimate is the average of the outer bound and the inner bound. Not the simplest algorithm, but converges fairly rapidly because it can treat large areas sparsely, saving the fine subdivisions for the circle boundaries. The number of unknown rectangles roughly doubles each pass, but the area of those unknowns is about half.
<syntaxhighlight lang="raku" perl6line>class Point {
has Real $.x;
has Real $.y;
Line 2,616 ⟶ 3,383:
' diff: ', $diff.fmt('%9.6f'),
' error: ', ($diff - @unknowns * @unknowns[0].area).fmt('%e');
}</langsyntaxhighlight>
{{out}}
<pre>div: 2 unk: 4 est: 14.607153 wet: 0.000000 dry: 29.214306 diff: 29.214306 error: 0.000000e+000
Line 2,640 ⟶ 3,407:
These REXX programs use the grid sampling method.
===using all circles===
<langsyntaxhighlight lang="rexx">/*REXX program calculates the total area of (possibly overlapping) circles. */
parse arg box dig . /*obtain optional argument from the CL.*/
if box=='' | box==',' then box= 500 /*Not specified? Then use the default.*/
Line 2,690 ⟶ 3,457:
/*stick a fork in it, we're done. */
say 'Using ' box " boxes (which have " box**2 ' points) and ' dig " decimal digits,"
say 'the approximate area is: ' # * dx * dy</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the internal default input:}}
<pre>
Line 2,706 ⟶ 3,473:
 
This version also has additional information displayed.
<langsyntaxhighlight lang="rexx">/*REXX program calculates the total area of (possibly overlapping) circles. */
parse arg box dig . /*obtain optional argument from the CL.*/
if box=='' | box==',' then box= -500 /*Not specified? Then use the default.*/
Line 2,775 ⟶ 3,542:
say /*stick a fork in it, we're done. */
say 'Using ' box " boxes (which have " box**2 ' points) and ' dig " decimal digits,"
say 'the approximate area is: ' # * dx * dy</langsyntaxhighlight>
{{out|output|text=&nbsp; when using various number of boxes:}}
 
Line 2,846 ⟶ 3,613:
=={{header|Ruby}}==
Common code
<langsyntaxhighlight lang="ruby">circles = [
[ 1.6417233788, 1.6121789534, 0.0848270516],
[-1.4944608174, 1.2077959613, 1.1039549836],
Line 2,896 ⟶ 3,663:
circles.values_at(*select)
end
circles = select_circle(circles)</langsyntaxhighlight>
 
===Grid Sampling===
{{trans|Python}}
<langsyntaxhighlight lang="ruby">def grid_sample(circles, box_side=500)
# compute the bounding box of the circles
xmin, xmax, ymin, ymax = minmax_circle(circles)
Line 2,929 ⟶ 3,696:
n *= 2
puts "#{Time.now - t0} sec"
end</langsyntaxhighlight>
 
{{out}}
Line 2,942 ⟶ 3,709:
===Scanline Method===
{{trans|Python}}
<langsyntaxhighlight lang="ruby">def area_scan(prec, circles)
sect = ->(y) do
circles.select{|cx,cy,r| (y - cy).abs < r}.map do |cx,cy,r|
Line 2,972 ⟶ 3,739:
puts "%8.6f : %12.9f, %p sec" % [prec, area_scan(prec, circles), Time.now-t0]
prec /= 10
end</langsyntaxhighlight>
 
{{out}}
Line 2,984 ⟶ 3,751:
=={{header|Tcl}}==
This presents three techniques, a regular grid sampling, a pure Monte Carlo sampling, and a technique where there is a regular grid but then a vote of uniformly-distributed samples within each grid cell is taken to see if the cell is “in” or “out”.
<langsyntaxhighlight lang="tcl">set circles {
1.6417233788 1.6121789534 0.0848270516
-1.4944608174 1.2077959613 1.1039549836
Line 3,093 ⟶ 3,860:
puts [format "estimated area (grid): %.4f" [sampleGrid $circles 500]]
puts [format "estimated area (monte carlo): %.2f" [sampleMC $circles 1000000]]
puts [format "estimated area (perturbed sample): %.4f" [samplePerturb $circles 500 5]]</langsyntaxhighlight>
{{out}}
<pre>
Line 3,101 ⟶ 3,868:
</pre>
Note that the error on the Monte Carlo sampling is actually very high; the above run happened to deliver a figure closer to the real value than usual.
 
=={{header|Uiua}}==
{{works with|Uiua|0.10.0}}
Developed mainly to play with Uiua's image handling. Getting a very rough area figure is a bonus.
<syntaxhighlight lang="Uiua">
Cs ← [[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.249589295 ¯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.109280578 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]]
 
# Scale total range to (0-Dim,0-Dim), save MaxXorY for later.
Dim ← 500
MinXY ← /↧≡(-⊃(⊢|↘1)↻¯1) Cs
Zcs ← ≡(⬚0-MinXY) Cs
MaxXorY ← /↥/↥≡(+⊃(⊢|↘1)↻¯1) Zcs
Scs ← ⁅×Dim÷ MaxXorY Zcs
# For each r generate a 2r.2r grid and set cells that are within circle.
InCircle ← <ⁿ2⟜(⊞(/+≡ⁿ2⊟).+⇡⊃(×2|¯))
# Fade this circle out, then add to accumulator, offset appropriately.
Filler ← ⍜(↻|⬚0+)⊙: ⊃(+¯|×0.1InCircle) ⊃(⊢|↘1) ↻¯1
# Fold over all circles, accumulating into a blank grid.
⍜now(∧Filler Scs ↯Dim_Dim 0)
 
&p &pf "Runtime (s): "
×ⁿ2 ÷Dim MaxXorY (⧻⊚≠0) ♭.
&p &pf "*Very* approximate area: "
 
# Uncomment to save image.
# &ime "png"
# &fwa "UiuaOverlappingCircles.png"
 
</syntaxhighlight>
{{out}}
<pre>
stdout:
Runtime (s): 3.7929999999978463
*Very* approximate area: 21.56451023743893
</pre>
[[File:UiuaOverlappingCircles.png|300px|thumbnail|center|Overlapping translucent circles]]
<p></p>
 
=={{header|VBA}}==
Analytical solution adapted from Haskell/Python.
<langsyntaxhighlight lang="vb">Public c As Variant
Public pi As Double
Dim arclists() As Variant
Line 3,351 ⟶ 4,179:
circle_cross
make_path
End Sub</langsyntaxhighlight>{{out}}
<pre> 21,5650366038564 </pre>
 
Line 3,360 ⟶ 4,188:
{{libheader|Wren-math}}
Limited to 3000 boxes to finish in a reasonable time (about 25 seconds) with reasonable precision.
<langsyntaxhighlight ecmascriptlang="wren">import "./dynamic" for Tuple
import "./math" for Nums
 
var Circle = Tuple.create("Circle", ["x", "y", "r"])
Line 3,411 ⟶ 4,239:
}
}
System.print("Approximate area = %(count * dx * dy)")</langsyntaxhighlight>
 
{{out}}
Line 3,422 ⟶ 4,250:
{{libheader|Wren-sort}}
Quicker (about 4.7 seconds) and more precise (limited to 5 d.p. but achieves 7) than the above version.
<langsyntaxhighlight ecmascriptlang="wren">import "./dynamic" for Tuple
import "./math" for Nums, Math
import "./sort" for Sort
 
var Point = Tuple.create("Point", ["x", "y"])
Line 3,477 ⟶ 4,305:
for (p in points) {
if (p.y > right) {
total = total + p.y - Math.max(p.x, .max(right)
right = p.y
}
Line 3,486 ⟶ 4,314:
var p = 1e-5
System.print("Approximate area = %(areaScan.call(p))")</langsyntaxhighlight>
 
{{out}}
<pre>
Approximate area = 21.565036588498
</pre>
 
=={{header|XPL0}}==
Gird sampling. Takes 27 seconds on Pi4.
<syntaxhighlight 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);
]</syntaxhighlight>
 
{{out}}
<pre>
21.56188
</pre>
 
Line 3,496 ⟶ 4,401:
The circle data is stored in a file, just a copy/paste of the task data.
{{trans|Python}}
<langsyntaxhighlight lang="zkl">circles:=File("circles.txt").pump(List,'wrap(line){
line.split().apply("toFloat") // L(x,y,r)
});
Line 3,521 ⟶ 4,426:
}
 
println("Approximated area: ", dx*dy*count);</langsyntaxhighlight>
{{out}}
<pre>Approximated area: 21.5616</pre>
3,021

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.