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; }
以上是关于POJ 2954 /// 皮克定理+叉积求三角形面积的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2954 Triangle [pick定理,叉积,计算几何]
POJ - 1654 利用叉积求三角形面积 去 间接求多边形面积