このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1307166756/262
#  [1] 授業単元:C言語 
#  [2] 問題文: 
#  構造体trinagleを typedef struct{ 
#                     double x,y; 
#                   } Point; 
#   
#                   typedey struct{ 
#                     Point p1,p2,p3; 
#                   } Trinagle; 
#  とする。 
#  構造体の構成要素は3つの頂点のx座標、y座標をメンバとして持つ構造体Pointである。 
#  任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座 
#  標とその面積、任意の二つの三角形が合同かどうかを表示するプログラムを作りなさい。 
#  座標の回転 90度 [[0,-1],[1,0]] 180度 [[-1,0],[0,-1]] 270度 [[0,1],[-1,0]]
#            -90度 [[0,1],[-1,0]] -180度 [[-1,0],[0,-1]] -270度 [[0,1],[-1,0]]

変換正方行列(回転,V,[[A,B],[C,D]]) :-
        \+(var(V)),
        R is pi * V / 180,
        A is cos(R),
        B is (-1) * sin(R),
        C is sin(R),
        D = A.
変換正方行列(回転,90,[[0,-1],[1,0]]).
変換正方行列(回転,180,[[-1,0],[0,-1]]).
変換正方行列(回転,270,[[0,1],[-1,0]]).
変換正方行列(回転,-90,[[0,1],[-1,0]]).
変換正方行列(回転,-180,[[-1,0],[0,-1]]).
変換正方行列(回転,-270,[[0,-1],[1,0]]).

任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座標とその面積(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_面積) :-
        三角形の面積(X1,Y1,X2,Y2,X3,Y3,_面積_1),
        writef('三角形の面積 %t\n',[_面積_1]),
        変換正方行列(回転,_度,_変換行列),        
        行列の積([[Y1,X1],[Y2,X2],[Y3,X3]],_変換行列,[[_y1,_x1],[_y2,_x2],[_y3,_x3]]),
        三角形の面積(_x1,_y1,_x2,_y2,_x3,_y3,_面積_2),
        writef('%t度回転された座標は(%t %t)(%t %t)(%t %t) 面積は %t です\n',[_度,_x1,_y1,_x2,_y2,_x3,_y3,_面積_2]),
        fail.
任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座標とその面積'(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_面積).

任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3) :-
        任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_合同かどうか),
        writef('%t\n',[_合同かどうか]).

任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,合同) :-
        A is (X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2),
        B is (X2-X3) * (X2-X3) + (Y2-Y3) * (Y2-Y3),
        C is (X3-X1) * (X3-X1) + (Y3-Y1) * (Y3-Y1),
        _a is (_x1-_x2) * (_x1-_x2) + (_y1-_y2) * (_y1-_y2),
        _b is (_x2-_x3) * (_x2-_x3) + (_y2-_y3) * (_y2-_y3),
        _c is (_x3-_x1) * (_x3-_x1) + (_y3-_y1) * (_y3-_y1),
        sort([A,B,C],X),
        sort([_a,_b,_c],X),!.
任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,合同ではない).
        
三角形の面積(X1,Y1,X2,Y2,X3,Y3,_三角形の面積) :-
        一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,_x2,_y2,_x3,_y3),
        _三角形の面積 is abs(_x2 * _y3 - _y2 * _x3) / 2.

一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,_x2,_y2,_x3,_y3) :-
        _x2 is X2 - X1,
        _y2 is Y2 - Y1,
        _x3 is X3 - X1,
        _y3 is Y3 - X1.