UVA - 11178 Morley's Theorem
2017-08-12 10:00
274 查看
按照刘汝佳老师说的,这道题本身没有什么算法可言,
主要是考察选手对于几何算法的应用,
我们已经知道了点A,B,C
如果要求点D的话
我们可以先求出向量C-B的坐标,然后求出向量C-B与A-B的夹角。
再把夹角/3,这样我们就找到了∠CBD的度数。
再把向量C-B逆时针旋转∠CBD度
就求出了点D的坐标,
E,F同理
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define Vector Point using namespace std; inline void read(int &n) { char c='+';bool flag=0;n=0; while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} while(c>='0'&&c<='9') n=n*10+(c-48),c=getchar(); if(flag==1)n=-n; } const double PI=acos(-1); const double eps=1e-10; int dcmp(double x) {return (fabs(x)<eps)?0:(x<0?-1:1);} struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y){}; }; Vector operator + (Vector A,Vector B) {return Vector(A.x + B.x,A.y + B.y);} Vector operator - (Vector A,Vector 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);} 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){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));}// 向量旋转********* Point GetLineIntersection(Point P,Point v,Point Q,Point w)// 两直线的交点 **************** { Vector u=P-Q; double t=Cross(w,u)/Cross(v,w); return P+v*t; } double DistanceToLine(Point P,Point A,Point B)// 点P到直线AB的距离 { Vector v1=B - A;Vector v2= P-A; return fabs(Cross(v1,v2)) / Length(v1); } double DistanceToSegment(Point P,Point A,Point B)// 点P到线段AB的距离 { if(A==B) return Length(P-A); Vector v1=B-A, v2=P-A, 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); } Point GetLineProjection(Point P, Point A, Point B)// 求点P在直线AB上的正投影 { Vector v=B-A; return A+v*(Dot(v, P-A) / Dot(v,v)); } bool SegmentProperIntersection(Point a1, Point a2, Point b1,Point b2)//判断两直线是否相交 { double c1 = Cross(a2-a1,b1-a1) , c2 = Cross(a2-a1,b2-a1), c3 = Cross(b2-b1,a1-b1) , c4 = Cross(b2-b1,a2-b1); return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4)<0; } double PolygonArae(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; } Point read_point() { double x,y; scanf("%lf%lf",&x,&y); return Point(x,y); } Point getans(Point A,Point B,Point C) { Vector v1= C-B; double ang1=Angle(A-B,v1); v1=Rotate(v1,ang1/3); Vector v2= B-C; double ang2=Angle(A-C,v2); v2=Rotate(v2,-ang2/3); return GetLineIntersection(B,v1,C,v2); } int main() { int T;read(T); while(T--) { Point A,B,C,D,E,F; A=read_point(); B=read_point(); C=read_point(); D=getans(A,B,C); E=getans(B,C,A); F=getans(C,A,B); printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", D.x, D.y, E.x, E.y, F.x, F.y); } return 0; }
相关文章推荐
- UVa 11178 Morley's Theorem (几何问题)
- 简单几何(求交点) UVA 11178 Morley's Theorem
- uva 11178 Morley's Theorem (2D Geometry)
- UVA 11178 Morley's Theorem(旋转+直线交点)
- UVA 11178 Morley's Theorem (计算几何)
- uva 11178 Morley's Theorem(计算几何-点和直线)
- UVa 11178 (简单练习) Morley's Theorem
- Uva 11178 Morley's Theorem
- Uva 11178 Morley's Theorem 向量旋转+求直线交点
- UVA 11178 - Morley's Theorem 向量
- uva 11178 Morley's Theorem
- uva 11178 - Morley's Theorem(训练指南)
- UVA - 11178-Morley’s Theorem
- UVA 11178 - Morley's Theorem(计算几何)
- UVA 11178 Morley's Theorem
- uva_11178 Morley's Theorem(计算几何)
- 【UVa 11178】Morley's Theorem (计算几何)
- UVA 11178 - Morley's Theorem 简单的计算几何
- UVA-11178 - Morley's Theorem(计算几何)
- UVA 11178 Morley’s Theorem(莫雷定理 计算几何)