UVa11187
莫勒定理,证明如下:
请结合下图看代码:
#include <iostream>
#include <math.h>
#include <iomanip> using namespace std; #define pi acos(-1.0) double lawofcosine(double a, double b, double c)
{
return acos((a*a+b*b-c*c)/(2.0*a*b));
} double getangle(double x1, double y1, double x2, double y2)
{
return atan2(1.0*(y2-y1),1.0*(x2-x1));
} double getdis(double x1, double y1, double x2, double y2)
{
return sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));
} double solveequation_x(double x1, double y1, double x2, double y2, double k1, double k2)
{
return (y1-y2+k2*x2-k1*x1)/(k2-k1);
} typedef struct point
{
double x, y;
} p; int main()
{
p A, B, C, D, E, F;
int n;
cin>>n;
while(n--)
{
cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y; double a,b,c; //cout << A.x << ' ' << A.y << ' ' << B.x << ' ' << B.y << ' ' << C.x << ' ' << C.y << endl; a = getdis(B.x,B.y,C.x,C.y);
b = getdis(C.x,C.y,A.x,A.y);
c = getdis(B.x,B.y,A.x,A.y); //cout << "dis" << ' ' << a << '!' << b << '!' << c << endl; double alpha = lawofcosine(b,c,a);
double beta = lawofcosine(a,c,b);
double gama = lawofcosine(a,b,c); //cout << "angle" << ' ' << alpha * 180 / pi << '@' << beta * 180 / pi << '@' << gama * 180 / pi<<endl; double theta1 = getangle(A.x,A.y,B.x,B.y);//k(AB)angle
double theta2 = getangle(B.x,B.y,C.x,C.y);//k(CB)angle
double theta3 = getangle(A.x,A.y,C.x,C.y);//k(AC)angle //cout << "theta" << ' ' << theta1 * 180 / pi << '#' << theta2 * 180 / pi<< '#' << theta3 * 180 / pi<< endl; double k1 = tan(theta2 + beta / 3.0);//k(BD)
double k2 = tan(theta3 + gama / 3.0);//k(CE)
double k3 = tan(theta3 + 2.0 * gama / 3.0);//k(CD)
double k4 = tan(theta1 + 2.0 * alpha / 3.0);//k(AE) //cout << "k" << '$' << k1 * 180 / pi << '$' << k2 * 180 / pi << '$' << k3 * 180 / pi << '$' << k4 * 180 / pi << endl; D.x = (k1 * B.x - k3 * C.x + C.y - B.y) / (k1 - k3);
D.y = D.x * k1 - k1 * B.x + B.y; E.x = (k2 * C.x - k4 * A.x + A.y - C.y) / (k2 - k4);
E.y = E.x * k2 - k2 * C.x + C.y; double x1, y1, x2, y2;
x2 = D.x, y2 = D.y, x1 = E.x, y1 = E.y; double alpha1 = atan2((y1-y2),(x1-x2));
double l = sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));
double x3=x2+l*cos(alpha1+pi/3);
double y3=y2+l*sin(alpha1+pi/3); F.x = x3, F.y = y3; cout << fixed << setprecision(7) << D.x << ' ' << D.y << ' ' << E.x << ' ' << E.y << ' ' << F.x << ' ' << F.y << endl;
}
}
变成解析几何就太麻烦了,可是欧氏几何又没有现成的关系
UVa11187的更多相关文章
随机推荐
- Focal Loss for Dense Object Detection 论文阅读
何凯明大佬 ICCV 2017 best student paper 作者提出focal loss的出发点也是希望one-stage detector可以达到two-stage detector的准确 ...
- 洛谷P2296寻找道路
传送门啦 题目中有一个条件是路径上的所有点的出边所指向的点都直接或间接与终点连通. 所以我们要先判断能否走这一个点, $ bfs $ 类似 $ spfa $ 的一个判断,打上标记. 在这我反向建图,最 ...
- MySQL缓存命中率概述及如何提高缓存命中率
MySQL缓存命中率概述 工作原理: 查询缓存的工作原理,基本上可以概括为: 缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句: 新的SELECT语句或预处理查询语句 ...
- JAVA复习笔记之多线程并发
前言:多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,还是值得深入研究一下 概念: 1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使用 ...
- jmock2.5 基本教程
目录 第0章 概述 第1章 jmock初体验 第2章 期望 第3章 返回值 第4章 参数匹配 第5章 指定方法调用次数 第6章 指定执行序列 第7章 状态机 第0章 概述 现在的dev不是仅仅要写co ...
- loadrunner 的Administration Page里面设置
loadrunner 的Administration Page里面设置 1.Set LOGIN form's action tag to an error page.在登录的时候,传递一个动态变量 ...
- Hadoop基准测试
其实就是从网络上copy的吧,在这里做一下记录 这个是看一下有哪些测试方式: hadoop jar /opt/cloudera/parcels/CDH-5.3.6-1.cdh5.3.6.p0.11/ ...
- 【Java】java.lang.NullPointerException的两个原因
自己写程序时出现过 java.lang.NullPointerException错误的一些原因 (1)自己建立了一个数组,但每个数组元素没单独初始化(单独new一个新对象). (2)在进行if (ar ...
- Oracle数据库的基本查询
本文用的是Oracle 10g数据库,利用PL/SQL Developer的集成开发环境(安装可以自行百度) Oracle数据库 ---> 数据库实例 ---> 表空间(逻辑单位)( ...
- 海康威视 - 萤石云开放平台 js 版
开放平台 https://open.ys7.com/mobile/download.html API http://open.ys7.com/doc/zh/uikit/uikit_javascript ...