FZU2110 Star【计算几何】

原创 2018年04月15日 21:26:03

Overpower often go to the playground with classmates. They play and chat on the playground. One day, there are a lot of stars in the sky. Suddenly, one of Overpower’s classmates ask him: “How many acute triangles whose inner angles are less than 90 degrees (regarding stars as points) can be found? Assuming all the stars are in the same plane”. Please help him to solve this problem.
Input

The first line of the input contains an integer T (T≤10), indicating the number of test cases.

For each test case:

The first line contains one integer n (1≤n≤100), the number of stars.

The next n lines each contains two integers x and y (0≤|x|, |y|≤1,000,000) indicate the points, all the points are distinct.

Output
For each test case, output an integer indicating the total number of different acute triangles.
Sample Input
1
3
0 0
10 0
5 1000
Sample Output
1


本来想用算夹角的函数的,还特意去找了一下模板

后来应该是因为精度WA了

才发现其实只用判断一下边之间的关系就可以判断是不是锐角三角形了

emmm题目的意思还要学会转换


判断锐角三角形:

A^2 + B^2 < C^2 就是锐角三角形

算夹角的模板:【没有精度判断】

double getAngle(Point p1, Point p2, Point p3)
{
    double angle = 0.0;
    Point va, vb;
    va.x = p2.x - p1.x;
    va.y = p2.y - p1.y;
    vb.x = p3.x - p1.x;
    vb.y = p3.y - p1.y;

    double productValue = va.x * vb.x + va.y * vb.y;
    double vaVal = sqrt(va.x * va.x + va.y * va.y);
    double vbVal = sqrt(vb.x * vb.x + vb.y * vb.y);
    double cosVal = productValue / (vaVal * vbVal);

    if(cosVal < -1 && cosVal > -2){
        cosVal = -1;
    }
    else if(cosVal > 1 && cosVal < 2){
        cosVal = 1;
    }

    angle = acos(cosVal) * 180 / PI;
    return angle;
}



#include <iostream>
#include <algorithm>
#include <cstring>

#include <cstdio>

#include <cmath>

using namespace std;
#define PI 3.1415926
#define EPS 1.0e-6



struct Point {
    Point(){}
    Point(double x, double y):x(x), y(y){}
    double x,y;

};
struct Line{
    Point st, ed;
};

double getAngle(Point p1, Point p2, Point p3)
{
    double angle = 0.0;
    Point va, vb;
    va.x = p2.x - p1.x;
    va.y = p2.y - p1.y;
    vb.x = p3.x - p1.x;
    vb.y = p3.y - p1.y;

    double productValue = va.x * vb.x + va.y * vb.y;
    double vaVal = sqrt(va.x * va.x + va.y * va.y);
    double vbVal = sqrt(vb.x * vb.x + vb.y * vb.y);
    double cosVal = productValue / (vaVal * vbVal);

    if(cosVal < -1 && cosVal > -2){
        cosVal = -1;
    }
    else if(cosVal > 1 && cosVal < 2){
        cosVal = 1;
    }

    angle = acos(cosVal) * 180 / PI;
    return angle;
}


int dblcmp(double r) {

    if(fabs(r)<EPS) return 0;

    return r>0?1:-1;

}

double cross(Point p1, Point p2, Point p3, Point p4)
{
    return (p2.x - p1.x) * (p4.y - p3.y) - (p2.y - p1.y) * (p4.x - p3.x);
}

double area(Point p1, Point p2, Point p3)
{
    return cross(p1, p2, p1, p3);
}

double farea(Point p1, Point p2, Point p3)
{
    return fabs(area(p1, p2, p3));
}

bool meet(Point p1, Point p2, Point p3, Point p4)
{
    return max(min(p1.x, p2.x), min(p3.x, p4.x)) <= min(max(p1.x, p2.x), max(p3.x, p4.x))
    && max(min(p1.y, p2.y), min(p3.y, p4.y)) <= min(max(p1.y, p2.y), max(p3.y, p4.y))
    && dblcmp(cross(p3, p2, p3, p4) * cross(p3, p4, p3, p1)) >= 0
    && dblcmp(cross(p1, p4, p1, p2) * cross(p1, p2, p1, p3)) >= 0;
}

