アットウィキロゴ

Is it Convex?

0035 : Is it Convex?



解説

四角形に凹みがあるかどうかを調べる問題。
2本の対角線(線分ACと線分BD)が交差しているかどうかを判定し、交差している場合はYES、していない場合はNOを出力する。
参考→平面幾何におけるベクトル演算 » 直線と線分

他には、全ての内角の角度が180度以下になっているか調べる、一周したときに「いつも同じ方向に曲がるかどうか」(凹みがある場合は同じ方向に曲がらない)を調べる、などの方法があるようです。

プログラム

C


C++

交差判定を用いた方法
+ ...
#include <iostream>
#include <cstdio>
#include <complex>
using namespace std;
 
typedef complex<double> P;
#define x real()
#define y imag()
#define EPS (1e-10)

double cross (P a, P b) {
	return a.x*b.y - a.y*b.x;
}

int is_cross(P a1, P a2, P b1, P b2) {
	return (cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS) &&
		   (cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < EPS);
}

int main() {
    double xa,ya,xb,yb,xc,yc,xd,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 (is_cross(a, c, b, d)) cout << "YES" << endl;
		else cout << "NO" << endl;
    }
     
    return 0;
}

Java

最終更新:2012年12月13日 17:40