XTU 1237 计算几何

题面:

Magic Triangle

Problem Description:

Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU.

Huangriq works in a big company in Guangzhou now, all things goes well but the mosquitos are too disturbing. Mosquito net and mosquito-repellent incense are useless for this mosquito city.

And finally he decides to use magic to kill them. He make a magic regular triangle as the picture shows. While the most proper position to launch magic is not always the center of circle. In order to make everything smoothly, Huangriq needs to get the value of . And he already get two of them, can you help him to figure out the rest one?


Input

The first line contains a integer T(no more than 10000), which indicates the number of test cases. In the following T lines, each line contains two integers a and b () indicating the two angle Huangriq has already got.

Output

For each test case, output the rest angle's value with two digits after a decimal point in one line.

Sample Input

1
30 30

Sample Output

30.00


题意:

已知一等边三角形,以及角ABO,角OCB,角OAC其中两个角,求另一个未知的角。


解析:

确立一个坐标系,然后用计算几何直接算就行了。


代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long

using namespace std;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = acos(-1.0);
const double ee = exp(1.0);

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

bool cmp(Point A, Point B)
{
    if (A.x == B.x)
        return A.y < B.y;
    return A.x < B.x;
}

typedef Point Vector;

Vector operator + (Vector A, Vector B)
{
    return Vector(A.x + B.x, A.y + B.y);
}

Vector operator - (Point A, Point B)
{
    return Vector(A.x - B.x, A.y - B.y);
}

Vector operator * (Vector A, double p)
{
    return Vector(A.x * p, A.y * p);
}

Vector operator / (Vector A, double p)
{
    return Vector(A.x / p, A.y / p);
}

bool operator < (const Point& a, const Point& b)
{
    return a.x < b.x || (a.x == b.x && a.y < b.y);
}

int dcmp(double x)
{
    if (fabs(x) < eps)
    {
        return 0;
    }
    else
    {
        return x < 0 ? -1 : 1;
    }
}

bool operator == (const Point& a, const Point& b)
{
    return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}

double Dot(Vector A, Vector B)
{
    return A.x * B.x + A.y * B.y;
}

double Length(Vector A)
{
    return sqrt(Dot(A, A));
}

double Angle(Vector A, Vector B)///jiajiao
{
    return acos(Dot(A, B) / Length(A) / Length(B));
}

double Cross(Vector A, Vector B)
{
    return A.x * B.y - A.y * B.x;
}

double Area2(Point A, Point B, Point C)
{
    return Cross(B - A, C - A);
}

Vector Rotate(Vector A, double rad)
{
    return Vector(A.x * cos(rad) - A.y * sin(rad), A.x * sin(rad) + A.y * cos(rad));
}

Vector Normal(Vector A)//µ¥Î»·¨Ïß turn left 90 degrees
{
    double L = Length(A);
    return Vector(-A.y / L, A.x / L);
}

Point GetLineIntersection(Point P, Vector v, Point Q, Vector w)///jiadiao//
{
    Vector u = P - Q;
    double t = Cross(w, u) / Cross(v, w);
    return P + v * t;
}

double DistanceToLine(Point P, Point A, Point B)
{
    Vector v1 = B - A;
    Vector v2 = P - A;
    return fabs(Cross(v1, v2)) / Length(v1);
}

double DistanceToSegment(Point P, Point A, Point B)
{
    if (A == B)
    {
        return Length(P - A);
    }
    Vector v1 = B - A;
    Vector v2 = P - A;
    Vector v3 = P - B;
    if (dcmp(Dot(v1, v2)) < 0)
        return Length(v2);
    else if (dcmp(Dot(v1, v3)) > 0)
        return Length(v3);
    else
        return fabs(Cross(v1, v2)) / Length(v1);
}

bool SegmentProperIntersection(Point a1, Point a2, Point b1, Point b2)
{
    double c1 = Cross(a2 - a1, b1 - a1), c2 = Cross(a2 - a1, b2 - a1);
    double c3 = Cross(b2 - b1, a1 - b1), c4 = Cross(b2 - b1, a2 - b1);
    return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
}

bool OnSegment(Point p, Point a1, Point a2)
{
    return dcmp(Cross(a1 - p, a2 - p)) == 0 && dcmp(Dot(a1 - p, a2 - p)) < 0;
}

double ConvexPolygonArea(Point* p, int n)
{
    double area = 0;
    for (int i = 1; i < n - 1; i++)
    {
        area += Cross(p[i] - p[0], p[i + 1] - p[0]);
    }
    return area / 2.0;
}

double torad(double deg)
{
    return deg / 180 * pi;
}

int ConvexHull(Point* p, int n, Point* ch)
{
    sort(p, p + n, cmp);
    int m = 0;
    for (int i = 0; i < n; i++)
    {
        while (m > 1 && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0)
            m--;
        ch[m++] = p[i];
    }
    int k = m;
    for (int i = n - 2; i >= 0; i--)
    {
        while (m > k && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0)
            m--;
        ch[m++] = p[i];
    }
    if (n > 1)
        m--;
    return m;
}

Point readPoint(double x, double y)
{
//    double x, y;
//    scanf("%lf %lf", &x, &y);
    return Point(x, y);
}

//

const int maxn = 2500 + 10;

int main()
{
    #ifdef LOCAL
   // freopen("in.txt", "r", stdin);
    #endif // LOCAL
    int ncase;
    scanf("%d", &ncase);
    int ca = 1;
    while (ncase--)
    {
        Point A = readPoint(0, 0);
        Point B = readPoint(2, 0);
        Point C = readPoint(1, sqrt(3.0));
        double a, b;
        scanf("%lf%lf", &a, &b);
        double k = tan((60.0 - a) * pi / 180);
//        cout << k <<endl;
        Point D = readPoint(2, k * 2);
        k = tan((180.0 - b) * pi / 180);
        Point E = readPoint(0, -2 * k);
        Point J = GetLineIntersection(A, D - A, B, E - B);
//        cout << J.x << " " << J.y * 3 <<endl;
        double ans = Angle(J - C, B - C) * 180 / pi;
        printf("%.2lf\n", ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值