uva 11178 Morley's Theorem 计算几何

Morleys theorem states that that the linestrisecting the angles of an arbitrary planetriangle meet at the vertices of an equilateraltriangle. For example in the figurebelow thetri-sectors of angles A, B and Chas intersected and created an equilateraltriangle DEF.Of course the theorem has various generalizations,in particular if all of thetrisectorsare intersected one obtains fourother equilateral triangles. But in theoriginal theorem only tri-sectors nearestto BC are allowed to intersect to get pointD, tri-sectors nearest to CA are allowed to intersect point E and tri-sectors nearest to AB are intersectedto get point F. Trisector like BD and CE are not allowed to intersect. So ultimately we get onlyone equilateral triangle DEF. Now your task is to find the Cartesian coordinates of D, E and F giventhe 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 XA, YA, XB, YB, XC , YC . This six
integers actually indicates that the Cartesian coordinates of point A, B and C are (XA, YA),(XB, YB)
and (XC , YC ) respectively. You can assume that the area of triangle ABC is not equal to zero, 0 ≤
XA, YA, XB, YB, XC , YC ≤ 1000 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 XD, YD, XE, YE, XF , YF separated by a single space. These six floating-point actually means
that the Cartesian coordinates of D, E and F are (XD, YD),(XE, YE) ,(XF , YF ) respectively. Errors
less than 10−5 will be accepted.
Sample Input
2
1 1 2 2 1 2
0 0 100 0 50 50
Sample Output

1.316987 1.816987 1.183013 1.683013 1.366025 1.633975

56.698730 25.000000 43.301270 25.000000 50.000000 13.397460

记录代码:

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define siz 1000
using namespace std;
struct point{
    double x,y;
    point(double x,double y) :x(x),y(y) {}
};
typedef point Vector;
Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x,A.y-B.y);}
Vector operator * (Vector A,double p) {return Vector(A.x*p,A.y*p);}
Vector operator / (Vector A,double p) {return Vector(A.x/p,A.y/p);}
double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}
double Length (Vector A) {return sqrt(Dot(A,A));}
double Angle (Vector A,Vector B) {return acos(Dot(A,B)/Length(A)/Length(B));}
double Cross (Vector A,Vector B) {return A.x*B.y-A.y*B.x;}
Vector Rotate(Vector A,double rad){
   return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}
point GetLine(point P,Vector v,point Q,Vector w){
     Vector u=P-Q;
     double t=Cross(w,u)/Cross(v,w);
     return P+v*t;
}
int ax,ay,bx,by,cx,cy;
double dx,dy,ex,ey,fx,fy,ang_ABC,ang_BAC,ang_ACB;
point A(0,0),B(0,0),C(0,0),D(0,0),E(0,0),F(0,0);
Vector BD(0,0),BF(0,0),AE(0,0),AF(0,0),CE(0,0),CD(0,0);
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        scanf("%d %d %d %d %d %d",&ax,&ay,&bx,&by,&cx,&cy);
        A.x=ax,A.y=ay,  B.x=bx,B.y=by,  C.x=cx,C.y=cy;
        ang_ABC=Angle(A-B,C-B);
        ang_ACB=Angle(A-C,B-C);
        ang_BAC=Angle(B-A,C-A);
        //---D
        BD=Rotate(C-B,ang_ABC/3);
        CD=Rotate(B-C,-ang_ACB/3);
        D=GetLine(C,CD,B,BD);
        //--E
        CE=Rotate(A-C,ang_ACB/3);
        AE=Rotate(C-A,-ang_BAC/3);
        E=GetLine(C,CE,A,AE);
        //--F
        BF=Rotate(A-B,-ang_ABC/3);
        AF=Rotate(B-A,ang_BAC/3);
        F=GetLine(B,BF,A,AF);
        printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",D.x,D.y,E.x,E.y,F.x,F.y);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值