本文主要是介绍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 longusing 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);elsereturn 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 // LOCALint 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;
}
这篇关于XTU 1237 计算几何的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!