题目描述
给出平面上a,b,c,d四个点的坐标,依次连接a-b,b-c,c-d,d-a,请你写程序判断得到的图形是否是凸四边形.
关于输入
输入包含多组数据,每组数据一行,包含8个整数(绝对值都不大于1000),依次为a,b,c,d四个点的坐标.
关于输出
对每组输入输出一行,若得到的图形是凸四边形,输出"yes",否则输出"no"
例子输入
0 0 0 1 1 1 1 0
0 0 1 1 0 1 1 0
0 0 0 1 0 2 1 1
0 0 1 1 0 2 2 1
例子输出
yes
no
no
no
提示
样例2不是简单多边形,样例3是三角形,样例4是凹四边形
所谓的凸多边形是指: 对于多边形上任意一边所在的直线而言,多边形的整体都在直线的同一侧
可以用向量外积(即叉积)判断点在直线的哪一侧
源码
#include<iostream>
using namespace std;
int main(){
int x[8]={0};
int y[8]={0};
double k[4]={0};
double b[4]={0};
bool a;
while (cin>>x[0]>>y[0]){
a=true;
for (int i=1;i<4;i++){
cin>>x[i]>>y[i];
}
for (int i=4;i<8;i++){
x[i]=x[i-4];
y[i]=y[i-4];
}
for (int i=0;i<4;i++){
if (x[i+1]!=x[i]){
k[i]=((double)(y[i+1]-y[i]))/(x[i+1]-x[i]);
b[i]=y[i]-k[i]*x[i];
if ((k[i]*x[i+2]-y[i+2]+b[i])*(k[i]*x[i+3]-y[i+3]+b[i])<=0){
a=false;
break;
}
}
else{
if ((x[i+2]-x[i])*(x[i+3]-x[i])<=0){
a=false;
break;
}
}
}
if (a)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}