UVA - 11178-Morley’s Theorem

就是给出一个等边三角形的三个顶点坐标
然后每一个角的三等分线会交错成一个三角形,求出这个三角形的顶点坐标
一開始。我题意理解错了……还以为是随意三角形,所以代码可以处理随意三角形的情况
我的做法:
通过旋转点的位置得到这些三等分线的直线方程,然后用高斯消元求交点
我的代码:
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct dot
{
double x,y;
dot(){}
dot(double a,double b){x=a;y=b;}
dot operator -(const dot &a){return dot(x-a.x,y-a.y);}
dot operator +(const dot &a){return dot(x+a.x,y+a.y);}
double mod(){return sqrt(pow(x,2)+pow(y,2));}
double mul(const dot &a){return x*a.x+y*a.y;}
};
void gauss(double a[10][10])
{
int i,j,k,t,n=2;
for(i=0;i<n;i++)
{
t=i;
for(j=i+1;j<n;j++)
if(fabs(a[j][i])>fabs(a[t][i]))
t=i;
if(i!=t)
for(j=i;j<=n;j++)
swap(a[i][j],a[t][j]);
if(a[i][i]!=0)
for(j=i+1;j<n;j++)
for(k=n;k>=i;k--)
a[j][k]-=a[j][i]/a[i][i]*a[i][k];
}
for(i=n-1;i>-1;i--)
{
for(j=i+1;j<n;j++)
a[i][n]-=a[i][j]*a[j][n];
a[i][n]/=a[i][i];
}
}
dot ro(dot a,dot b,double c)
{
a=a-b;
a=dot(a.x*cos(c)-a.y*sin(c),a.x*sin(c)+a.y*cos(c));
return a+b;
}
int main()
{
pair<dot,dot>t;
dot a[3];
double b,c[10][10];
int n,i;
cin>>n;
while(n--)
{
for(i=0;i<3;i++)
scanf("%lf%lf",&a[i].x,&a[i].y); t.first=a[0]-a[1];t.second=a[2]-a[1];
b=acos(t.first.mul(t.second)/t.first.mod()/t.second.mod())/3;
t.first=a[1];t.second=ro(a[2],a[1],b);
c[0][0]=t.first.y-t.second.y;c[0][1]=t.second.x-t.first.x;c[0][2]=t.second.x*t.first.y-t.second.y*t.first.x; t.first=a[1]-a[2];t.second=a[0]-a[2];
b=2*acos(t.first.mul(t.second)/t.first.mod()/t.second.mod())/3;
t.first=a[2];t.second=ro(a[0],a[2],b);
c[1][0]=t.first.y-t.second.y;c[1][1]=t.second.x-t.first.x;c[1][2]=t.second.x*t.first.y-t.second.y*t.first.x; gauss(c); printf("%.6lf %.6lf ",c[0][2],c[1][2]); t.first=a[1]-a[2];t.second=a[0]-a[2];
b=acos(t.first.mul(t.second)/t.first.mod()/t.second.mod())/3;
t.first=a[2];t.second=ro(a[0],a[2],b);
c[0][0]=t.first.y-t.second.y;c[0][1]=t.second.x-t.first.x;c[0][2]=t.second.x*t.first.y-t.second.y*t.first.x; t.first=a[1]-a[0];t.second=a[2]-a[0];
b=2*acos(t.first.mul(t.second)/t.first.mod()/t.second.mod())/3;
t.first=a[0];t.second=ro(a[1],a[0],b);
c[1][0]=t.first.y-t.second.y;c[1][1]=t.second.x-t.first.x;c[1][2]=t.second.x*t.first.y-t.second.y*t.first.x; gauss(c); printf("%.6lf %.6lf ",c[0][2],c[1][2]); t.first=a[1]-a[0];t.second=a[2]-a[0];
b=acos(t.first.mul(t.second)/t.first.mod()/t.second.mod())/3;
t.first=a[0];t.second=ro(a[1],a[0],b);
c[0][0]=t.first.y-t.second.y;c[0][1]=t.second.x-t.first.x;c[0][2]=t.second.x*t.first.y-t.second.y*t.first.x; t.first=a[0]-a[1];t.second=a[2]-a[1];
b=2*acos(t.first.mul(t.second)/t.first.mod()/t.second.mod())/3;
t.first=a[1];t.second=ro(a[2],a[1],b);
c[1][0]=t.first.y-t.second.y;c[1][1]=t.second.x-t.first.x;c[1][2]=t.second.x*t.first.y-t.second.y*t.first.x; gauss(c); printf("%.6lf %.6lf\n",c[0][2],c[1][2]);
}
}
原题:
Problem D
Morley’s Theorem
Input: Standard Input
Output: Standard Output
Morley’s theorem states that that the lines trisecting the angles of an arbitrary plane triangle meet at the vertices of an equilateral triangle. For example in the figure below the tri-sectors of angles A, B and C has intersected and created an equilateral
triangle DEF.

