http://judge.u-aizu.ac.jp/onlinejudge/d ... sp?id=0035
自分でも考えたのですが、方針が全く立たず、他の人の解答例を参考にしようと思い、一番分かりやすそうなものを選びました。
直線について考えて、それの正負によって答えを出していました。
参考にしたコードは以下のとおりです。
#include <stdio.h>
double mk_func(double x, double x1, double y1, double x2, double y2) {
return (y1 - y2) / (x1 - x2) * (x - x1) + y1;
}
int main() {
double x1, x2, x3, x4, y1, y2, y3, y4;
while(scanf("%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4) != EOF) {
if((mk_func(x2, x1, y1, x3, y3) - y2) * (mk_func(x4, x1, y1, x3, y3) - y4) > 0)
printf("NO\n");
else if((mk_func(x1, x2, y2, x4, y4) - y1) * (mk_func(x3, x2, y2, x4, y4) - y3) > 0)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
今、自分が理解できている部分は
double mk_func(double x, double x1, double y1, double x2, double y2) {
return (y1 - y2) / (x1 - x2) * (x - x1) + y1;
です。
(x1,y1)、(x2,y2)を通る直線を表していると思います。
わからないところは、
if((mk_func(x2, x1, y1, x3, y3) - y2) * (mk_func(x4, x1, y1, x3, y3) - y4) > 0)・・・①
と
if((mk_func(x1, x2, y2, x4, y4) - y1) * (mk_func(x3, x2, y2, x4, y4) - y3) > 0)です。
①については自分で考えてみました。間違っている部分があるかもしれませんが、ご指摘いただけると幸いです。
(x1,y1),(x3,y3)を通る直線の傾きを持っていて、(x2,y1)を通る直線を表していて、それがy2よりも大きいか小さいか判別しています。
ここで質問なのですが、
どうして①のようなことをすることによって、四角形の凹がわかるのでしょうか?
長文失礼しました。
よろしくお願いします。