AOJ - Problem 0035 : Is it Convex?
線分ACと直線BD,あるいは直線ACと線分BDのどちらかが交差していない場合は、
凹みのある四角形です。
線分や縁の交差判定はよく使うので慣れておきたいものです。
#include <complex> #include <cstdio> #include <cmath> using namespace std; // 点座標を型とする typedef complex<double> P; //XY座標 #define X real() #define Y imag() // 直線p1,p2と線分p3,p4の交差判定 // (n < 0)<=>交差 , (n == 0)<=>直線上, (n > 0)<=>交差していない double isIntersect(P p1, P p2, P p3, P p4){ return ( (p1.X-p2.X)*(p3.Y-p1.Y) + (p1.Y-p2.Y)*(p1.X-p3.X)) * ((p1.X-p2.X)*(p4.Y-p1.Y) + (p1.Y-p2.Y)*(p1.X-p4.X)); } int main(){ double xa, xb, xc, xd, ya, yb, yc, yd; while( scanf("%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf", &xa, &ya, &xb, &yb, &xc, &yc, &xd, &yd) != EOF ){ P a( xa , ya ); P b( xb , yb ); P c( xc , yc ); P d( xd , yd ); if( isIntersect(a,c,b,d) > 0.0 || isIntersect(b,d,a,c) > 0.0 ){ printf("NO\n"); }else{ printf("YES\n"); } } }