Of course the theorem has various generalizations, in particular if all of the tri-sectors are intersected one obtains four other equilateral triangles. But in the original theorem only tri-sectors nearest to BC are allowed to intersect to get point D, tri-sectors
nearest to CA are allowed to intersect point E and tri-sectors nearest to AB are intersected to get point F. Trisector like BD and CE are not allowed to intersect. So ultimately we get only one equilateral triangle DEF. Now your task is to find the Cartesian
coordinates of D, E and F given the coordinates of A, B, and C.
Input
First line of the input file contains an integer N (0<N<5001) which denotes the number of test cases to follow. Each of the next lines contain six integers
. This six integers actually indicates that the Cartesian coordinates of point A, B and C are
respectively. You can assume that the area of triangle ABC is not equal to zero,
and the points A, B and C are in counter clockwise order.
Output
For each line of input you should produce one line of output. This line contains six floating point numbers
separated by a single space. These six floating-point actually means that the Cartesian coordinates of D, E and F are
respectively. Errors less than
will be accepted.
Sample Input Output for Sample Input
2 1 1 2 2 1 2 0 0 100 0 50 50 |
1.316987 1.816987 1.183013 1.683013 1.366025 1.633975 56.698730 25.000000 43.301270 25.000000 50.000000 13.397460 |
Problemsetters: Shahriar Manzoor
Special Thanks: Joachim Wulff
Source
option=com_onlinejudge&Itemid=8&category=44">
Shahriar Manzoor
Root :: AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) :: Chapter 4. Geometry :: Geometric Computations in 2D ::
Examples
UVA - 11178-Morley’s Theorem的更多相关文章
- 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(几何)
Morley's Theorem [题目链接]Morley's Theorem [题目类型]几何 &题解: 蓝书P259 简单的几何模拟,但要熟练的应用模板,还有注意模板的适用范围和传参不要传 ...
- UVa 11178:Morley’s Theorem(两射线交点)
Problem DMorley’s TheoremInput: Standard Input Output: Standard Output Morley’s theorem states that ...
- 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 (几何问题)
题意:给定三角形的三个点,让你求它每个角的三等分线所交的顶点. 析:根据自己的以前的数学知识,应该很容易想到思想,比如D点,就是应该求直线BD和CD的交点, 以前还得自己算,现在计算机帮你算,更方便, ...
- 简单几何(求交点) UVA 11178 Morley's Theorem
题目传送门 题意:莫雷定理,求三个点的坐标 分析:训练指南P259,用到了求角度,向量旋转,求射线交点 /*********************************************** ...
- UVA 11178 Morley's Theorem 计算几何模板
题意:训练指南259页 #include <iostream> #include <cstdio> #include <cstring> #include < ...
随机推荐
- FSHC之MCU接口部分理解
|_____________| |_____| |__ ...
- 【php】 PHP 支持 9 种原始数据类型
PHP 支持 9 种原始数据类型. 四种标量类型: boolean(布尔型) integer(整型) float(浮点型,也称作 double) string(字符串) 三种复合类型: array(数 ...
- jQuery和Vue
jQuery 概述 是js的一种函数库有美国人 John Resig编写 特点 写的少,做的多,国内用的jq1.0版本,可以兼容低版本的浏览器,支持链式编程或链式调用和隐式迭代 链式编程 $(this ...
- pycharm添加wordcloud模块时报错:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
windows 7 32bit python3.6.3 32bit pycharm2018社区版 32bit 问题说明: 添加wordcloud模块时报错:error: Microsoft Visua ...
- Java中TreeMap集合讲解
1.TreeSet介绍 TreeSet是一个有序集合,可以以任意顺序将元素插入到集合中,在对集合进行遍历的时候,每个元素将自动按照排序后的顺序呈现.底层使用的是二叉树(更具体点是红黑树)实现,对于元素 ...
- PAT Basic 1033
1033 旧键盘打字 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在 2 行中分别给出坏掉 ...
- Python 输出命令行进度条
在使用 pip 安装时,你会发现有下载进度条,我们也可以借助开源的第三方库来实现这个功能,在项目输出时增加一些可视化效果. 一个简单易用的第三方库是:progress 作者提供了动图很直观地展现了实现 ...
- Action的实现方式
[Pojo方式] 1.概述 Pojo(Plain Ordinary Java Object)称为简单Java类,其实就是一个JavaBean. 2.示例 /** * Pojo类方式实现Action * ...
- 00032_ArrayList集合的遍历
1.通过集合遍历,得到集合中每个元素,这是集合中最常见的操作 2.集合的遍历与数组的遍历很像,都是通过索引的方式 public class ArrayListDemo02 { public stati ...
- Mac 文档阅读软件Dash软件破解版
1.Dash 破解版链接 Mac 上阅读开发文档的软件:支持java.spring.springBoot等.百度网盘下载链接和密码如下. 链接:https://pan.baidu.com/s/1RWM ...