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

    return 0;
}

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

时间: 2024-10-09 23:45:37

POJ 2954 /// 皮克定理+叉积求三角形面积的相关文章

【POJ 1408】 Fishnet (叉积求面积)

[POJ 1408] Fishnet (叉积求面积) 一个1*1㎡的池塘 有2*n条线代表渔网 问这些网中围出来的最大面积 一个有效面积是相邻两行和相邻两列中间夹的四边形 Input为n 后面跟着四行 每行n个浮点数 每一行分别代表a,b,c,d 如图 并且保证a(i) > a(i-1) b(i) > b(i-1) c(i) > c(i-1) d(i) > d(i-1) n(n <= 30)*2+4(四个岸)条边 枚举点数就行 相邻的四个四个点枚举 找出围出的最大面积 找点用

poj1408——叉积求多边形面积

poj1408——叉积求多边形面积 Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1853   Accepted: 1185 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previou

POJ&#183;1151 Atlantis&#183;线段树求矩形面积并

题目在这:http://poj.org/problem?id=1151 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the is

【c语言】给出三角形的三边长,求三角形面积

// 给出三角形的三边长,求三角形面积 // area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ) ) // s = ( a + b + c) / 2 #include <stdio.h> #include <math.h> int main() { int a,b,c; double s,area; printf("请输入三角形三个边长:"); scanf("%d%d%d",&a,&a

Maximal Area Quadrilateral CodeForces - 340B || 三点坐标求三角形面积

Maximal Area Quadrilateral CodeForces - 340B 三点坐标求三角形面积(可以带正负,表示向量/点的不同相对位置): http://www.cnblogs.com/xiexinxinlove/p/3708147.html https://jingyan.baidu.com/article/a65957f49596ab24e67f9be7.html 枚举对角线,求出在对角线两侧取任意点能得到的三角形的面积,然后对于每条对角线,最大值就是两侧面积最大值之和. 1

Area---poj1265(皮克定理+多边形求面积)

题目链接:http://poj.org/problem?id=1265 题意是:有一个机器人在矩形网格中行走,起始点是(0,0),每次移动(dx,dy)的偏移量,已知,机器人走的图形是一个多边形,求这个机器人在网格中所走的面积,还有就是分别求多边形上和多边形内部有多少个网格点: 皮克定理: 在一个多边形中.用I表示多边形内部的点数,E来表示多边形边上的点数,S表示多边形的面积. 满足:S:=I+E/2-1; 求E,一条边(x1,y1,x2,y2)上的点数(包括两个顶点)=gcd(abs(x1-x

poj1265&amp;&amp;2954 [皮克定理 格点多边形]【学习笔记】

Q:皮克定理这种一句话的东西为什么还要写学习笔记啊? A:多好玩啊... PS:除了蓝色字体之外都是废话啊...  Part I 1.顶点全在格点上的多边形叫做格点多边形(坐标全是整数) 2.维基百科 Given a simple polygon constructed on a grid of equal-distanced points (i.e., points with integer coordinates) such that all the polygon's vertices a

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

题目:http://poj.org/problem?id=1269 相关知识: 叉积求面积:https://www.cnblogs.com/xiexinxinlove/p/3708147.html什么是叉积:https://blog.csdn.net/sunbobosun56801/article/details/78980467        其二维:https://blog.csdn.net/qq_38182397/article/details/80508303计算交点:    方法1:面

OJ期末刷题 问题 B: 求三角形面积-gyy

题目描述 输入三条边的长度,如果这三条边能构成三角形,则需要计算三角形面积,如果不能构成三角形则输出提示信息 "error input".输出的面积按两位小数方式输出 输入 三条边的长度 输出 如果这三条边能构成三角形,则输出该三角形面积,如果这三条边不能构成三角形,则输出提示信息"error  input" 样例输入 3.3 4.4 5.5 样例输出 area=7.26 提示 输出面积时保留两位小数 代码: #include <iostream> #i