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

题意:

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;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值