题目链接:点击查看

题目大意:输入 A , O , B 三个点的坐标,输出 K1 , K2 , K3 分别为角 AOB 四等分线上的点

题目分析:吐了吐了,这个题想到了一种解法,但是在实现的时候被高中的向量知识卡住了,要是这个题能过的话这次的红包应该能领不少呜呜呜

说回题目,借题目的图一用:

为了方便讲解,就将三条四等分线从左到右称为 XP , XC , XQ ,其中点 O 被我替换成了点 X

一开始想过可以求出角 AOB 的大小,然后除以四,每次将直线 XA 沿着点 X 旋转这么个角度就行了,不得不说思路很好,实现很难,放弃

接下来就想,既然是四等分点,求两次角平分线不就行了,那么我们可以先求出 XA 和 XB 的角平分线 XC ,然后再求出 XC 和 XA 的角平分线就是 XP 了,同理求出 XQ ,有了这个三个四等分线的直线方程,再令其与直线 AB 求交点,求出来的就是答案了

求角平分线有一种非常简单的方法,以 XA 和 XB 为例,可以先求出 XA 和 XB 代表的单位向量,根据向量的加法的特殊性质, XC 恰好就是 XA + XB ,这样一来题目就变的很简单了

好巧不巧,之前一直在用的 kuangbin 大牛的几何模板中,恰好有一个函数就是可以直接求单位向量的

需要注意的地方是,一开始是直线 XA ,其向量就是 ( OA - OX ) ,这里的 O 就是坐标原点

还有一点就是,直接这样求出来的 XC 是单位向量!!需要借助点 X 转换回 XC 这条直线才能进行后续操作,这里需要借助的知识就是,知道单位向量和直线上的一个点的坐标后如何得到直线方程,因为点 X 肯定在直线上的,所以点 X + XC 肯定也是在直线上,两点确定一条直线,这样直线得方程就确定好了

剩下的就是调用模板里的函数了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;const double eps = 1e-10;int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1;
}struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}void output(){printf("%.10f %.10f\n",x,y);}bool operator == (Point b)const{return sgn(x-b.x) == 0 && sgn(y-b.y) == 0;}bool operator < (Point b)const{return sgn(x-b.x)== 0?sgn(y-b.y)<0:x<b.x;}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉积double operator ^(const Point &b)const{return x*b.y - y*b.x;}//点积double operator *(const Point &b)const{return x*b.x + y*b.y;}//返回长度double len(){return hypot(x,y);//库函数}//返回两点的距离double distance(Point p){return hypot(x-p.x,y-p.y);}Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}Point operator *(const double &k)const{return Point(x*k,y*k);}Point operator /(const double &k)const{return Point(x/k,y/k);}//`化为长度为r的向量`Point trunc(double r){double l = len();if(!sgn(l))return *this;r /= l;return Point(x*r,y*r);}
};struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;}bool operator ==(Line v){return (s == v.s)&&(e == v.e);}void adjust(){if(e < s)swap(s,e);}//求线段长度double length(){return s.distance(e);}//`点和直线关系`//`1  在左侧`//`2  在右侧`//`3  在直线上`int relation(Point p){int c = sgn((p-s)^(e-s));if(c < 0)return 1;else if(c > 0)return 2;else return 3;}// 点在线段上的判断bool pointonseg(Point p){return sgn((p-s)^(e-s)) == 0 && sgn((p-s)*(p-e)) <= 0;}//`两向量平行(对应直线平行或重合)`bool parallel(Line v){return sgn((e-s)^(v.e-v.s)) == 0;}//`两线段相交判断`//`2 规范相交`//`1 非规范相交`//`0 不相交`int segcrossseg(Line v){int d1 = sgn((e-s)^(v.s-s));int d2 = sgn((e-s)^(v.e-s));int d3 = sgn((v.e-v.s)^(s-v.s));int d4 = sgn((v.e-v.s)^(e-v.s));if( (d1^d2)==-2 && (d3^d4)==-2 )return 2;return (d1==0 && sgn((v.s-s)*(v.s-e))<=0) ||(d2==0 && sgn((v.e-s)*(v.e-e))<=0) ||(d3==0 && sgn((s-v.s)*(s-v.e))<=0) ||(d4==0 && sgn((e-v.s)*(e-v.e))<=0);}//`直线和线段相交判断`//`-*this line   -v seg`//`2 规范相交`//`1 非规范相交`//`0 不相交`int linecrossseg(Line v){int d1 = sgn((e-s)^(v.s-s));int d2 = sgn((e-s)^(v.e-s));if((d1^d2)==-2) return 2;return (d1==0||d2==0);}//`两直线关系`//`0 平行`//`1 重合`//`2 相交`int linecrossline(Line v){if((*this).parallel(v))return v.relation(s)==3;return 2;}//`求两直线的交点`//`要保证两直线不平行或重合`Point crosspoint(Line v){double a1 = (v.e-v.s)^(s-v.s);double a2 = (v.e-v.s)^(e-v.s);return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));}//点到直线的距离double dispointtoline(Point p){return fabs((p-s)^(e-s))/length();}//点到线段的距离double dispointtoseg(Point p){if(sgn((p-s)*(e-s))<0 || sgn((p-e)*(s-e))<0)return min(p.distance(s),p.distance(e));return dispointtoline(p);}//`返回线段到线段的距离`//`前提是两线段不相交,相交距离就是0了`double dissegtoseg(Line v){return min(min(dispointtoseg(v.s),dispointtoseg(v.e)),min(v.dispointtoseg(s),v.dispointtoseg(e)));}
};int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);Point A,B,X;A.input(),X.input(),B.input();Point OA=(A-X).trunc(1);Point OB=(B-X).trunc(1);Point OC=(OA+OB).trunc(1);Point OP=OA+OC;Point OQ=OB+OC;Line AB(Line(A,B));AB.crosspoint(Line(OP+X,X)).output();AB.crosspoint(Line(OC+X,X)).output();AB.crosspoint(Line(OQ+X,X)).output();return 0;
}

