UVA - 11178 Morley's Theorem
时间:2022-05-08
本文章向大家介绍UVA - 11178 Morley's Theorem,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
按照刘汝佳老师说的,这道题本身没有什么算法可言,
主要是考察选手对于几何算法的应用,
我们已经知道了点A,B,C
如果要求点D的话
我们可以先求出向量C-B的坐标,然后求出向量C-B与A-B的夹角。
再把夹角/3,这样我们就找到了∠CBD的度数。
再把向量C-B逆时针旋转∠CBD度
就求出了点D的坐标,
E,F同理
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<cmath>
5 #define Vector Point
6 using namespace std;
7 inline void read(int &n)
8 {
9 char c='+';bool flag=0;n=0;
10 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
11 while(c>='0'&&c<='9') n=n*10+(c-48),c=getchar();
12 if(flag==1)n=-n;
13 }
14 const double PI=acos(-1);
15 const double eps=1e-10;
16 int dcmp(double x) {return (fabs(x)<eps)?0:(x<0?-1:1);}
17 struct Point
18 {
19 double x,y;
20 Point(double x=0,double y=0):x(x),y(y){};
21 };
22 Vector operator + (Vector A,Vector B) {return Vector(A.x + B.x,A.y + B.y);}
23 Vector operator - (Vector A,Vector B) {return Vector(A.x - B.x,A.y - B.y);}
24 Vector operator * (Vector A,double P) {return Vector(A.x * P,A.y * P);}
25 Vector operator / (Vector A,double P) {return Vector(A.x / P,A.y / P);}
26 bool operator < (const Point &a,const Point &b){return a.x < b.x || (a.x == b.x && a.y < b.y);}
27 bool operator == (const Point &a,const Point &b){return dcmp(a.x - b.x)==0 && dcmp(a.y - b.y)==0;}
28
29 double Dot(Vector A,Vector B){return A.x * B.x + A.y * B.y;}//点积 ********************
30 double Length(Vector A){return sqrt(Dot(A,A));}// 求向量的长度
31 double Angle(Vector A,Vector B){return acos(Dot(A,B) / (Length(A)) / Length(B));} //求两个向量的夹角
32
33 double Cross(Vector A,Vector B){return A.x * B.y-A.y * B.x;}// 两个向量的叉积
34 double Area2(Point A,Point B,Point C){return Cross(B - A,C - A);}
35
36 Vector Rotate(Vector A,double rad){return Vector(A.x * cos(rad)-A.y * sin(rad),A.x * sin(rad)+A.y * cos(rad));}// 向量旋转*********
37
38 Point GetLineIntersection(Point P,Point v,Point Q,Point w)// 两直线的交点 ****************
39 {
40 Vector u=P-Q;
41 double t=Cross(w,u)/Cross(v,w);
42 return P+v*t;
43 }
44
45 double DistanceToLine(Point P,Point A,Point B)// 点P到直线AB的距离
46 {
47 Vector v1=B - A;Vector v2= P-A;
48 return fabs(Cross(v1,v2)) / Length(v1);
49 }
50
51 double DistanceToSegment(Point P,Point A,Point B)// 点P到线段AB的距离
52 {
53 if(A==B) return Length(P-A);
54 Vector v1=B-A, v2=P-A, v3=P-B;
55 if(dcmp(Dot(v1,v2)) < 0) return Length(v2);
56 else if(dcmp(Dot(v1,v3)) > 0) return Length(v3);// 怎么会是大于。。。。。。
57 else return fabs(Cross(v1,v2)) / Length(v1);
58 }
59
60 Point GetLineProjection(Point P, Point A, Point B)// 求点P在直线AB上的正投影
61 {
62 Vector v=B-A;
63 return A+v*(Dot(v, P-A) / Dot(v,v));
64 }
65
66 bool SegmentProperIntersection(Point a1, Point a2, Point b1,Point b2)//判断两直线是否相交
67 {
68 double c1 = Cross(a2-a1,b1-a1) , c2 = Cross(a2-a1,b2-a1),
69 c3 = Cross(b2-b1,a1-b1) , c4 = Cross(b2-b1,a2-b1);
70 return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4)<0;
71 }
72
73 double PolygonArae(Point *p,int n)// 求多边形的有向面积
74 {
75 double area = 0;
76 for(int i=1;i<=n-1;i++)
77 area += Cross(p[i]-p[0],p[i+1]-p[0]);
78 return area/2;
79 }
80 Point read_point()
81 {
82 double x,y;
83 scanf("%lf%lf",&x,&y);
84 return Point(x,y);
85 }
86 Point getans(Point A,Point B,Point C)
87 {
88 Vector v1= C-B;
89 double ang1=Angle(A-B,v1);
90 v1=Rotate(v1,ang1/3);
91
92 Vector v2= B-C;
93 double ang2=Angle(A-C,v2);
94 v2=Rotate(v2,-ang2/3);
95
96 return GetLineIntersection(B,v1,C,v2);
97 }
98 int main()
99 {
100 int T;read(T);
101 while(T--)
102 {
103 Point A,B,C,D,E,F;
104 A=read_point();
105 B=read_point();
106 C=read_point();
107 D=getans(A,B,C);
108 E=getans(B,C,A);
109 F=getans(C,A,B);
110 printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lfn", D.x, D.y, E.x, E.y, F.x, F.y);
111 }
112
113 return 0;
114 }
- daterangepicker日历插件使用参数注意问题
- 学习zepto.js(对象方法)[5]
- js 停止事件冒泡 阻止浏览器的默认行为
- vue-cli生成的项目配置开发和生产环境不同的接口
- 【52ABP实战教程】0.1-- Devops如何用VSTS持续集成到Github仓库!
- 学习zepto.js(对象方法)[4]
- 事件绑定的几种常见方式
- vue的iview列表table render函数设置DOM属性值的方法
- js焦点轮播图
- vue父组件中获取子组件中的数据
- 学习zepto.js(对象方法)[3]
- bootstrap 标签页tab切换js(含报错原因)
- 学习zepto.js(对象方法)[2]
- vue-router 2 跳转失败原因
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 常见编程模式之双指针
- python操作txt文件中数据教程[2]-python提取txt文件中的行列元素
- JSON 是什么?它能带来什么?它和 XML 比较?
- 一起来学演化计算-实数空间变异算子
- 卡特兰数入门
- 常见编程模式之动态规划:0-1背包问题
- stat 命令家族(2)- 详解 pidstat
- MTO和MaTO MMZDT
- stat 命令家族(3)- 详解 mpstat
- 知识图谱入门(一)
- PHP判断变量内容是什么编码(gbk?utf-8) mb_detect_encoding
- stat 命令家族(4)- 详解 iostat
- PHP将数组存入数据库中的四种方式
- 序列化与json性能评测
- js内存泄漏常见的四种情况(From LeuisKen)