ピックの定理というのがあります。
多角形の各頂点が格子点上にある場合、
面積=辺と頂点上にある格子点の数÷2+内部にある格子点の数-1
で求められるというものです。
これを使い、円を多角形で近似して面積を求め、円周率の近似値を求めてみます。
半径1000の円の4分の1の扇形を考えます。
その中にギリギリ収まるような多角形を考えます。
扇形の中心から右に向かって格子点を数えて行きます。
x=0(中心)のとき、辺と頂点に重なる格子点は1001個です。
x=1のとき、高さは(1000^2-1^2)^(1/2)を切り捨てた値で999になります。
辺と頂点に重なる格子点は上端と下端で2個、内部にある格子点は上端を除いて998個になります。
同じようにしてx=2から999まで求めます。
x=1000のとき、辺と頂点に重なる格子点は1個です。
これらを合計します。
辺と頂点に重なる格子点は3000個。
内部にある格子点は783388個。
面積は3000/2+783388-1=784887になります。
これを4倍すると円の面積に近似できます。
784887*4=3139548
円周率=面積÷半径÷半径
ですから
3139548/1000/1000=3.139548
となります。3.14に近いです。
半径を10000とすると3.1415725456となるのでさらに近づきます。
もっと厳密にやるならば扇形の内側の多角形だけでなく外側の多角形を考えて挟むといいでしょう。
これらの計算をJavaScriptで行う場合のサンプルを挙げておきます。
rは半径です。ioは内側は0、外側は1とします。
function circle_by_pick(r, io) {
var temp;
var a;
var b = 0;
var i = 0;
for (var x = 0; x <= r; x++) {
if (x == 0) {
b += r + 1;
} else if (x == r) {
b += 1;
} else {
temp = Math.pow(Math.pow(r, 2) - Math.pow(x, 2), 1 / 2);
if (io == 0) {
a = Math.floor(temp);
} else {
a = Math.ceil(temp);
}
b += 2;
i += a - 1;
}
}
return (b / 2 + i - 1) * 4;
}
var temp;
var a;
var b = 0;
var i = 0;
for (var x = 0; x <= r; x++) {
if (x == 0) {
b += r + 1;
} else if (x == r) {
b += 1;
} else {
temp = Math.pow(Math.pow(r, 2) - Math.pow(x, 2), 1 / 2);
if (io == 0) {
a = Math.floor(temp);
} else {
a = Math.ceil(temp);
}
b += 2;
i += a - 1;
}
}
return (b / 2 + i - 1) * 4;
}
サンプルです。
JSFiddle
コメント