牛客 - 四等分的角度(几何)相关推荐

  1. 牛客练习赛46 A 华华教奕奕写几何 (简单数学)

    链接:https://ac.nowcoder.com/acm/contest/894/A 来源:牛客网 华华教奕奕写几何 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K ...

  2. 【数学几何】四等分的角度

    题目:四等分的角度 题目传送门 下图是我对这道题的理解,我自己给他起了个名字,嘿嘿:构造菱形找特殊点法 重要思想已在图中做出展示,上代码: #include<iostream> #incl ...

  3. 2021牛客寒假算法基础集训营1

    2021牛客寒假算法基础集训营1 A. 串(线性DP) B. 括号(构造) E.三棱锥之刻(几何) F. 对答案一时爽(签到) I. 限制不互素对的排列(构造) J. 一群小青蛙呱蹦呱蹦呱 A. 串( ...

  4. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)

    题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...

  5. 数据、运营相关试题(二)【牛客网:京东2019春招产品运营类试卷】

    试题来源:牛客网 试题答案仅供参考.其中前半部分偏向产品运营类试题,后半部分偏向综合测试类试题. 数据.运营相关内容,一起好好学习,天天向上吧! 数据.运营相关案例问答题(一)[牛客网:数据分析试题广 ...

  6. 牛客华为机试-查找排序

    前言:java编写,代码尽可能带注释,部分题目附上解题思路.力求方便,所以不写如有错误,请指出,谢谢. 查找排序 1.百钱买百鸡问题 2.统计每个月兔子总数 3.查找组成一个偶数最接近的两个素数 4. ...

  7. 大数据与云计算——牛客网大数据面试问题总结

    本文是个人从牛客网中的大数据的面试的面经中筛选出来与大数据的的相关的面试的问题:包括以下的技术栈: Flume Zookeeper Hbase Hive Hadoop  Spark Flink  HD ...

  8. 大数据开发(牛客)面试被问频率最高的几道面试题

    Hadoop 一.HDFS文件写入和读取过程 可灵活回答: 1)HDFS读写原理(流程) 2)HDFS上传下载流程 3)讲讲(介绍下)HDFS 4)HDFS存储机制 问过的一些公司: 阿里×3,阿里社 ...

  9. 数据、运营相关案例问答题(一)【牛客网:数据分析试题广场】

    试题来源:牛客网 回答仅代表个人看法,欢迎交流评论留言,有不正确的地方请多指教~~ 数据.运营相关内容,一起好好学习,天天向上吧! 数据.运营相关案例问答题(一)[牛客网:数据分析试题广场] 数据.运 ...

最新文章

  1. 神经网络中参数量parameters和FLOPs计算
  2. Windows Server 2008 和 Windows Vista 结合的功能更加强大
  3. linux如何查看归档文件,linux基本命令:文本搜索,拷贝文件,移动文件,归档管理,压缩解压缩文件,查看命令位置...
  4. 20nian5yue最热门的Python开源项目
  5. mysql 互斥_MySql中互斥量mutex的实现
  6. boost::geometry::detail::overlay::approximately_equals用法的测试程序
  7. 官宣|Apache Flink 1.13.0 正式发布,流处理应用更加简单高效!
  8. [Vue]组件——通过$emit为组件自定义事件
  9. Apache FTPClient操作文件上传下载及公共类
  10. 资深前端开发工程师分享:关于前端学习路线的一些建议
  11. ios 持续获取定位 高德地图_iOS开发-- 高德地图的接入使用(1)定位
  12. winhex搜索中的偏移问题?请高手指点
  13. C++黑客编程揭秘与防范-前言
  14. TabHost详细解析
  15. 【基于Pytorch的手写汉字识别】
  16. mro列表_方法解析顺序(MRO)
  17. JAVA实现类泡泡屏保效果
  18. websocket错误码盘点
  19. 17zwd获得17网商品详情接口 API 返回值说明,API接口获取方案
  20. XML Schema学习札记(1)——基础总览

热门文章

  1. php 数组 组成新数组,PHP让数组中相同值的组组成新的数组详解
  2. linux 的内核参数优化,linux 内核参数优化
  3. c 添加mysql表单的一行数据类型_MySQL数据库基础
  4. TCP/IP的七层负载均衡
  5. 静态工厂配置bean
  6. spring项目概念-BeanFactoryApplicationContext
  7. Oracle之垂直水平分库分表(二)
  8. php自定义框架,「php 框架」自定义php框架(篇一) - seo实验室
  9. postman cookie设置_是时候抛弃Postman了,因为REST Client更香
  10. dockerfile mysql例子_简单的Dockerfile书写(实例!!!)