演習12
問題 xy平面上の3点A、B、Cで表される三角形ABCが原点を内部に含むかどうかを判定するプログラムを作りなさい。 原点を含む 原点を含まない
判定方法 原点Zを頂点とする三角形ZAB、ZAC、ZBCの面積の和とABCの面積を比較する 原点を含む場合
判定方法 原点Zを頂点とする三角形ZAB、ZAC、ZBCの面積の和とABCの面積を比較する 原点を含まない場合
判定方法 原点Zを頂点とする三角形ZAB、ZAC、ZBCの面積の和とABCの面積を比較する 面積をSabc、Szab、Szac、Szbcとすると if (Sabc < Szab+Szac+Szbc) printf("原点を含まない\n"); else printf("原点を含む\n");
注意点 Sabc == Szab+Szac+Szbc Sabc != Szab+Szac+Szbc double型の数(浮動小数点数)の比較は大小関係を含んだ形で行う Sabc == Szab+Szac+Szbc Sabc != Szab+Szac+Szbc 等しい→差の絶対値がとても小さな値
三角形の面積(1) Szab、Szac、SzbcについてはCが原点であると考える
三角形の面積(2) Szab、Szac、SzbcについてはCが原点であると考える 結果がdouble型になる Sabc = 0.5*fabs((Xa-Xc)*(Yb-Yc)-(Ya-Yc)*(Xb-Xc)); 1/2 と書くとint型の演算になり0になる Szab = 0.5*fabs(Xa*Yb-Ya*Xb); Szac = 0.5*fabs(Xa*Yc-Ya*Xc); Szbc = 0.5*fabs(Xb*Yc-Yb*Xc); Szab、Szac、SzbcについてはCが原点であると考える
部分をまとめてプログラムにする (1)変数の定義 (2)座標の入力 (3)三角形の面積の計算 (4)原点が内側に含まれるかの判定
テストデータ 原点を含むもの (-1,4) (2,-3) (-4,0) 原点を含まないもの (-1,4) (5,5) (6,-3)
実行例 -1 4 2 -3 -4 0 -1 4 5 5 6 -3 A(-1,4) A(-1,4) B(2,-3) B(5,5) C(-4,0) Sabc 16.5 Szab 2.5 Szbc 6 Szac 8 Szab+Szbc+Szac 16.5 原点は三角形ABCの中に含まれる -1 4 5 5 6 -3 A(-1,4) B(5,5) C(6,-3) Sabc 24.5 Szab 12.5 Szbc 22.5 Szac 10.5 Szab+Szbc+Szac 45.5 原点は三角形ABCの中に含まれない