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 < ...
随机推荐
- Life is short.,You need Python
真棒Python https://awesome-python.com/ 精选的Python框架,库,软件和资源的精选列表. 灵感来自awesome-php. 真棒Python 管理员面板 算法和设 ...
- DNS服务-主从架构搭建
为了网站的可靠性,通常都会有多个DNS服务器,万一DNS服务器宕机了,可以实现DNS服务器容错 通常都会有一个主DNS服务器,后面配若干个辅助DNS服务器,这个主DNS服务器的数据库会同步给其他的DN ...
- Vector模板类----构造与析构
/* 基于C++平台*/ typedef int rank; //用int来定义 “秩” 这种概念 #define DEFAULT_CAPACIITY 3 //默认初始容量,实际应用中可以取更大的值 ...
- performSelectorOnMainThread
在多线程操作中,有一个著名的错误,叫做"Tried to obtain the web lock from a thread other than the main thread or th ...
- FineMessBox的js依赖导致错误Uncaught ReferenceError: addEvent is not defined
/** * COMMON DHTML FUNCTIONS * These are handy functions I use all the time. * * By Seth Banks ( ...
- java面向抽象编程样例
import java.util.*; abstract class Geometry{ public abstract double getArea(); } class Pillar ...
- vamare下centos7.0 动态获取ip报错问题
CentOS7 Failed to start LSB: Bring up/down解决方法 centos7.0中service network restart重启报错的问题 报错信息: /etc/i ...
- DDLog-不同颜色打印信息
(一)下载安装 1.安装插件 XcodeColors Github 链接:https://github.com/robbiehanson/XcodeColors 打开XcodeColors项目,编译即 ...
- 【Luogu】P1393动态逆序对(树套树)
题目链接 树套树. 每次删掉x的时候会减去1到x-1里比x位置的数大的数和它构成的逆序对,以及x+1到n里比x位置的数小的数和它构成的逆序对. 顺带一提我发现平衡树insert的时候不是要splay一 ...
- 【kmp+最小循环节】poj 2406 Power Strings
http://poj.org/problem?id=2406 [题意] 给定字符串s,s=a^n,a是s的子串,求n最大是多少 [思路] kmp中的next数组求最小循环节的应用 例如 ababab ...