HDU2108和HDU2036(叉乘)

来源:互联网 发布:义乌招淘宝美工 编辑:程序博客网 时间:2024/05/17 23:19

hdu2108

判断是否为凸边形

判断连续三点的叉乘

若为凸,内角<180;若为凹,内角>180

所以通过正负来判断


#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <cmath>#include <algorithm>typedef long long ll;typedef unsigned long long ull;using namespace std;const int N=100050;struct node{    int x,y;}pnode[N];int judge(int x,int y,int z){    return (pnode[y].x - pnode[x].x)*(pnode[z].y - pnode[y].y)-(pnode[z].x - pnode[y].x)*(pnode[y].y - pnode[x].y);}int main(){    int n;    while(scanf("%d",&n) && n)    {        for(int i = 1;i <= n;i++)            scanf("%d%d",&pnode[i].x,&pnode[i].y);        pnode[n+1].x = pnode[1].x;        pnode[n+1].y = pnode[1].y;        pnode[n+2].x = pnode[2].x;        pnode[n+2].y = pnode[2].y;        int flag = 0;        for(int i = 1;i <= n;i++)        {            if(judge(i,i+1,i+2)<0)            {                flag = 1;                break;            }        }        if(flag )            printf("concave\n");        else            printf("convex\n");    }    return 0;}


hdu2036

求一个多边形的面积

分成许多个三角形来计算。   S△ = 向量AB 与 向量AC的叉乘/2


#include <stdio.h>#include <math.h>int main(){    int n,i,j;    double S,x[101],y[101];    while(scanf("%d",&n) && n != 0)    {        for(i = 0;i < n;i++)            scanf("%lf%lf",&x[i],&y[i]);        x[i] = x[0];        y[i] = y[0];        S = 0;        for(j = 0;j < i;j++)            S += x[j] * y[j+1] - x[j+1] * y[j];        S = fabs(S / 2);            printf("%.1lf\n",S);    }    return 0;}




0 0