UVA 11178 Morley's Theorem(几何)
Morley's Theorem
【题目链接】Morley's Theorem
【题目类型】几何
&题解:
蓝书P259 简单的几何模拟,但要熟练的应用模板,还有注意模板的适用范围和传参不要传混了
&代码:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxn= 1e3 +7;
//蓝书P255
//1.点的定义
struct Point {
double x,y;
Point (double x=0,double y=0):x(x),y(y) {}
};
//点和向量是一样的内容 所以会出来2个名字
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);}
const double eps=1e-10;
//doublue的三态函数
int dcmp(double x) {
if(fabs(x)<eps) x=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) {return acos(Dot(A,B)/Length(A)/Length(B));}
//叉积
double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;}
//有向面积,数值是三角形面积的2倍
double Area2(Point A,Point B,Point C) {return Cross(B-A,C-A);}
//向量旋转,doublue的都是弧度
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) {
double L=Length(A);
return Vector(-A.y/L,A.x/L);
}
//2.点和直线
//调用前请确保两条直线P+tv和Q+tw有唯一交点.当且仅当Cross(v,w)非0
Point GetLineIntersection(Point P,Vector v,Point Q,Vector w) {
Vector u=P-Q;
double t=Cross(w,u)/Cross(v,w);
return P+v*t;
}
//点P到直线(过点A,B)的距离
double DistanceToLine(Point P,Point A,Point B) {
Vector v1=B-A,v2=P-A;
return fabs(Cross(v1,v2))/Length(v1);//不加fabs,得到的是有向距离
}
//点P到线段AB的距离
double DistanceToSegment(Point P,Point A,Point B) {
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);
}
//求点P在直线AB的投影点Q
Point GetLineProjection(Point P,Point A,Point B) {
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;
}
//判断点P是否在线段AB上(不包含线段的端点)
bool OnSegment(Point p,Point a1,Point a2) {
return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;
}
//多边形的有向面积
double PolygonArea(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 GetD(Point A,Point B,Point C) {
double tht1=Angle(A-B,C-B),tht2=Angle(A-C,B-C);
Vector v1=Rotate(C-B,tht1/3),v2=Rotate(B-C,-tht2/3);//顺时针转,角度呀变负,逆时针转,角度是正的
return GetLineIntersection(B,v1,C,v2);
}
int main() {
//("E:1.in","r",stdin);
int T;
Point A,B,C,D,E,F;
scanf("%d",&T);
while(T--) {
scanf("%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
D=GetD(A,B,C); E=GetD(B,C,A); F=GetD(C,A,B);
printf("%f %f %f %f %f %f\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 (几何问题)
题意:给定三角形的三个点,让你求它每个角的三等分线所交的顶点. 析:根据自己的以前的数学知识,应该很容易想到思想,比如D点,就是应该求直线BD和CD的交点, 以前还得自己算,现在计算机帮你算,更方便, ...
- uva 11178 - Morley's Theorem
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA 11178 Morley's Theorem (坐标旋转)
题目链接:UVA 11178 Description Input Output Sample Input Sample Output Solution 题意 \(Morley's\ theorem\) ...
- UVa 11178:Morley’s Theorem(两射线交点)
Problem DMorley’s TheoremInput: Standard Input Output: Standard Output Morley’s theorem states that ...
- 简单几何(求交点) UVA 11178 Morley's Theorem
题目传送门 题意:莫雷定理,求三个点的坐标 分析:训练指南P259,用到了求角度,向量旋转,求射线交点 /*********************************************** ...
- UVA 11178 - Morley's Theorem 向量
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- Uva 11178 Morley's Theorem 向量旋转+求直线交点
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=9 题意: Morlery定理是这样的:作三角形ABC每个 ...
- UVA 11178 Morley's Theorem(旋转+直线交点)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18543 [思路] 旋转+直线交点 第一个计算几何题,照着书上代码打 ...
- UVA 11178 Morley's Theorem 计算几何模板
题意:训练指南259页 #include <iostream> #include <cstdio> #include <cstring> #include < ...
随机推荐
- tensorflow中的tf.app.run()的使用
指明函数的入口,即从哪里执行函数. 如果你的代码中的入口函数不叫main(),而是一个其他名字的函数,如test(),则你应该这样写入口tf.app.run(test()) 如果你的代码中的入口函数叫 ...
- 远程登录oracle 12.2数据库报错ORA-28040解决办法
今天新安装的oracle 12.2.0.1数据库,通过本地sqlplus远程登录12c数据库报错ora-28040,如下: ORA-28040: No matching authentication ...
- java设计模式--单例
GOF23(group of four)---由4个大牛总结的JAVA23种常用的设计模式,归根结底都是为了代码的可扩展性. 设计模式中一种比较重要的思想就是:开闭原则,尽量做到对扩展开放,对修改关闭 ...
- 随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎
MYSQL 解锁与锁表 - 专注it - 博客园 https://www.cnblogs.com/wanghuaijun/p/5949934.html 2016-10-11 16:50 MYSQL 解 ...
- CSS盒子模型(简要了解)
CSS中, Box Model叫盒子模型(或框模型),Box Model规定了元素框处理元素内容(element content).内边距(padding).边框(border) 和 外边距(marg ...
- Java之旅_面向对象_包(Package)
http://www.runoob.com/java/java-package.html 包的作用: 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样,包也采用 ...
- 20165336 实验二 Java面向对象程序设计
20165336 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:康志强 学号:20165336 指导教师:娄嘉鹏 实验日期:2018年4月16日 ...
- linux进程间通信同步-共享内存
参考:https://www.cnblogs.com/charlesblc/p/6142868.html 使用有名信号量,sem_open().sem_close().sem_post().sem_w ...
- nodejs 学习六 express 三种查询url参数方法
req.param() 是被废弃的api req.params 俗点:取带冒号的参数 req.body 可以肯定的一点是req.body一定是post请求,express里依赖的中间件必须有bodyP ...
- 安全需求-建模归类——By Me
漏洞与Bug并不等同,他们之间的关系基本可以描述为:大部分的Bug影响功能性,并不涉及安全性,也就不构成漏洞:大部分的漏洞来源于Bug,但并不是全部,它们之间只是有一个很大的交集.可以用如下这个图来展 ...