このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/619
#  [1] 情報処理 
#  [2] 2. 
#   下記のような2次元空間の点を表す構造体\texttt{struct point2d}と 
#   線分を表す構造体struct linesegmentを使い,2つの線分 
#   struct linesegment line1とstruct linesegment line2とが交点を 
#   持つかどうかを判定し,交点を持つ場合には1,持たない場合には0を返す関数 
#   int if_intersect(struct linesegment line1,struct linesegment line2)を作成せよ. 
#    
#  struct point2d {/*2次元空間の点のx座標とy座標をそれぞれdoubleに格納*/ 
#     double x; double y; 
#   }; 
#   struct linesegment {/*線分の始点sと終点eをそれぞれstruct point2dに格納*/ 
#     struct point2d s; struct point2d e; 
#   }: 
#  

'2つの線分は交点を持つ'(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4) :-
        '2つの線分のxの係数を得る'(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3),
        交点を得る(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y),
        交点は2つの線分上にある(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y).

交点を得る(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y) :-
        \+(_a1 - _a3 = 0),
        \+(_x2 - _x1 = 0),
        _x is (_a1 * _x1 - _y1 - _a3 * _x3 + _y3) / (_a1 - _a3),
        _y is (_y2 - _y1) / (_x2 - _x1) * (_x - _x1) + _y1. 

'2つの線分のxの係数を得る'(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3) :-
        _a1 is (_y2 - _y1) / (_x2 - _x1),
        _a3 is (_y4 - _y3) / (_x4 - _x3).

交点は2つの線分上にある(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y) :-
        範囲にある(_x,_x1,_x2),
        範囲にある(_x,_x3,_x4),
        範囲にある(_y,_y1,_y2),
        範囲にある(_y,_y3,_y4).

範囲にある(M,N1,N2) :-
        N1 =< N2,
        M >= N1,
        M =< N2,!.
範囲にある(M,N1,N2) :-
        N1 < N2,
        M >= N2,
        M =< N1.