このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1332279659/170
#  円の内部(円周上を含む)に点を指定した数だけ打ちたい 
#  それぞれの点の距離を最大化するように打つにはどうすればいい? 
#   

'原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(0,_,_座標ならび,_座標ならび).
'原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(_試行回数,_半径,_座標ならび,_試行回数分の点を追加された座標ならび) :-
        三座標を得る(_半径,X1,Y1,X2,Y2,X3,Y3),
        座標ならびから最短の二座標を取り除く([[X1,Y1],[X2,Y2],[X3,Y3]|_座標ならび],_最短の二座標を取り除いた座標ならび),
        _試行回数_1 is _試行回数 - 1,
        '原点を中心とした円内にランダムに3つの点を追加して行き、追加する毎に最短の距離の二点を取り除く'(_試行回数_1,_半径,_最短の二座標を取り除いた座標ならび,_試行回数分の点を追加された座標ならび).

三座標を得る(_半径,X1,Y1,X2,Y2,X3,Y3) :-
        座標点を得る(_半径,X1,Y1),
        座標点を得る(_半径,X2,Y2),
        座標点を得る(_半径,X3,Y3),!.

座標点を得る(_半径,X,Y) :-
        座標点の位置要素(_半径,X),
        座標点の位置要素(_半径,Y),!.

座標点の位置要素(_半径,_位置要素) :-
        M is truncate(_半径 * 1000),
        M_2 is M // 2,
        N is truncate(M),
        _位置要素 is (random(N+1) - M_2) / 1000.

座標ならびから最短の二座標を取り除く(_座標ならび,_最短の二座標を取り除いた座標ならび) :-
        findmin([_二点間の距離,[X1,Y1],[X2,Y2]],(
                    組み合わせ(_座標ならび,2,[[X1,Y1],[X2,Y2]]),
                    _二点間の距離 is sqrt((X2-X1) * (X2-X1) + (Y2-Y1) * (Y2-Y1)),
                [_,[X1,Y1],[X2,Y2]]),
        ならびから一要素だけ削除([X1,Y1],_座標ならび,_座標ならびの一),
        ならびから一要素だけ削除([X2,Y2],_座標ならびの一,_最短の二座標を取り除いた座標ならび).

ならびから一要素だけ削除(_削除する要素,_座標ならび,_一要素だけ削除されたならび) :-
        select(_削除する要素,_座標ならび,_一要素だけ削除されたならび),!.



可能な限り分散して円内にN個の点を打つ(N,_半径,_座標ならび) :-
        円内にランダムに十分な点を打つ(N,_半径,[],L1),
        最短点を持つ二座標を取り除く(L1,_座標ならび),
        length(_座標ならぴ,N).

円内にランダムに十分な点を打つ(N,_半径,L) :-
        M is 5 * N,
        円内にランダムに十分な点を打つ(N,_半径,[],L).

円内にランダムに十分な点を打つ(N,_半径,L1,L) :-
        座標点を得る(_半径,X,Y),
        N_1 is N - 1,
        円内にランダムに十分な点を打つ(N_1,_半径,[[X,Y]|L1],L).

最短点を持つ二座標を取り除く(L1,L) :-
        座標ならびから最短の二座標を取り除く(L1,L2),
        最短点を持つ二座標を取り除くの二(L2,L).

最短点を持つ二座標を取り除くの二(L,L).
最短点を持つ二座標を取り除くの二(L2,L) :-
        最短点を持つ二座標を取り除く(L2,L).