您的位置:首页 > 其它

Uva 11178 Morley's Theorem (几何+模拟)

2017-04-21 07:48 393 查看

题意:

Morley定理是这样的:作三角形ABC每个内角的三等分线,相交成三角形DEF,则DEF是等边三角形,如下图所示。



你任务是根据A,B,C 3个点的位置确定D、E、F 3个点的位置。

输入格式:

输入第一行为测试数据组数T(T<=5000),每组数据包含一行6个整数xA,yA,xB,yB,xC,yC,即A,B,C 3个点的坐标。输入保证三角形A、B、C的面积非0。所有坐标为不超过1000的非负整数。A,B,C按照逆时针顺序排列。

输出格式

对于每组数据输出6个实数xD,yD,xE,yE,xF,yF。

分析

计算几何入门题,几何纯模拟,没有算法可言,只是可以拿来写一下代码。用到的技巧有向量旋转,线段相交,求向量夹角等基础知识。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int T;

struct Data{
double x, y;
Data() {}
Data(double x, double y):x(x), y(y) {}
}A, B, C, D, E, F;

Data Rot(Data A, double rad){
return Data(A.x*cos(rad) - A.y*sin(rad), A.x*sin(rad) + A.y*cos(rad));
}

double Dot(Data A, Data B){
return A.x * B.x + A.y * B.y;
}

double Get_len(Data A){
return sqrt(Dot(A, A));
}

double Angle(Data A, Data B){
return acos(Dot(A, B) / Get_len(A) / Get_len(B));
}
Data operator + (Data A, Data B){return Data(A.x + B.x, A.y + B.y);}
Data operator - (Data A, Data B){return Data(A.x - B.x, A.y - B.y);}
Data operator * (double A, Data B){return Data(A * B.x, A * B.y);}
Data operator / (Data A, double B){return Data(A.x/B, A.y/B);}

double Det(Data A, Data B){
return A.x * B.y - A.y * B.x;
}
Data Cross(Data A, Data B, Data C, Data D){
double x = Det(A - C, A - D), y = Det(B - D, B - C);
return (x * B + y * A) / (x + y);
}

Data Get(Data A, Data B, Data C){
Data v1 = C - B;
double a1 = Angle(A - B, v1);
v1 = Rot(v1, a1 / 3);

Data v2 = B - C;
double a2 = Angle(A - C, v2);
v2 = Rot(v2, -a2 / 3);

return Cross(B, B+v1, C, C+v2);
}

int main(){

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 = Get(A, B, C);
E = Get(B, C, A);
F = Get(C, A, B);
printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", D.x, D.y, E.x, E.y, F.x, F.y);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: