EDIT下の私のコメントを参照してください(問題は解決されていません)。私のコードを試してみたい人は誰でもここでできます: http://tinker.io/e0676
EDIT2私は問題を見つけたと思います: http://www.geocomputation.org/1999/076/gc_076.htm何とか解決しようとします...
これが問題です。多角形の面積と周囲がある場合、面積/(周囲*周囲) の結果を取得することで、多角形が円にどれだけ近いかを測定できます。周囲を測定する方法を知っています:
function getPolySize(arrP){ //the first and last point in arrP is the same!
var S = 0;
for(var i=1, l=arrP.length;i<l;i++)
S += Math.sqrt(Math.pow(arrP[i-1].x-arrP[i].x,2)+Math.pow(arrP[i-1].y-arrP[i].y,2));
return S;
}
そしてエリア:
function getPolyArea(arrP){
var A = 0;
for(var i=0,l=arrP.length-1;i<l;i++)
A += arrP[i].x*arrP[i+1].y - arrP[i+1].x*arrP[i].y;
A = A/2;
return Math.abs(A);
}
すべてが正常に機能しますが、できるだけ円に近いポリゴンを作成すると、奇妙な結果が得られ始めます。これを使用して円ポリゴンを作成します。
var arrCircle = [];
function setPixel(x,y){
arrCircle.push({x:x,y:y});
}
function rasterCircle(xCenter, yCenter, radius)
{
var x, y, r2;
r2 = radius * radius;
for (x = -radius+1; x <= radius; x++){
y = Math.floor(Math.sqrt(r2 - x*x) + 0.5);
setPixel(xCenter + x, yCenter + y);
}
for (x = radius-1; x >= -radius; x--) {
y = Math.floor(Math.sqrt(r2 - x*x) + 0.5);
setPixel(xCenter + x, yCenter - y);
}
}
arrCircle.push(arrCircle[0]);
半径が大きい円ポリゴンは、半径が小さい円ポリゴンよりも理想的な円に近いので、円が大きいほど面積/(周囲*周囲)が大きくなるはずですが、そうではないようで、私は理由がわからない。理想的な円の「真円度」は 1/4PI (0,07957747154594766788444188168626) です。(多角形のような円) でいくつかのテストを行いましたが、これらは私の結果でした:
radius 10 roundness 0.0760194950578244
radius 20 roundness 0.07542738445429042
radius 30 roundness 0.07549530319982335
radius 40 roundness 0.07472106160782283
radius 50 roundness 0.07490614579701928
radius 60 roundness 0.0750939048274632
radius 70 roundness 0.07502892726254591
radius 80 roundness 0.07512064515249058
radius 90 roundness 0.0752191417813967
では、なぜ増加するはずなのに減少するのでしょうか。誰でも助けることができますか?