码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-09-18 23:52:41      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:tps   sel   图片   elf   公约数   scanf   line   mes   多边形   

题目大意:

给定三角形的三点坐标

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

 

题解及讲解

皮克定理

多边形面积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\n",s+1-li/2); /// 皮克定理
    }

    return 0;
}
View Code

 

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

标签:tps   sel   图片   elf   公约数   scanf   line   mes   多边形   

原文地址:https://www.cnblogs.com/zquzjx/p/9672131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!