首页 > 其他分享 >UVA 11178 Morley's Theorem 题解

UVA 11178 Morley's Theorem 题解

时间:2023-11-17 11:35:36浏览次数:413  
标签:return Point double 11178 ret Vector 题解 UVA 向量

计算几何

Link

UVA 11178 Morley's Theorem

Question

image.png

Morley 定理是这样的,作三角形 ABC 每个内角的三等分线,相交成三角形 DEF,则 DEF 是等边三角形

给出 \(A,B,C\) 坐标,求 \(D,E,F\) 坐标

Solution

其实是一道计算几何板子题只需要计算 \(\angle ABC\) 的值 \(a\),然后把 \(BC\) 逆时针旋转 \(a/3\) 就能得到 \(BD\) 同理能得到直线 \(CD\) 就能求得交点 \(D\)

Code

#include<bits/stdc++.h>
using namespace std;

struct Point{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){};
};
typedef Point Vector;

Vector read_point(){
    Point ret;
    cin>>ret.x>>ret.y;
    return ret;
}

Vector operator + (Vector A,Vector B) {return Vector{A.x+B.x,A.y+B.y};} //向量+向量=向量
Vector operator - (Point A,Point 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};} //向量/数=向量


const double eps=1e-9;
int dcmp(double x){if(fabs(x)<eps) return 0;else return x<0?-1:1;}
bool operator ==(const Point &a,const Point &b){
    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0;
}

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;}

//向量逆时针旋转 rad
Vector Rotate(Vector A,double rad){return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));} //rad是弧度

//求两条直线的交点
Point GetLineInersection(Point P,Vector v,Point Q,Vector w){
    Vector u=P-Q;
    double t=Cross(w,u)/Cross(v,w);
    return P+v*t;
}


Point getD(Point A,Point B,Point C){
    Vector v1=C-B;
    double a1=Angle(A-B,v1);
    v1=Rotate(v1,a1/3);
    
    Vector v2=B-C;
    double a2=Angle(A-C,v2);
    v2=Rotate(v2,-a2/3);

    return GetLineInersection(B,v1,C,v2);
}

int main(){
    // freopen("11178.in","r",stdin);
    // freopen("11178.out","w",stdout);
    Point A,B,C,D,E,F;
    int T;
    scanf("%d",&T);
    while(T--){
        A=read_point();
        B=read_point();
        C=read_point();
        D=getD(A,B,C);
        E=getD(B,C,A);
        F=getD(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;
}

标签:return,Point,double,11178,ret,Vector,题解,UVA,向量
From: https://www.cnblogs.com/martian148/p/17838263.html

相关文章

  • 【题解 CF1628D2】 Game on Sum
    GameonSum(HardVersion)题面翻译Alice和Bob正在玩一个游戏,游戏分为\(n\)个回合,Alice和Bob要轮流对一个数\(x\)进行操作,已知这个数初始值是\(0\)。具体每个回合的行动规则如下:Alice选择一个在区间\([0,k]\)之间的实数\(t\)。Bob可以选择让\(x\)变成\(......
  • A2OJ Ladder 32 简要题解
    https://earthshakira.github.io/a2oj-clientside/server/Ladder32.html只记录Difficultylevel>=8的。有很多题是口胡的。写了的会标注提交记录。还有些很久以前写过的题就懒得搬提交记录了。任何的*都表示该段的后续部分未能想出并查看了题解。159.CF372DChoosingSub......
  • 【题解 ABC180F】 Unbranched
    [ABC180F]Unbranched题面翻译求\(N\)个点,\(M\)条边且满足以下条件的图的数量:图中无自环;每个点度数最多为\(2\);连通块大小的最大值恰好为\(L\)。答案对\(10^9+7\)取模。\(2\leN\le300\),\(1\leM,L\leN\)。题目描述頂点にラベルが付き辺にはラベルが付い......
  • 题解 P7972【[KSN2021] Self Permutation】
    怎么其他两篇题解都是\(O(n\logn)\)的,来发一个\(O(n)\)做法,当考前复习了。对原序列建出小根笛卡尔树,节点编号与原序列中的下标相同。记\(T_u\)表示以\(u\)为根的子树,\(lc(u),rc(u)\)分别表示\(u\)的左儿子和右儿子。设\(f_u\)表示删除若干\(T_u\)中的点(可以不删......
  • [ARC106F] Figures 题解
    题意给定\(N\)个带有若干洞的节点,其中第\(i\)个点上有\(d_i\)个洞。先可以在两个不同的节点的洞之间连边,一个洞最多连一条边,求使得最终形成的图是一棵树的方案数,对\(998244353\)取模。洞之间相互区分,两个方案不同当且仅当存在一条边在两个方案中的连的洞不同。\(2\l......
  • P9400 题解
    blog。很naive的题,写这篇题解,主要是现有题解都用的线段树/平衡树,让我感到很难绷。一眼DP。\(dp_{i,j}\)表示前\(i\)个宿舍,现在有连续\(j\)个灯亮大于\(B\),方案数。\(dp_{i,0}=\max(\min(B,r_i)-l_i+1,0)\cdot\sum\limits_{j=0}^{A-1}dp_{i-1,j}\)。\(dp_{i......
  • CF8E 题解
    blog。抽象意义上单杀了。首先第一位必定为\(0\),然后取反串就不用去考虑了。\(n\le50\),考虑爆搜。搜整个串的前一半(设半长为\(M=\left\lfloor\dfracn2\right\rfloor\),前一半的串在十进制下值为\(v\)),后半段的数量可以计算:整个串最后一位是\(0\),只需满足逆序串。\(n\)为......
  • P7701 [CCC2014] 提前交卷 题解
    目录DescriptionSolutionCodeDescription在一个教室里有\(n\)排座位,每排有\(6\)个,从左至右标号分别为ABCDEF,其中C和D中有过道,通往教室前端和后端的两个房间,每个房间最开始没有人,每个座位上开始都有人。有\(m\)个不同的学生会依次提前交卷,先从这一排走到过道上,在从......
  • 鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决
    问题:拖动时会触发圆球的点击事件解决鼠标拖动盒子时,将moving设为true意为正在拖动盒子,此时将class="move"遮挡容器展示在悬浮球上层,以覆盖悬浮球,此时也就不存在触发悬浮球点击事件的冲突了;鼠标拖动完盒子弹起时再将 moving设为false意为不在拖动盒子(遮挡容器class=......
  • C++调用Python3实战,和PyImport_ImportModule返回NULL问题解决
    LinuxC++调用Python3入门准备以下面的目录结构演示如何在LinuxC/C++调用python3。|--hello.py|--main.cpp|--CMakeLists.txt hello.py:python的脚本,里面有2个函数main.cpp:c++函数CMakeLists.txt:Cmake文件,生成makefilepython脚本示例python脚本hello.py内容如下,......