#include #include // 乱数発生関数 drand48() のため #include // 絶対値関数 fabs() のため #define NUM 100 // 点の数を初期化 // 座標型 (COORDINATE型) の定義 typedef struct { double x, y; } COORDINATE; // 関数 surface() のプロトタイプ宣言 double surface(COORDINATE, COORDINATE, COORDINATE); int main(int argc, char *argv[]) { int i, j, k; // 汎用変数 COORDINATE p[NUM]; // 点の座標の配列 (座標型) double max; // 「今のところの最大面積」 int points[3]; // 見つかった三角形の点番号 double s; // 面積の一時保存先 srand48(0); // 乱数の種を初期化 // 点座標を乱数により設定 for (i = 0; i < NUM; i++) { p[i].x = 10.0 * drand48() - 5.0; p[i].y = 10.0 * drand48() - 5.0; } max = 0.0; // max の初期化 // メインの三重ループ for (i = 0; i < NUM - 2; i++) for (j = i + 1; j < NUM - 1; j++) for (k = j + 1; k < NUM; k++) { s = surface(p[i],p[j],p[k]); // sに面積を代入 // 更に大きい面積の三角形が見つかった場合 if (s > max) { max = s; // max を更新 points[0] = i; // 点番号の保存 points[1] = j; points[2] = k; } } // 結果の表示 printf("Largest triangle: p[%d]-p[%d]-p[%d],\nsurface = %f\n", points[0], points[1], points[2], max); return 0; } // 三頂点の座標から三角形の面積を求める関数 double surface(COORDINATE p0, COORDINATE p1, COORDINATE p2) { // 外積の z 成分の絶対値の0.5倍を返す return(0.5 * fabs((p1.x - p0.x) * (p2.y - p0.y) - (p1.y - p0.y) * (p2.x - p0.x))); }