Morley's Theorem

【题目链接】Morley's Theorem

【题目类型】几何

&题解:

蓝书P259 简单的几何模拟,但要熟练的应用模板,还有注意模板的适用范围和传参不要传混了

&代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. typedef long long ll;
  5. const int maxn= 1e3 +7;
  6. //蓝书P255
  7. //1.点的定义
  8. struct Point {
  9. double x,y;
  10. Point (double x=0,double y=0):x(x),y(y) {}
  11. };
  12. //点和向量是一样的内容 所以会出来2个名字
  13. typedef Point Vector;
  14. //向量+向量=向量, 点+向量=点
  15. Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x,A.y+B.y);}
  16. //点-点=向量
  17. Vector operator - (Point A,Point B) {return Vector(A.x-B.x,A.y-B.y);}
  18. //向量*数=向量
  19. Vector operator * (Vector A,double p) {return Vector(A.x*p,A.y*p);}
  20. //向量/数=向量
  21. Vector operator / (Vector A,double p) {return Vector(A.x/p,A.y/p);}
  22. bool operator < (const Point& a,const Point& b) {return a.x<b.x||(a.x==b.x&&a.y<b.y);}
  23. const double eps=1e-10;
  24. //doublue的三态函数
  25. int dcmp(double x) {
  26. if(fabs(x)<eps) x=0;
  27. else return x<0?-1:1;
  28. }
  29. bool operator == (const Point& a,const Point& b) {return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;}
  30. //点积
  31. double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}
  32. //向量长度
  33. double Length(Vector A) {return sqrt(Dot(A,A));}
  34. //向量夹角
  35. double Angle(Vector A,Vector B) {return acos(Dot(A,B)/Length(A)/Length(B));}
  36. //叉积
  37. double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;}
  38. //有向面积,数值是三角形面积的2倍
  39. double Area2(Point A,Point B,Point C) {return Cross(B-A,C-A);}
  40. //向量旋转,doublue的都是弧度
  41. Vector Rotate(Vector A,double rad) {
  42. return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
  43. }
  44. //求单位法向量
  45. Vector Normal(Vector A) {
  46. double L=Length(A);
  47. return Vector(-A.y/L,A.x/L);
  48. }
  49. //2.点和直线
  50. //调用前请确保两条直线P+tv和Q+tw有唯一交点.当且仅当Cross(v,w)非0
  51. Point GetLineIntersection(Point P,Vector v,Point Q,Vector w) {
  52. Vector u=P-Q;
  53. double t=Cross(w,u)/Cross(v,w);
  54. return P+v*t;
  55. }
  56. //点P到直线(过点A,B)的距离
  57. double DistanceToLine(Point P,Point A,Point B) {
  58. Vector v1=B-A,v2=P-A;
  59. return fabs(Cross(v1,v2))/Length(v1);//不加fabs,得到的是有向距离
  60. }
  61. //点P到线段AB的距离
  62. double DistanceToSegment(Point P,Point A,Point B) {
  63. if(A==B) return Length(P-A);
  64. Vector v1=B-A,v2=P-A,v3=P-B;
  65. if(dcmp(Dot(v1,v2))>0) return Length(v2);
  66. else if(dcmp(Dot(v1,v3))>0) return Length(v3);
  67. else return fabs(Cross(v1,v2))/Length(v1);
  68. }
  69. //求点P在直线AB的投影点Q
  70. Point GetLineProjection(Point P,Point A,Point B) {
  71. Vector v=B-A;
  72. return A+v*(Dot(v,P-A)/Dot(v,v));
  73. }
  74. //线段相交判定,两线段恰好有一个公共点,且不在任何一条线段的端点
  75. bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2) {
  76. double c1=Cross(a2-a1,b1-a1), c2=Cross(a2-a1,b2-a1),
  77. c3=Cross(b2-b1,a1-b1), c4=Cross(b2-b1,a2-b1);
  78. return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
  79. }
  80. //判断点P是否在线段AB上(不包含线段的端点)
  81. bool OnSegment(Point p,Point a1,Point a2) {
  82. return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;
  83. }
  84. //多边形的有向面积
  85. double PolygonArea(Point* p,int n) {
  86. double area=0;
  87. for(int i=1; i<n-1; i++) {
  88. area+=Cross(p[i]-p[0],p[i+1]-p[0]);
  89. }
  90. return area/2;
  91. }
  92. //解题代码
  93. Point GetD(Point A,Point B,Point C) {
  94. double tht1=Angle(A-B,C-B),tht2=Angle(A-C,B-C);
  95. Vector v1=Rotate(C-B,tht1/3),v2=Rotate(B-C,-tht2/3);//顺时针转,角度呀变负,逆时针转,角度是正的
  96. return GetLineIntersection(B,v1,C,v2);
  97. }
  98. int main() {
  99. //("E:1.in","r",stdin);
  100. int T;
  101. Point A,B,C,D,E,F;
  102. scanf("%d",&T);
  103. while(T--) {
  104. scanf("%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
  105. D=GetD(A,B,C); E=GetD(B,C,A); F=GetD(C,A,B);
  106. printf("%f %f %f %f %f %f\n",D.x,D.y,E.x,E.y,F.x,F.y);
  107. }
  108. return 0;
  109. }

UVA 11178 Morley's Theorem(几何)的更多相关文章

  1. UVa 11178 Morley's Theorem (几何问题)

    题意:给定三角形的三个点,让你求它每个角的三等分线所交的顶点. 析:根据自己的以前的数学知识,应该很容易想到思想,比如D点,就是应该求直线BD和CD的交点, 以前还得自己算,现在计算机帮你算,更方便, ...

  2. uva 11178 - Morley's Theorem

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  3. UVA 11178 Morley's Theorem (坐标旋转)

    题目链接:UVA 11178 Description Input Output Sample Input Sample Output Solution 题意 \(Morley's\ theorem\) ...

  4. UVa 11178:Morley’s Theorem(两射线交点)

    Problem DMorley’s TheoremInput: Standard Input Output: Standard Output Morley’s theorem states that ...

  5. 简单几何(求交点) UVA 11178 Morley's Theorem

    题目传送门 题意:莫雷定理,求三个点的坐标 分析:训练指南P259,用到了求角度,向量旋转,求射线交点 /*********************************************** ...

  6. UVA 11178 - Morley's Theorem 向量

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  7. Uva 11178 Morley's Theorem 向量旋转+求直线交点

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=9 题意: Morlery定理是这样的:作三角形ABC每个 ...

  8. UVA 11178 Morley's Theorem(旋转+直线交点)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18543 [思路] 旋转+直线交点 第一个计算几何题,照着书上代码打 ...

  9. UVA 11178 Morley's Theorem 计算几何模板

    题意:训练指南259页 #include <iostream> #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. React中Props 和 State用法

    React中Props 和 State用法 1.本质 一句话概括,props 是组件对外的接口,state 是组件对内的接口.组件内可以引用其他组件,组件之间的引用形成了一个树状结构(组件树),如果下 ...

  2. 用PIP 安装或升级python遇到错误提示

    用PIP 安装或升级python遇到错误提示 $ pip install pythons Collecting pythons Could not find a version that satisf ...

  3. [development][semaphore] 信号量/信号灯/信号标/旗语

    前言: 接续前节 [development][C] 条件变量(condition variables)的应用场景是什么 之前讨论了条件变量的问题, 已经知道在逻辑上, 条件变量(管程)(moniter ...

  4. 转:AOP与JAVA动态代理

    原文链接:AOP与JAVA动态代理 1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代 ...

  5. LeetCode 832 Flipping an Image 解题报告

    题目要求 Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the ...

  6. excel之导出

    1.Maven依赖的jar包 <dependency>     <groupId>org.apache.poi</groupId>     <artifact ...

  7. jquery 数组的操作

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  8. tomcat停止和启动脚本

    日常重启tomcat比较麻烦,所以写了2个脚本,在脚本后输入tomcat名称即可 启动或重启tomcat #!/bin/sh TOMCAT_HOME=/usr/java/$1 if [ ! -n &q ...

  9. 多点数据同步服务器sql汇总

    1. a表中是否存在c的列 IF COL_LENGTH('FeeType', 'ftName') IS NOT NULL select N'存在'as result ELSE select N'不存在 ...

  10. es的scoll滚动查询技术

    如果一次性要查出来比如10万条数据,那么性能会很差,此时一般会采取用scoll滚动查询,一批一批的查,直到所有数据都查询完处理完 使用scoll滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以 ...