Q - Shape of HDU HDU2108 向量的叉乘

判断折线往什么方向拐:

<1>点为(x1,y1),(x2,y2),(x3,y3)

<2>s = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)

       (PS:记忆方法。。。。xyyx和1323 1323)

<3>s > 0时,逆时针拐;

       s < 0时,顺时针拐。

#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 1e5 + 10;
int x[maxn], y[maxn];
int main()
{
    int n, s;
    while(scanf("%d",&n),n) {
        int flag = 0;
        for (int i = 0;i <n;i++)scanf("%d %d", &x[i], &y[i]);
        for (int i = 0;i <n - 2;i++) {
            s = (x[i + 1] - x[i]) * (y[i + 2] - y[i]) - (x[i + 2] - x[i]) * (y[i + 1] - y[i]);
            if (s < 0) { printf("concave\n"); return 0; }
        }
        s = (x[n - 1] - x[n - 2]) * (y[0] - y[n - 1]) - (x[0] - x[n - 2]) * (y[n - 1] - y[n - 2]);
        if (s < 0)flag = 1;
        s = (x[0] - x[n - 1]) * (y[1] - y[0]) - (x[1] - x[n - 1]) * (y[0] - y[n - 1]);
        if (s < 0)flag = 1;
        flag == 1?printf("concave\n"): printf("convex\n");
    }
    return 0;
}

 

posted @ 2020-01-30 22:52  programmer_w  阅读(1)  评论(0)    收藏  举报