私は10ポイントのグループをカバーする最小の円(具体的にはその円の直径)を決定する必要があります。JSLでこれを計算する方法を知っている人はいますか?
正確な答えを計算する方法がわからないが、これは近似に反復するようです。
更新、15feb2019 - 円上に2点しかない場合、これはうまくいきません。最後の図を参照してください。
<STRIKE>see slightly better JSL below</STRIKE>
Circle shrunk to fit the pointsポイントに合うように円が縮小
これはうまく機能しないだろう2点のケースです。
can't find the center very well with only two points2点だけでは中心をうまく見つけることができない
3番目に近い点が半径上にない場合は、それをテストしてこれら2点の平均を取ることができますが、それはぎこちなくなり、さらに問題が生じる可能性があります。正確な答えが必要な場合は、ウィキペディアの答えを調べてください。 https://en.wikipedia.org/wiki/Smallest-circle_problem
難しいかも… https://stackoverflow.com/questions/33443006/understanding-algorithm-for-finding-the-smallest-circle-enclosing-points
これは少し良くなりますが、 Welzlアルゴリズムは短時間で正確な答えを出すはずです :
points = J( 33, 2, Random normal( 50, 20 ) ); // make 33 random points
nrows = N Rows( points );
kdt = KDTable( points ); // make a nearest row look up table
center = Mean( points[0, 1] ) || Mean( points[0, 2] ); // pick a starting point
radius = 1e99; // make it big enough
fraction = .2; // fractional distance to move the center towards farthest point
For( i = 1, i < 1000, i++, // usually stops around 700
{indexes, distances} = kdt << knearestrows( nrows, center ); // just need farthest point, but get them all
farthest = indexes[nrows]; // last one is far away
howfar = distances[nrows];
If( howfar > radius, // if oscillating, make the fraction smaller
fraction = fraction * .9; // .5 stops the iterations too soon and gives really poor answers for 2-points on circle case
Show( i, fraction );
If( fraction < 1e-15, // good enough
Break()
);
);
radius = howfar;
// move slightly toward the farthest point
center = center + fraction * (points[farthest, 0] - center);
);
New Window( "Example",
Graph Box(
Frame Size( 500, 500 ),
X Scale( -30, 130 ),
Y Scale( -30, 130 ),
Marker( Marker State( 3 ), points[0, 2], points[0, 1] );
Pen Color( "Blue" );
Circle( {center[2], center[1]}, radius );
fill Color( "red" );
Pen Color( "red" );
Circle( {center[2], center[1]}, 2.0,"FILL" );
for(i=nrows,i>nrows-3,i--,
for(j=i,j>nrows-3,j--,
line({points[indexes[i],2],points[indexes[i],1]},{points[indexes[j],2],points[indexes[j],1]})
)
);
)
);
center is closer中心が近い
@kvnsngr 、
さて、私は本当にあなたを助けたいです、しかし、私はあなたが試みることをお勧めし、要求し、少なくともあなたがコミュニティに助けて欲しいものについて良い擬似コードを思い付くことを望みます。あなたが疑似コードを思い付くことができるならば、私または他のコミュニティメンバーはJMPで疑似コードをどのように達成するかに関する方法を先導することができます。
許してください、私はトピックについてあまり知らされていません。しかし私は論文を見つけました効率的なアルゴリズムを持っているように見えたSven Skyum。
@kvnsngr 、
あなたは最小の囲み円の問題に言及していますか。もしそうなら、あなたはあなたがJMPで実装したいということを心に留めているアルゴリズムを持っていますか?
Thanks a lot for the insight! I haven't fully implimented this yet but it seems like this might work for me.