Point inter(Point p1, Point p2, Point p3, Point p4)
{
    double k = farea(p1, p2, p3) / farea(p1, p2, p4);
    return Point((p3.x + k * p4.x) / (1 + k), (p3.y + k * p4.y) / (1 + k));
}

bool sharpTri(Point p1, Point p2, Point p3)
{
    double edge[3];
    edge[0] = (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
    edge[1] = (p1.x - p3.x) * (p1.x - p3.x) + (p1.y - p3.y) * (p1.y - p3.y);
    edge[2] = (p2.x - p3.x) * (p2.x - p3.x) + (p2.y - p3.y) * (p2.y - p3.y);

    sort(edge, edge + 3);
    if(edge[2] < edge[1] + edge[0] + EPS){
        return true;
    }
    else return false;
}

int n;
Point star[105];

int main() {

    int t;
    cin>>t;
    while(t--){
        scanf("%d", &n);
        for(int i = 0; i < n; i++){
            scanf("%lf%lf", &star[i].x, &star[i].y);
        }
        int cnt = 0;
        for(int i = 0; i < n - 2; i++){
            for(int j = i + 1; j < n - 1; j++){
                for(int k = j + 1; k < n; k++){
                    //cout<<getAngle(star[i], star[j], star[k])<<endl;
                    if(sharpTri(star[i], star[j], star[k])) cnt++;
                }
            }
        }
        cout<<cnt<<endl;
    }

    return 0;

}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wybooooooooo/article/details/79953499

FZU 2110 Star(计算几何)

题目:http://acm.fzu.edu.cn/problem.php?pid=2110 代码: #include #include #include #include #define eps ...
  • qq_32473657
  • qq_32473657
  • 2016年04月02日 09:33
  • 135

FZU OJ 2110 Star (计算几何)

Problem 2110 Star Accept: 585    Submit: 1731 Time Limit: 1000 mSec    Memory Limit : 32768 KB ...
  • u014253173
  • u014253173
  • 2015年05月21日 22:44
  • 1188

平面计算几何模板

该模板基于刘汝佳算法竞赛入门经典--训练指南 平面计算几何模板 转载请注明:转自http://blog.csdn.net/a15129395718 新的独立博客,欢迎访问: http://zih...
  • a15129395718
  • a15129395718
  • 2016年09月04日 23:12
  • 1575

计算几何公式总结

一.注意 1. 注意舍入方式(0.5的舍入方向);防止输出-0. 2. 几何题注意多测试不对称数据. 3. 整数几何注意xmult和dmult是否会出界; 符点几何注意eps的使用. 4. 避...
  • jichangzhen
  • jichangzhen
  • 2016年08月23日 11:56
  • 366

计算几何的模板(大神整理)

计算几何模板 目录: 1.计算几何 2 1.1 注意 2 1.2几何公式 2 1.3 多边形 4 1.4多边形切割 7 1.5 浮点函数 8 1.6 面积 14 1.7球面 15 ...
  • clasky
  • clasky
  • 2013年08月15日 21:26
  • 5344

计算几何题目集锦

其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中。之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途 计算几何题的特...
  • feizaoSYUACM
  • feizaoSYUACM
  • 2017年02月02日 12:49
  • 995

计算几何较全模板(有包含三维的)

转自:http://xiaobm.ycool.com/post.2715020.html #include #include #include #include #define ...
  • Enjoying_Science
  • Enjoying_Science
  • 2015年10月08日 22:47
  • 933

【计算几何各种知识点总结】[不定期补充]

计算几何模板总结 :http://blog.csdn.net/qq_33184171/article/details/51124611精度控制尽量不要用除法,三角函数,强制类型转换(尤其是double...
  • qq_33184171
  • qq_33184171
  • 2016年04月10日 19:26
  • 2809

计算几何入门

计算几何
  • qq_35776579
  • qq_35776579
  • 2017年02月02日 17:02
  • 526

如何完成一个有效的面试——善用STAR法则

获取合适的人才已成为企业人力资源工作中最大的挑战之一,然而招错一名员工讲给企业带来巨大的成本损失。...
  • cqkxzsxy
  • cqkxzsxy
  • 2017年04月25日 12:18
  • 4135
收藏助手
不良信息举报
您举报文章:FZU2110 Star【计算几何】
举报原因:
原因补充:

(最多只允许输入30个字)