POJ 2954 /// 皮克定理+叉积求三角形面积

Posted zquzjx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2954 /// 皮克定理+叉积求三角形面积相关的知识,希望对你有一定的参考价值。

题目大意:

给定三角形的三点坐标

判断在其内部包含多少个整点

 

题解及讲解

皮克定理

多边形面积s = 其内部整点in + 其边上整点li / 2 - 1

那么求内部整点就是 in = s + 1 - li / 2

 

网格中两格点(整点)间经过的格点(整点)数 即边上整点

li +1=两点横向和纵向距离的最大公约数

//求线段ab之间的整点数
int lineSeg(P a,P b) {
    int dx=abs(a.x-b.x), dy=abs(a.y-b.y);
    if(dx==0 && dy==0) return 0;
    return gcd(dx,dy)-1;
}
技术分享图片
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std;

double eps=1e-10;
double add(double a,double b) {
    if(abs(a+b)<eps*(abs(a)+abs(b))) return 0;
    return a+b;
}
struct P {
    double x,y;
    P(){};
    P(double _x,double _y):x(_x),y(_y){};
    P operator - (P p) {
        return P(add(x,-p.x),add(y,-p.y)); }
    P operator + (P p) {
        return P(add(x,p.x),add(y,p.y)); }
    P operator * (double d) {
        return P(x*d,y*d); }
    double dot (P p) {
        return add(x*p.x,y*p.y); }
    double det (P p) {
        return add(x*p.y,-y*p.x); }
}a,b,c;
double area(P a,P b,P c) {
    return abs((a-c).det(b-c))/2;
}
int gcd(int a,int b) {
    while(b) {
        int t=a%b;
        a=b; b=t;
    } return a;
}
//求线段ab之间的整点数
int lineSeg(P a,P b) {
    int dx=abs(a.x-b.x), dy=abs(a.y-b.y);
    if(dx==0 && dy==0) return 0;
    return gcd(dx,dy)-1;
}

int main()
{
    while(~scanf("%lf%lf%lf%lf%lf%lf"
                 ,&a.x,&a.y,&b.x,&b.y,&c.x,&c.y)) {
        if(a.x==a.y && b.x==b.y && c.x==c.y
           && a.x==b.x && b.x==c.x && c.x==0) break;
        int s=area(a,b,c);
        int li=lineSeg(a,b)+lineSeg(a,c)+lineSeg(b,c)+3;
        // +3 是 加上三角形的三个顶点
        printf("%d
",s+1-li/2); /// 皮克定理
    }

    return 0;
}
View Code

 


以上是关于POJ 2954 /// 皮克定理+叉积求三角形面积的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2954 Triangle [pick定理,叉积,计算几何]

POJ - 1654 利用叉积求三角形面积 去 间接求多边形面积

poj 1269 Intersecting Lines——叉积求直线交点坐标

poj2954Triangle

POJ 2954 Triangle

POJ 3348 Cows 凸包 求面积